十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
本文讲解的是 iOS 视频播放, 支持本地,在线播放. 进度拖动,精准跳转,获取视频的长度等问题
让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:主机域名、网站空间、营销软件、网站建设、通许网站维护、网站推广。
demo 记得点亮 star. 3Q
iOS 视频播放主要使用的类 AVPlayerItem,AVPlayerLayer,AVPlayer
AVPlayerItem: 提供视频信息, 利用视频的 url 创建一个对象.利用 kvo 监听 status,可以获取当前视频的状态.
AVPlayer: 就类似视频的控制者. 可以用来控制视频的播放,暂停,跳转等. 它的创建依赖于AVPlayerItem
AVPlayerLayer: 用于视频的显示. 可以理解成一个 view. 它的创建依赖于AVPlayer
简单总结: AVPlayer控制视频状态, AVPlayerLayer用于显示,AVPlayerItem提供视频信息
获取视频的长度 s
视频精准跳转.拖动 UISlider,监听 value 改变方法如下:
//为什么timescale要设置成 600 CMTime教程
最近工作之余, 写了一个视频播放器,输入要播放的视频资源地址,即可实现播放功能。
目前功能比较简单,支持锁屏、屏幕旋转等基础功能,后续会继续完善。。。
下面讲解下实现思路:
因 MediaPlayer/MediaPlayer.h 中 MPMoviePlayerController MP_DEPRECATED("Use AVPlayerViewController in AVKit.", ios(2.0, 9.0)) 在iOS9以后已经废弃,为了更好的兼容性,采用了 AVFoundation/AVFoundation.h 为技术实现方案。
框架在此就不讲解了,官网讲的比较清楚,不懂的可以查看官档。 - 戳这里
监听视频资源的加载状态, 根据不同的状态进行相应的操作。
更新视频资源的播放进度。
实现控制视图 QYPlayerControlView 的Delegate。 当控制视图进行了相应操作,事件被传递到该类中进行统一处理。
该类中还有对操作视图 显示/隐藏 的方法。
后续调整视频亮度、音量、进度等手势都需添加在该分类中,便于统一管理。
主要存放时间转换的分类 NSString+Custom 、常用宏 QYPlayerDefine 等工具类。
1). BaseViewController 中实现了控制屏幕旋转的系统方法,实现的控制器要继承自 BaseViewController 。
2). 在子控制器中实现如下方法。
此时屏幕旋转功能已经添加成功!
以上便是整个播放器的源码解析,具体的细节请查看源码。
源码放在GitHub上了,想查看的小伙伴可以 -戳这里。
千里之行,始于足下。
快进:AVPlayer .rate 1
慢放: 0 AVPlayer .rate 1
快退: AVPlayer .rate 0 (m3u8 不能快退)
MP4:如果快进到了缓存不够的地方:KVC监听 AVPlayerItem .isPlaybackBufferEmpty = yes
快退到头会走通知AVPlayerItemDidPlayToEndTimeNotification
m3u8(静态):快进与MP4格式视频一致,可以10倍 20倍播放。
m3u8(动态):快进到了缓存不够的地方,会走通知AVPlayerItemDidPlayToEndTimeNotification。
备注:使用[AVPlayerItem stepByCount:-24];
将AVPlayerItem 向前或向后移动指定的步数,正数前进,负数后退。 每个步数的大小取决于AVPlayerItem启用的AVPlayerItemTracks对象;
注册监听和通知
如何将视频添加上自定义的渲染效果,并显示?
1、解码视频
2、获取视频帧
3、渲染视频帧
4、显示渲染后的视频帧
5、编码视频帧,生成新的视频
AVPlayer:驱动播放用例的中心阶层,是用于管理媒体资产的回放和定时的控制器对象
这里AVPlayer,我制作简单的播放,暂停,seek。并且添加上AVPlayerItemVideoOutput做一个视频帧输出的工作。
创建一个播放器
AVPlayerItemVideoOutput 获取视频帧
主要的核心工具是 AVPlayerItemVideoOutput ,这对象相当于一个视频解码工具,对它进行属性设置,可以获取视频中某一时刻的想要数据的 CVPixelBuffer 视频帧。
通过获取到的CVPixelBuffer,进行OPenGL自定义渲染显示。
外部需要开启一个定时器,来实时的进行画面的刷新。定时器时间可以根据视频的FPS来控制。
至此如何获取视频帧就可以了。
如何获取视频帧,这里都比较简单,都是通过系统层去实现功能。
主要注意的是:
1、AVPlayerItemVideoOutput的获取的数据格式定义,根据 需求设置RGBA还是YUV420的数据 。
2、AVPlayer使用seek时候,使用 精度比较高的方法 ,提高在seek时候的画面流畅度
3、获取的CVPixelBuffer 在Swift语言,不需要手动释放 。在OC上需要调用 CVPixelBufferRelease() 手动释放
Git Code:AVPlayer-Render