Comment lire une vidéo avec AVPlayerViewController (AVKit) dans Swift


164

Comment lire une vidéo avec AV Kit Player View Controller dans Swift?

override func viewDidLoad() {
        super.viewDidLoad()
        let videoURLWithPath = "http://****/5.m3u8"
        let videoURL = NSURL(string: videoURLWithPath)
        playerViewController = AVPlayerViewController()

        dispatch_async(dispatch_get_main_queue()) {
            self.playerViewController?.player = AVPlayer.playerWithURL(videoURL) as AVPlayer
        }
    }

Pour utiliser AVPlayer(n'a pas les contrôles), voir cette réponse .
Suragch

Réponses:


532

Swift 3.x - 5.x

Nécessaire: importer AVKit , importer AVFoundation

Le framework AVFoundation est nécessaire même si vous utilisez AVPlayer

Si vous souhaitez utiliser AVPlayerViewController :

let videoURL = URL(string: "https://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4")
let player = AVPlayer(url: videoURL!)
let playerViewController = AVPlayerViewController()
playerViewController.player = player
self.present(playerViewController, animated: true) {
    playerViewController.player!.play()
}

ou juste AVPlayer :

let videoURL = URL(string: "https://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4")
let player = AVPlayer(url: videoURL!)
let playerLayer = AVPlayerLayer(player: player)
playerLayer.frame = self.view.bounds
self.view.layer.addSublayer(playerLayer)
player.play()

Il est préférable de mettre ce code dans la méthode: override func viewDidAppear (_ animated: Bool) ou quelque part après.


Objectif c

AVPlayerViewController :

NSURL *videoURL = [NSURL URLWithString:@"https://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4"];
AVPlayer *player = [AVPlayer playerWithURL:videoURL];
AVPlayerViewController *playerViewController = [AVPlayerViewController new];
playerViewController.player = player;
[self presentViewController:playerViewController animated:YES completion:^{
  [playerViewController.player play];
}];

ou juste AVPlayer :

NSURL *videoURL = [NSURL URLWithString:@"https://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4"];
AVPlayer *player = [AVPlayer playerWithURL:videoURL];
AVPlayerLayer *playerLayer = [AVPlayerLayer playerLayerWithPlayer:player];
playerLayer.frame = self.view.bounds;
[self.view.layer addSublayer:playerLayer];
[player play];

@pikis Merci pour l'exemple de code. Étrange, nous avons essayé le AVPlayerController tel qu'écrit et obtenons un SIGABRT sur: [self presentViewController: playerViewController animated: YES completion: nil];
Praxiteles

@Praxiteles, cela fonctionne sur iOS8 ou version ultérieure, c'est peut-être la raison.
pkis

8
Importation également requise AVFoundation pour moi
Rich Fox

1
@ Nick89, AVPlayer fonctionne correctement avec des liens directs, mais si vous devez utiliser des services comme YouTube, Vimeo, etc. (qui ont des liens indirects), vous devez utiliser leur propre bibliothèque ou SDK. (par exemple pour YouTube: guide ).
pkis

2
L'ordre des instructions est important, aussi j'avais besoin d'importer AVKit
htafoya

30

Essayez ceci, fonctionne certainement pour Swift 2.0

 let player = AVPlayer(URL: url)
    let playerController = AVPlayerViewController()

    playerController.player = player
    self.addChildViewController(playerController)
    self.view.addSubview(playerController.view)
    playerController.view.frame = self.view.frame

    player.play()  

1
Merci. Le addChildViewController l'a intégré exactement ce que je veux. :)
SDW

1
L'intégration fonctionne parfaitement, mais comment allez-vous gérer les changements d'orientation? Disons que le joueur prend la moitié de l'écran en portrait et que le contrôleur de vue ne prend en charge que le portrait, mais la vidéo peut être vue en portrait comme la plupart des applications le font e .. youtube, vimeo etc.
Abid Hussain

Remarque: addChildViewController est nécessaire. J'ai essayé sans ça et ça marche presque - ça joue une fois, ça se développe en plein écran. Mais il ne joue plus ou ne sort pas du mode plein écran. Un contrôleur de vue enfant est donc nécessaire.
n13

self.addChildViewController(playerController)est maintenant self.addChild(playerController)fyi
Marquis103

12

Essaye ça

var player:AVPlayer!
var avPlayerLayer:AVPlayerLayer = AVPlayerLayer(player: player)
avPlayerLayer.frame = CGRectMake(your frame)
self.view.layer .addSublayer(avPlayerLayer)
var steamingURL:NSURL = NSURL(string:playerURL)
player = AVPlayer(URL: steamingURL)
player.play()

Lorsque
j'exécute

@Oneperson vous définissez le cadre avPlayerLayer?
Ramesh

1
@Oneperson ok set this avPlayerLayer.frame = CGRectMake (50,50,100,100)
Ramesh

code var player: AVPlayer! var playerItem: AVPlayerItem !; var avPlayerLayer: AVPlayerLayer = AVPlayerLayer (player: player) avPlayerLayer.frame = CGRectMake (50,50,100,100) self.view.layer .addSublayer (avPlayerLayer) let videoURLWithPath = "http: //*****/45.m3u8" var steamingURL: NSURL = NSURL (string: videoURLWithPath) player = AVPlayer (URL: steamingURL) player.play () code
orazz

@Oneperson edge.tolkun.tv/45.m3u8 ne fonctionne pas. pouvez-vous donner votre URL complète
Ramesh

11

Code source complet de Swift 3.0:

import UIKit
    import AVKit
    import AVFoundation

    class ViewController: UIViewController,AVPlayerViewControllerDelegate
    {
        var playerController = AVPlayerViewController()


        @IBAction func Play(_ sender: Any)
        {
            let path = Bundle.main.path(forResource: "video", ofType: "mp4")

            let url = NSURL(fileURLWithPath: path!)

            let player = AVPlayer(url:url as URL)

            playerController = AVPlayerViewController()


            NotificationCenter.default.addObserver(self, selector: #selector(ViewController.didfinishplaying(note:)),name:NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: player.currentItem)

            playerController.player = player

            playerController.allowsPictureInPicturePlayback = true

            playerController.delegate = self

            playerController.player?.play()

            self.present(playerController,animated:true,completion:nil)
        }

        func didfinishplaying(note : NSNotification)
        {
            playerController.dismiss(animated: true,completion: nil)
            let alertview = UIAlertController(title:"finished",message:"video finished",preferredStyle: .alert)
            alertview.addAction(UIAlertAction(title:"Ok",style: .default, handler: nil))
            self.present(alertview,animated:true,completion: nil)
        }


        func playerViewController(_ playerViewController: AVPlayerViewController, restoreUserInterfaceForPictureInPictureStopWithCompletionHandler completionHandler: @escaping (Bool) -> Void) {
                let currentviewController =  navigationController?.visibleViewController

                if currentviewController != playerViewController
                {
                    currentviewController?.present(playerViewController,animated: true,completion:nil)
                }


            }
    }

Bonjour ronak, merci d'avoir présenté les observateurs rapidement pour gérer la fin de la vidéo !! Je n'ai pas réussi à le faire fonctionner en créant l'AVPlayerViewController avec le code fourni par la réponse au-dessus du vôtre (premier extrait de code), qu'est-ce qui est différent? Qu'est-ce que j'ai manqué ou dois mettre en œuvre pour faire fonctionner l'observateur dans vos méthodes?
Manu

6

Objectif c

Cela ne fonctionne que dans Xcode 7

Accédez au .hfichier et importez AVKit/AVKit.het AVFoundation/AVFoundation.h. Ensuite, allez dans le .mfichier et ajoutez ce code:

NSURL *url=[[NSBundle mainBundle]URLForResource:@"arreg" withExtension:@"mp4"];
AVPlayer *video=[AVPlayer playerWithURL:url];
AVPlayerViewController *controller=[[AVPlayerViewController alloc]init];
controller.player=video;
[self.view addSubview:controller.view];
controller.view.frame=self.view.frame;
[self addChildViewController:controller];
[video play];

4

Utilisation de MPMoviePlayerController:

 import UIKit
 import MediaPlayer

 class ViewController: UIViewController {

     var streamPlayer : MPMoviePlayerController =  MPMoviePlayerController(contentURL: NSURL(string:"video url here"))
     override func viewDidLoad() {
         super.viewDidLoad()
         streamPlayer.view.frame = self.view.bounds
         self.view.addSubview(streamPlayer.view)

         streamPlayer.fullscreen = true
         // Play the movie!
         streamPlayer.play()
}
}

Utilisation d'AVPlayer:

import AVFoundation

var playerItem:AVPlayerItem?
var player:AVPlayer?

override func viewDidLoad() {
        super.viewDidLoad() 
      let url = NSURL(string: "url of the audio or video") 
      playerItem = AVPlayerItem(URL: url!)
      player=AVPlayer(playerItem: playerItem!)
      let playerLayer=AVPlayerLayer(player: player!)
      playerLayer.frame=CGRectMake(0, 0, 300, 50)
      self.view.layer.addSublayer(playerLayer)
}

J'ai un bouton de lecture pour gérer les pressions sur les boutons.

playButton.addTarget(self, action: "playButtonTapped:", forControlEvents: .TouchUpInside)

func playButtonTapped(sender: AnyObject) {
        if player?.rate == 0
        {
            player!.play()
            playButton.setImage(UIImage(named: "player_control_pause_50px.png"), forState: UIControlState.Normal)
        } else {
            player!.pause()
            playButton.setImage(UIImage(named: "player_control_play_50px.png"), forState: UIControlState.Normal)
        }
    }

J'ai ajouté un observateur à l'écoute d'AVPlayerItemDidPlayToEndTimeNotification.

override func viewWillAppear(animated: Bool) {
        NSNotificationCenter.defaultCenter().addObserver(self, selector: "finishedPlaying:", name: AVPlayerItemDidPlayToEndTimeNotification, object: playerItem)
    }

override func viewWillDisappear(animated: Bool) {
        NSNotificationCenter.defaultCenter().removeObserver(self)
    }

Lorsque la lecture vidéo / audio est terminée, réinitialisez l'image du bouton et la notification

  func finishedPlaying(myNotification:NSNotification) {
        playButton.setImage(UIImage(named: "player_control_play_50px.png"), forState: UIControlState.Normal)

        let stopedPlayerItem: AVPlayerItem = myNotification.object as! AVPlayerItem
        stopedPlayerItem.seekToTime(kCMTimeZero)
    }

2
MPMoviePlayerController est obsolète et nous ne devrions probablement plus l'utiliser.
Skywalker

pouvez-vous s'il vous plaît donner un exemple n'utilisant pas d'URL, par exemple en utilisant une vidéo locale.
nyxee

4

un bug (?!) dans iOS10 / Swift3 / Xcode 8?

if let url = URL(string: "http://devstreaming.apple.com/videos/wwdc/2016/102w0bsn0ge83qfv7za/102/hls_vod_mvp.m3u8"){
    let playerItem = AVPlayerItem(url: url)
    let player = AVPlayer(playerItem: playerItem)
    let playerLayer = AVPlayerLayer(player: player)
    playerLayer.frame=CGRect(x: 10, y: 10, width: 300, height: 300)
    self.view.layer.addSublayer(playerLayer)
}

ne fonctionne pas (rect vide ...)

cela marche:

if let url = URL(string: "http://devstreaming.apple.com/videos/wwdc/2016/102w0bsn0ge83qfv7za/102/hls_vod_mvp.m3u8"){

            let player = AVPlayer(url: url)
            let controller=AVPlayerViewController()
            controller.player=player
            controller.view.frame = self.view.frame
            self.view.addSubview(controller.view)
            self.addChildViewController(controller)
            player.play()
        }

Même URL ...


ajouter cette ligne: player.play()après: self.view.layer.addSublayer(playerLayer)et réessayer
orazz

4

Swift 3:

import UIKit
import AVKit
import AVFoundation

class ViewController: UIViewController {

    @IBOutlet weak var viewPlay: UIView!
    var player : AVPlayer?

    override func viewDidLoad() {
        super.viewDidLoad()

        let url : URL = URL(string: "http://static.videokart.ir/clip/100/480.mp4")!
        player = AVPlayer(url: url)
        let playerLayer = AVPlayerLayer(player: player)
        playerLayer.frame = self.viewPlay.bounds
        self.viewPlay.layer.addSublayer(playerLayer)

    }

    @IBAction func play(_ sender: Any) {
        player?.play()
    }

    @IBAction func stop(_ sender: Any) {
        player?.pause()
    }

}

Où dans votre réponse avez-vous utilisé AVPlayerViewController?
AnBisw

1

Cela a fonctionné pour moi dans Swift 5

Je viens d'ajouter un exemple de vidéo au projet à partir d' exemples de vidéos

Ajout de boutons d'action pour lire des vidéos à partir du site Web et du local avec l'exemple de code swift suivant

import UIKit
import AVKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        //TODO : Make Sure Add and copy "SampleVideo.mp4" file in project before play
    }

    @IBAction func playWebVideo(_ sender: Any) {

        guard let url = URL(string: "https://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4") else {
            return
        }
        // Create an AVPlayer, passing it the HTTP Live Streaming URL.
        let player = AVPlayer(url: url)
        let controller = AVPlayerViewController()
        controller.player = player
        present(controller, animated: true) {
            player.play()
        }
    }

    @IBAction func playLocalVideo(_ sender: Any) {

        guard let path = Bundle.main.path(forResource: "SampleVideo", ofType: "mp4") else {
            return
        }
        let videoURL = NSURL(fileURLWithPath: path)

        // Create an AVPlayer, passing it the local video url path
        let player = AVPlayer(url: videoURL as URL)
        let controller = AVPlayerViewController()
        controller.player = player
        present(controller, animated: true) {
            player.play()
        }
    }

}

0

Swift 5

  @IBAction func buttonPressed(_ sender: Any) {
    let videoURL = course.introductionVideoURL
    let player = AVPlayer(url: videoURL)
    let playerViewController = AVPlayerViewController()
    playerViewController.player = player

    present(playerViewController, animated: true, completion: {

        playerViewController.player!.play()
    })

// ici le cours comprend un fichier modèle, à l'intérieur j'ai donné l'url, donc j'appelle la fonction à partir du modèle en utilisant la fonction course.

// aussi introductionVideoUrl est une URL que j'ai déclarée à l'intérieur du modèle.

 var introductionVideoURL: URL

Vous pouvez également utiliser le code ci-dessous au lieu d'appeler la fonction à partir du modèle

Remplacez ce code

  let videoURL = course.introductionVideoURL

avec

  guard let videoURL = URL(string: "https://something.mp4) else {
        return

0
let videoUrl = //URL: Your Video URL

//Create player first using your URL
let yourplayer = AVPlayer(url: videoUrl)

//Create player controller and set it’s player
let playerController = AVPlayerViewController()
playerController.player = yourplayer


//Final step To present controller  with player in your view controller
present(playerController, animated: true, completion: {
   playerController.player!.play()
})

0

Swift 5.0

Amélioration de la réponse @ingconti. Cela a fonctionné pour moi.

 if let url = URL(string: "urUrlString"){
            let player = AVPlayer(url: url)
            let avController = AVPlayerViewController()
            avController.player = player
            // your desired frame
            avController.view.frame = self.view.frame
            self.view.addSubview(avController.view)
            self.addChild(avController)
            player.play()
        }

0

Swift 5+

Tout d'abord, vous devez définir 2 variables globalement dans votre contrôleur de vue.

var player: AVPlayer!
var playerViewController: AVPlayerViewController!

Ici, j'ajoute un joueur à une vue souhaitée.

@IBOutlet weak var playerView: UIView!

Ajoutez ensuite le code suivant à la méthode viewDidLoad .

let videoURL = URL(string: "videoUrl")
self.player = AVPlayer(url: videoURL!)
self.playerViewController = AVPlayerViewController()
playerViewController.player = self.player
playerViewController.view.frame = self.playerView.frame
playerViewController.player?.pause()
self.playerView.addSubview(playerViewController.view)

Si vous ne définissez pas globalement player et playerViewController , vous ne pourrez pas intégrer player.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.