iOS视频流开发(2)—视频播放

承上篇,本篇文章主要介绍iOS视频播放须要用到的类。以及他们的使用场景和开发中遇到的问题。html

MPMoviePlayerViewController

MP简介

iOS提供MPMoviePlayerController类进行播放,支持流媒体和文件播放。MPMoviePlayerController足够强大,几乎不用写几行代码就能完成一个播放器。视频内容会渲染到他的View上,这个View能够移动、缩放,放在任何用户想放的地方,而在缩放移动的过程当中视频均可以正常的播放,彻底不受影响。
一般咱们在ipad上会作这样的小窗播放功能,让用户能够边看视频边看电子书或者浏览网页。ios

MP支持的格式

  • MPMoviePlayerController既支持本地视频文件的播放也支持流媒体(HTTP Live Streaming)
  • MPMoviePlayerController由于使用的是硬解码,因此支持的文件格式只有以H264为编码格式的MP四、MOV、M4V、M2V、3GP等。
  • MPMoviePlayerController支持大多数音频编码。
  • 其余格式的解码好比rmvb,能够考虑第三方解码框架ffmpeg。ffmpeg等第三方解码框架使用的是软解码,因此手机的发热和耗电很是的恐怖,如非必要,不要使用。
  • 视频格式的相关知识的详细介绍:iOS视频流开发(1)—视频基础知识

MP开发注意事项

  • 因为MPMoviePlayerViewController的初始化方法作了大量工做,例如设置URL、自动播放、添加点击Done完成的监控等。因此尽量重用,而不要频繁的销毁从新建立,重用一个MPMoviePlayerViewController很是简单,将新的播放地址设置过去就能够了git

  • MPMoviePlayerViewController进入全屏播放模式的时候,必定要监听他的stop状态,并进行处理,继续播放或者退出全屏。不然一直停在全屏模式下。github

  • MPMoviePlayerViewController是一个很复杂的视图结构,咱们有时候须要对播放器添加一些控件。我建议不要在MPMoviePlayerViewController上修改,由于MP在iOS四、五、六、7上的视图结构都不同,添加自定义控件很是容易出问题。那需求又必须让咱们加入自定义的控件怎么办呢?这个时候咱们就须要用到AVPlayer了。浏览器

AVPlayer

AVPlayer简介

当须要自定义播放器的样式时,咱们可使用AVPlayer。AVPlayer在AVFoundation框架中,相比MPMoviePlayerController它更加接近于底层。因为AVPlayer是做用在layer上,效率会比MP高一些。数据结构

AVPlayer播放

AVPlayer自己并不能显示视频。他经过建立一个播放器层AVPlayerLayer用于展现视频,播放器层继承于CALayer,有了AVPlayerLayer以后,将AVPlayerLayer添加到控制器视图的layer中便可。相比MP直接传入一个URL,AVPlayer播放的时候略微复杂一些,须要用到如下数据结构:框架

  • AVURLAsset:AVAsset的子类,能够根据一个URL路径建立一个包含媒体信息的AVURLAsset对象。iphone

  • AVPlayerItem:一个媒体资源管理对象,管理者视频的一些基本信息和状态,一个AVPlayerItem对应着一个视频资源。优化

AVPlayer获取播放状态

  • 视频加载状态
    经过KVO监听AVPlayerItem的status属性来得到。当AVPlayerItem的status属性为AVPlayerStatusReadyToPlay时,代表视频加载完成。
  • 视频缓冲状态
    一样,经过KVO监听AVPlayerItem的loadedTimeRanges属性来得到。视频每缓冲一部分这个属性数据就会被更新,当loadedTimeRanges的值改变时能够得到本次缓冲加载的视频范围,包含起始时间、本次加载时长),这样一来就能够实时得到缓冲状况。
  • 播放进度状态
    经过AVPlayer的- (id)addPeriodicTimeObserverForInterval:(CMTime)interval queue:(dispatch_queue_t)queue usingBlock:(void (^)(CMTime time))block方法得到播放进度,这个方法会在设定的时间间隔内定时更新播放进度。

AVQueuePlayer

AVQueuePlayer用于列表播放,虽然AVPlayer经过监听播放状态也能够作到视频结束后的自动切换,可是使用AVQueuePlayer加载会快不少。应该是AVFoundation框架对AVQueuePlayer进行了优化,排队的视频会进行预加载。ui

iOS视频播放:

iOS提供MPMoviePlayerController这个类有个很是难用的点,就是他的频播放状态和视频加载状态都是经过Notification通知状态变化,而不是经过block或者delegate。在实际使用中稍微不注意就会出问题,尤为是在视频列表中。若是苹果的工程师不是脑子进水的话,为何这样设计呢? 我认为之因此这样设计的缘由是,不管MPMoviePlayerController仍是AVPlayer,都只是一个外壳,他们内部都是用了一个同一个CoreMedia的播放组件,这个播放组件是全局单例。包括iOS浏览器使用的播放器(浏览器的播放器以plugin的形式嵌入)都是使用的这个播放内核。因此理论上也就不可能在一部iOS设备上同时播放两个视频,一个播放另外一个必然中止,不管它是网页仍是本地。那么Notification这样的应用程序级的通知方式彷佛比block或者delegate这样类级别的方式更合理。 你们能够试试,看看用原生播放器可否作到一个iOS设备上同时播放两个视频。

相关文章
相关标签/搜索