承上篇,本篇文章主要介绍iOS视频播放须要用到的类。以及他们的使用场景和开发中遇到的问题。html
iOS提供MPMoviePlayerController类进行播放,支持流媒体和文件播放。MPMoviePlayerController足够强大,几乎不用写几行代码就能完成一个播放器。视频内容会渲染到他的View上,这个View能够移动、缩放,放在任何用户想放的地方,而在缩放移动的过程当中视频均可以正常的播放,彻底不受影响。
一般咱们在ipad上会作这样的小窗播放功能,让用户能够边看视频边看电子书或者浏览网页。ios
因为MPMoviePlayerViewController的初始化方法作了大量工做,例如设置URL、自动播放、添加点击Done完成的监控等。因此尽量重用,而不要频繁的销毁从新建立,重用一个MPMoviePlayerViewController很是简单,将新的播放地址设置过去就能够了git
MPMoviePlayerViewController进入全屏播放模式的时候,必定要监听他的stop状态,并进行处理,继续播放或者退出全屏。不然一直停在全屏模式下。github
MPMoviePlayerViewController是一个很复杂的视图结构,咱们有时候须要对播放器添加一些控件。我建议不要在MPMoviePlayerViewController上修改,由于MP在iOS四、五、六、7上的视图结构都不同,添加自定义控件很是容易出问题。那需求又必须让咱们加入自定义的控件怎么办呢?这个时候咱们就须要用到AVPlayer了。浏览器
当须要自定义播放器的样式时,咱们可使用AVPlayer。AVPlayer在AVFoundation框架中,相比MPMoviePlayerController它更加接近于底层。因为AVPlayer是做用在layer上,效率会比MP高一些。数据结构
AVPlayer自己并不能显示视频。他经过建立一个播放器层AVPlayerLayer用于展现视频,播放器层继承于CALayer,有了AVPlayerLayer以后,将AVPlayerLayer添加到控制器视图的layer中便可。相比MP直接传入一个URL,AVPlayer播放的时候略微复杂一些,须要用到如下数据结构:框架
AVURLAsset:AVAsset的子类,能够根据一个URL路径建立一个包含媒体信息的AVURLAsset对象。iphone
AVPlayerItem:一个媒体资源管理对象,管理者视频的一些基本信息和状态,一个AVPlayerItem对应着一个视频资源。优化
AVQueuePlayer用于列表播放,虽然AVPlayer经过监听播放状态也能够作到视频结束后的自动切换,可是使用AVQueuePlayer加载会快不少。应该是AVFoundation框架对AVQueuePlayer进行了优化,排队的视频会进行预加载。ui
iOS提供MPMoviePlayerController这个类有个很是难用的点,就是他的频播放状态和视频加载状态都是经过Notification通知状态变化,而不是经过block或者delegate。在实际使用中稍微不注意就会出问题,尤为是在视频列表中。若是苹果的工程师不是脑子进水的话,为何这样设计呢? 我认为之因此这样设计的缘由是,不管MPMoviePlayerController仍是AVPlayer,都只是一个外壳,他们内部都是用了一个同一个CoreMedia的播放组件,这个播放组件是全局单例。包括iOS浏览器使用的播放器(浏览器的播放器以plugin的形式嵌入)都是使用的这个播放内核。因此理论上也就不可能在一部iOS设备上同时播放两个视频,一个播放另外一个必然中止,不管它是网页仍是本地。那么Notification这样的应用程序级的通知方式彷佛比block或者delegate这样类级别的方式更合理。 你们能够试试,看看用原生播放器可否作到一个iOS设备上同时播放两个视频。