视频播放
一.视频播放介绍(5种实现方案)
- AVPlayer
- 优点
- 缺点
- 单纯的播放,没有控制UI,而且如果要显示播放界面,需要借助AVPlayerLayer,添加图层到需要展示的图层上
- MPMoviePlayerController
- 优点
- 缺点
- 不能自定义UI
- 只能将此控制器视图添加到其他视图进行展示
- 此控制器不是视图控制器,不能弹出
- MPMoviePlayerViewController
- 优点
- 自带播放控制UI,不需要手动添加
- 此控制器是视图控制器,可以弹出,可以压栈
- 也可以手动调整视图大小,添加其他视图上
- 缺点
- 针对第2/3种情况,在iOS9之后,统一使用AVPlayerViewController
- 优点
- 自带播放控制UI,不需要手动添加
- 此控制器是视图控制器,可以弹出,可以压栈
- 也可以手动调整视图大小,添加到其他视图上
- 缺点
- 第三方框架Vitamio
二.使用AVPlayer播放远程视频
1.实现播放功能
- 通过远程URL创建AVPlayer
- 开始播放
- 存在问题
- 只能播放声音,看不到图像
- 解决方案:需要借助AVPlayerLayer对象,根据player创建图层,添加到视图上
2.实现视频显示功能
- 根据player对象,创建AVPlayerLayer对象
- AVPlayerLayer *layer = [AVPlayerLayer playerLayerWithPlayer:self.player];
- 设置图层AVPlayerLayer的大小
- layer.frame = CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height * 9 / 16);
- 添加到需要展示的视图上即可
- [self.view.layer addSublayer:layer];
3.封装专门用于播放的视图
备注
- iOS9.0网络请求(ATS)适配(HTTPS->HTTP)
- NSAppTransportSecurity
- NSAllowsArbitraryLoads->true
三.使用MPMoviePlayerController播放视频
- 相比于AVPlayer播放,自带一些控制按钮
- 导入MediaPlayer框架
- 根据URL创建控制器MPMoviePlayerController
- 设置播放视图frame,添加到需要展示的视图上
- 设置播放视图的frame
- self.moviePlayer.view.frame = CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height * 9 / 16);
- 设置播放视图控制样式
- self.moviePlayer.controlStyle = MPMovieControlStyleFullscreen;
- 添加播放视图到要显示的视图
- [self.view addSubview:self.moviePlayer.view];
- 播放
- 注意事项
- 此控制器不是视图控制器,不能直接弹出
- 播放器的播放状态,是通过通知的方式告诉外界
四.使用MPMoviePlayerViewController播放视频
- 导入MediaPlayer框架
- 根据URL创建控制器MPMoviePlayerViewController
- 直接modal弹出该控制器(或者设置播放视图frame,添加到需要展示的视图上)
- [self presentViewController:self.playerVC animated:YES completion:nil];
- 播放
- [self.playerVC.moviePlayer play];
五.iOS9.0之后,需要使用AVPlayerViewController
- 导入框架
- 根据URL创建AVPlayer
- 根据AVPlayer,创建AVPlayerViewController控制器
- self.playerVC = [[AVPlayerViewController alloc] init];
- self.playerVC.player = player;
- 设置播放视图frame,添加到需要展示的视图上
- 设置播放视图的frame
- self.playerVC.view.frame = CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height * 9 / 16);
- 添加播放视图到要显示的视图
- [self.view addSubview:self.playerVC.view];
- 或者直接弹出此控制器
- [self presentViewController:self.playerVC animated:YES completion:nil];
- 播放
- [self.playerVC.player play];
六.Vitamio框架
- 官网
- 主要功能
- Vitamio能够流畅播放720P甚至1080P高清mkv/flv/mp4/mov/ts/rmvb等常见格式的视频
- 还可以在Android和iOS上跨平台支持mms/rtsp/rtmp/hls(m3u8)等常见的多种视频流媒体协议,包括直播与点播
- 使用权限
- 非个人移动应用均需购买Vitamio使用授权
- 标准免费版仅限于个人开发者使用
- 使用步骤
- 导入框架
- 添加系统依赖库
- 项目配置
- TARGETS->Build Settings->Other Linker Flags->"-OjbC"
- 导入头文件
- 代码实现
- 获取单例
- VMediaPlayer.sharedInstance()
- 设置承载式图,以及代理
- mMPlayer.setupPlayerWithCarrierView(view,withDelegate:self)
- 设置数据源
- mMPlayer.setDataSource(NSURL(string:videoUrl),header:nil)
- 异步准备视频
- 在代理方法中开始播放(VMediaPlayerDelegate)
// 当'播放器准备完成'时, 该协议方法被调用, 我们可以在此调用 [player start] 来开始音视频的播放.
func mediaPlayer(player: VMediaPlayer!, didPrepared arg: AnyObject!) {
mMPayer.start()
}
// 当'该音视频播放完毕'时, 该协议方法被调用, 我们可以在此作一些播放器善后操作, 如: 重置播放器, 准备播放下一个音视频等
func mediaPlayer(player: VMediaPlayer!, playbackComplete arg: AnyObject!) {
player.reset()
}
// 如果播放由于某某原因发生了错误, 导致无法正常播放, 该协议方法被调用, 参数 arg 包含了错误原因.
func mediaPlayer(player: VMediaPlayer!, error arg: AnyObject!) {
print("nal")
}
- 暂停播放
- mMPlayer.pause()
- 停止播放
- mMPlayer.reset()
- mMPlayer.unSetupPlayer()
- 继续播放
- mMPlayer.start()
- 倍速播放
- mMPlayer.setPlaybackSpeed
- 播放到指定时间
- seekTo