有一个月没写博客了, 今天分享一篇关于多媒体的文章, 平时我多分享一些UI方面的零散知识, 这种一般好理解, 让人愿意学习, 看完能够实现某些效果, 今天也是本着这个目的, 今天通过简单封装一个视频播放器, 来学一些AVPlayer相关的一些知识. 在这里的代码格式似乎阅读不是很理想, 我试着做了修改, 并没有修改成功, 可以直接下载Demo, 或者点击我留下的备用链接(在文末).
播放器地址https://github.com/summerxx27/XXVideoPlayer
- 编译环境 Xcode 8
- AVPlayer相关
- AVPlayerItem
- 支持多种视频格式
- 完成了 快进 快退 暂停 播放 全屏等视频播放器的基础功能
- 后期会添加更加丰富的内容, 还可能写一个Swift版本的
1 |
_avPlayerItem = [[AVPlayerItem alloc] initWithURL:playFormURL]; |
1 2 |
// 通过AVPlayerItem创建一个AVPlayer对象 self.avPlayer = [[AVPlayer alloc] initWithPlayerItem:_avPlayerItem]; |
1 2 3 4 |
<span class="hljs-comment">// 创建 AVPlayerLayer <span class="hljs-keyword">self</span><span class="hljs-variable">.playLayer</span> = [<span class="hljs-built_in">AVPlayerLayer</span> playerLayerWithPlayer:<span class="hljs-keyword">self</span><span class="hljs-variable">.avPlayer</span>]; // 添加到要显示视频的View</span> [<span class="hljs-keyword">self</span><span class="hljs-variable">.view</span><span class="hljs-variable">.layer</span> addSublayer:<span class="hljs-keyword">self</span><span class="hljs-variable">.playLayer</span>]; |
1 2 3 4 5 6 7 8 9 |
<span class="hljs-comment">// 播放 | 暂停</span> - (<span class="hljs-keyword">void</span>)xx_VideoPlay { [<span class="hljs-keyword">self</span><span class="hljs-variable">.avPlayer</span> play]; } - (<span class="hljs-keyword">void</span>)xx_VideoPause { [<span class="hljs-keyword">self</span><span class="hljs-variable">.avPlayer</span> pause]; } |
1 2 |
<span class="hljs-comment">// 快进处理 slider 就是滑动条.</span> [<span class="hljs-keyword">self</span><span class="hljs-variable">.avPlayer</span> seekToTime:CMTimeMakeWithSeconds(slider<span class="hljs-variable">.value</span>, <span class="hljs-keyword">self</span><span class="hljs-variable">.avPlayerItem</span><span class="hljs-variable">.currentTime</span><span class="hljs-variable">.timescale</span>)]; |
1 2 |
<span class="hljs-comment">// 获取总的播放时间 self.avPlayerItem(当前播放AVPlayerItem的对象)</span> CMTimeGetSeconds(<span class="hljs-keyword">self</span><span class="hljs-variable">.avPlayerItem</span><span class="hljs-variable">.asset</span><span class="hljs-variable">.duration</span>) |
1 2 3 4 5 6 7 8 9 10 |
<span class="hljs-comment">// 观察AVPlayerItem的播放状态</span> <span class="hljs-built_in">AVF_EXPORT</span> <span class="hljs-built_in">NSString</span> *<span class="hljs-keyword">const</span> <span class="hljs-built_in">AVPlayerItemTimeJumpedNotification</span> <span class="hljs-built_in">NS_AVAILABLE</span>(<span class="hljs-number">10</span>_7, <span class="hljs-number">5</span>_0); <span class="hljs-comment">// the item's current time has changed discontinuously</span> <span class="hljs-built_in">AVF_EXPORT</span> <span class="hljs-built_in">NSString</span> *<span class="hljs-keyword">const</span> <span class="hljs-built_in">AVPlayerItemDidPlayToEndTimeNotification</span> <span class="hljs-built_in">NS_AVAILABLE</span>(<span class="hljs-number">10</span>_7, <span class="hljs-number">4</span>_0); <span class="hljs-comment">// item has played to its end time</span> <span class="hljs-built_in">AVF_EXPORT</span> <span class="hljs-built_in">NSString</span> *<span class="hljs-keyword">const</span> <span class="hljs-built_in">AVPlayerItemFailedToPlayToEndTimeNotification</span> <span class="hljs-built_in">NS_AVAILABLE</span>(<span class="hljs-number">10</span>_7, <span class="hljs-number">4</span>_3); <span class="hljs-comment">// item has failed to play to its end time</span> <span class="hljs-built_in">AVF_EXPORT</span> <span class="hljs-built_in">NSString</span> *<span class="hljs-keyword">const</span> <span class="hljs-built_in">AVPlayerItemPlaybackStalledNotification</span> <span class="hljs-built_in">NS_AVAILABLE</span>(<span class="hljs-number">10</span>_9, <span class="hljs-number">6</span>_0); <span class="hljs-comment">// media did not arrive in time to continue playback</span> <span class="hljs-built_in">AVF_EXPORT</span> <span class="hljs-built_in">NSString</span> *<span class="hljs-keyword">const</span> <span class="hljs-built_in">AVPlayerItemNewAccessLogEntryNotification</span> <span class="hljs-built_in">NS_AVAILABLE</span>(<span class="hljs-number">10</span>_9, <span class="hljs-number">6</span>_0); <span class="hljs-comment">// a new access log entry has been added</span> <span class="hljs-built_in">AVF_EXPORT</span> <span class="hljs-built_in">NSString</span> *<span class="hljs-keyword">const</span> <span class="hljs-built_in">AVPlayerItemNewErrorLogEntryNotification</span> <span class="hljs-built_in">NS_AVAILABLE</span>(<span class="hljs-number">10</span>_9, <span class="hljs-number">6</span>_0); <span class="hljs-comment">// a new error log entry has been added</span> <span class="hljs-comment">// notification userInfo key type</span> <span class="hljs-built_in">AVF_EXPORT</span> <span class="hljs-built_in">NSString</span> *<span class="hljs-keyword">const</span> <span class="hljs-built_in">AVPlayerItemFailedToPlayToEndTimeErrorKey</span> <span class="hljs-built_in">NS_AVAILABLE</span>(<span class="hljs-number">10</span>_7, <span class="hljs-number">4</span>_3); <span class="hljs-comment">// NSError</span> |
1 2 3 4 |
<span class="hljs-comment">// 旋转方法 之后 调整frame</span> [<span class="hljs-keyword">self</span><span class="hljs-variable">.view</span> setTransform:<span class="hljs-built_in">CGAffineTransformMakeRotation</span>(M_PI_2)]; <span class="hljs-comment">// 取消全屏</span> [<span class="hljs-keyword">self</span><span class="hljs-variable">.view</span> setTransform:<span class="hljs-built_in">CGAffineTransformIdentity</span>]; |
1 2 3 4 |
<span class="hljs-comment">// 隐藏状态栏的相关方法</span> [[<span class="hljs-built_in">UIApplication</span> sharedApplication] setStatusBarHidden:<span class="hljs-literal">YES</span> withAnimation:<span class="hljs-built_in">UIStatusBarAnimationFade</span>]; <span class="hljs-comment">// 同时需要在info.plist文件中进行配置</span> <span class="hljs-comment">// View controller-based status bar appearance = NO</span> |
以上就是对于视频播放器封装用到的知识点了~
第一次学习AVPlayer 难免出现错误的地方, 请告知我, 这样我就能及时修正了
感谢 36Kr 的开源, 让我能够学习相关的知识点
不同的是 36Kr使用MPMoviePlayerController, 而我使用AVPlayer, UI方面我直接使用了他提供的UI方便快速, 当然可以随意修改, 简单方便.
最后感谢您的阅读, 如果感觉有帮助可以关注我 和我一起学习!
http://www.jianshu.com/p/9aa30f00e13b
我是夏天, 暖暖的夏天
End