如何在Swift中使用AVPlayerViewController(AVKit)播放video

如何在Swift中使用AV Kit Player View Controller播放video?

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

Swift 3.x – 4.x

必要: 导入AVKit导入AVFoundation

即使使用AVPlayer也需要AVFoundation框架

如果你想使用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() } 

或者只是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() 

最好把这段代码放到方法中: override func viewDidAppear(_ animated:Bool)或之后的某处。


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

或者只是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]; 

试试这个,绝对适用于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() 

尝试这个

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

目标c

这只适用于Xcode 7

转到.h文件并导入AVKit/AVKit.hAVFoundation/AVFoundation.h 。 然后去.m文件并添加以下代码:

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

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

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

我有一个播放button来处理button水龙头。

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

我添加了一个观察者监听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) } 

video/audio播放结束后,重置button图像和通知

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

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

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

不起作用(空矩形…)

这工作:

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

相同的url…

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