本文总结了iOS中最常见的视频播放方法,不同的方法都各具特点,我希望能够总结它们的不同,方便在开发中选择合适的技术方案。
Apple为我们提供了多种方法来实现视频播放,包括MPMoviePlayerController,MPMoviePlayerViewController,AVPlayer,AVPlayerViewController等。而值得注意的是,上述的MPMoviePlayerController与MPMoviePlayerViewController在iOS9.0之后被弃用。虽说如此,这还是将它们的用法总结了一下,下面我们简单来了解一下四种播放方式的区别:
iOS播放视频.png
一、MPMoviePlayerController
1.播放视频
MPMoviewPlayerController继承于NSObject,使用它播放视频需要将其自带的视频View添加到视图控制器的View上才能显示视频,使用步骤如下:
第一步:引用MediaPlayer框架,声明视图控制器属性PlayerController
#import
@property(nonatomic,strong)MPMoviePlayerController *playerController;
//第二步:获取视频路径,创建播放器
//本地视频路径
NSString* localFilePath=[[NSBundle mainBundle]pathForResource:@"不能说的秘密" ofType:@"mp4"];
NSURL *localVideoUrl = [NSURL fileURLWithPath:localFilePath];
//网络视频路径
NSString *webVideoPath = @"http://api.junqingguanchashi.net/yunpan/bd/c.php?vid=/junqing/1115.mp4";
NSURL *webVideoUrl = [NSURL URLWithString:webVideoPath];
self.playerController =[[MPMoviePlayerController alloc]initWithContentURL:webVideoUrl];
//第三步:设置Frame将播放器View添加到视图控制器View上
self.playerController.view.frame = CGRectMake(0, 10, kDeviceWidth, 300);
[self.view addSubview: self.playerController.view];
//第四步:设置播放器属性
//设置控制面板风格:无,嵌入,全屏,默认
self.playerController.controlStyle = MPMovieControlStyleDefault;
//设置是否自动播放(默认为YES)
self.playerController.shouldAutoplay = NO;
//设置播放器显示模式,类似于图片的处理,设置Fill有可能造成部分区域被裁剪
self.playerController.scalingMode = MPMovieScalingModeAspectFit;
//设置重复模式
self.playerController.repeatMode = MPMovieRepeatModeOne;
//第五步:播放视频
//播放前的准备,会中断当前正在活跃的音频会话
[ self.playerController prepareToPlay];
//播放视频,设置了自动播放之后可以不调用此方法
//[ self.playerController play];
//第六步:在退出界面的时候,关闭播放器,移除通知
- (void)dealloc{
//当前视图控制器pop之后并不会关闭播放,需要手动关闭
[self.playerController stop];
self.playerController = nil;
//移除播放器相关的通知
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
2.视频播放相关的通知
MPMoviePlayerController有关视频播放的很多状态控制都是通过通知完成的,尤其是播放在线视频的时候,我们不仅监控视频加载是否成功,也会监控是视频缓存进度等。这里演示一些常用的通知如下:
//关于通知的使用(还有很多通知可以监听,可查看SDK)
NSNotificationCenter *notificaionCenter = [NSNotificationCenter defaultCenter];
//监听播放器状态的变化
[notificaionCenter addObserver:self
selector:@selector(playerStateChanged:)
name:MPMoviePlayerPlaybackStateDidChangeNotification
object:nil];
//监听播放完成
[notificaionCenter addObserver:self
selector:@selector(playerFinished) name:MPMoviePlayerPlaybackDidFinishNotification
object:nil];
//监听切换到全屏
[notificaionCenter addObserver:self
selector:@selector(palyerChangeFullScreen) name:MPMoviePlayerDidEnterFullscreenNotification
object:nil];
//监听截屏操作完成
[notificaionCenter addObserver:self
selector:@selector(playerCaptureFinished:) name:MPMoviePlayerThumbnailImageRequestDidFinishNotification
object:nil];
#pragma mark - 监听通知的响应方法
//播放状态变化,注意播放完成时的状态是暂停
- (void)playerStateChanged:(NSNotification *)notificaion{
switch (self.playerController.pl