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
        }
    }
orazz
la source
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];
pkis
la source
@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()  
Chetan Dobariya
la source
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()
Ramesh
la source
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)
                }


            }
    }
Ronak Patel
la source
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];
user6171720
la source
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)
    }
AG
la source
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 ...

ingconti
la source
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()
    }

}
Mohammad Razipour
la source
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()
        }
    }

}
swiftBoy
la source
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
Gulsan Borbhuiya
la source
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()
})
diliper
la source
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()
        }
RAM
la source
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.

Wimukthi Rajapaksha
la source