How to play video with AVPlayerViewController (AVKit) in Swift

匿名 (未验证) 提交于 2019-12-03 01:26:01

问题:

How do you play a video with AV Kit Player View Controller in 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         }     } 

回答1:

Swift 3.x - 4.x

Necessary: import AVKit, import AVFoundation

AVFoundation framework is needed even if you use AVPlayer

If you want to use 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() } 

or just 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() 

It's better to put this code into the method: override func viewDidAppear(_ animated: Bool) or somewhere after.


Objective-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:nil]; 

or just 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]; 


回答2:

Try this, definitely works for 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()   


回答3:

Try This

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() 


回答4:

Swift 3.0 Full source code:

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)                 }               }     } 


回答5:

Objective c

This only works in Xcode 7

Go to .h file and import AVKit/AVKit.h and AVFoundation/AVFoundation.h. Then go .m file and add this 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]; 


回答6:

a bug(?!) in 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) } 

does not work (empty rect...)

this works:

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()         } 

Same URL...



回答7:

Using 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() } } 

Using 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) } 

I have a play button to handle button tap.

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)         }     } 

I have added an observer listening for 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)     } 

When video/audio play is finished, reset button image and 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)     } 


回答8:

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()     }  } 


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!