可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
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() } }