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

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

MPMoviePlayerViewController

MP简介

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

MP支持的格式

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

MP开发注意事项

  • 由于MPMoviePlayerViewController的初始化方法做了大量工作,例如设置URL、自动播放、添加点击Done完成的监控等。所以尽可能重用,而不要频繁的销毁重新创建,重用一个MPMoviePlayerViewController非常简单,将新的播放地址设置过去就可以了

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

  • MPMoviePlayerViewController是一个很复杂的视图结构,我们有时候需要对播放器添加一些控件。我建议不要在MPMoviePlayerViewController上修改,因为MP在iOS4、5、6、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对象。

  • 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进行了优化,排队的视频会进行预加载。

iOS视频播放:

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

 
 

iOS视频流开发(2) — 视频播放的更多相关文章

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

    承上篇,本篇文章主要介绍iOS视频播放需要用到的类.以及他们的使用场景和开发中遇到的问题. MPMoviePlayerViewController MP简介 iOS提供MPMoviePlayerCon ...

  2. iOS视频流开发(1)—视频基本概念

    iOS视频流开发(1)-视频基本概念 手机比PC的优势除了便携外,她最重要特点就是可以快速方便的创作多媒体作品.照片分享,语音输入,视频录制,地理位置.一个成功的手机APP从产品形态上都有这其中的一项 ...

  3. [iOS 视频流开发-获得视频帧处理]

    调用视频流所使用框架:<Foundation/Foundation.h> 必须定义的参数: 1.AVCaptureDevice(捕获设备:前置.后置摄像头等) 2.AVCaptureInp ...

  4. 浅谈iOS视频开发

     浅谈iOS视频开发 这段时间对视频开发进行了一些了解,在这里和大家分享一下我自己觉得学习步骤和资料,希望对那些对视频感兴趣的朋友有些帮助. 一.iOS系统自带播放器 要了解iOS视频开发,首先我们从 ...

  5. iOS 视频开发学习

    原文:浅谈iOS视频开发 这段时间对视频开发进行了一些了解,在这里和大家分享一下我自己觉得学习步骤和资料,希望对那些对视频感兴趣的朋友有些帮助. 一.iOS系统自带播放器 要了解iOS视频开发,首先我 ...

  6. 中文 iOS/Mac 开发博客列表

    中文 iOS/Mac 开发博客列表 博客地址 RSS地址 OneV's Den http://onevcat.com/atom.xml 一只魔法师的工坊 http://blog.ibireme.com ...

  7. Unity iOS混合开发界面切换思路

    Unity iOS混合开发界面切换思路 最近有很多博友QQ 私信 或则 留言联系我,请教iOS和Unity界面之前相互切换的问题,源代码就不私下发你们了,界面跳转功能的代码我直接贴到下面好了,顺带说i ...

  8. ios新手开发——toast提示和旋转图片加载框

    不知不觉自学ios已经四个月了,从OC语法到app开发,过程虽然枯燥无味,但是结果还是挺有成就感的,在此分享我的ios开发之路中的小小心得~废话不多说,先上我们今天要实现的效果图: 有过一点做APP经 ...

  9. iOS常用开发技巧

    iOS开发过程中,总有那么一些个小问题让人纠结,它们不会让程序崩溃,但是会让人崩溃.除此之外,还将分享一些细节现在我通过自己的总结以及从其他地方的引用,来总结一下一些常见小问题. 本篇长期更新,多积累 ...

随机推荐

  1. POJ-1011(sticks,深搜)

    Description George took sticks of the same length and cut them randomly until all parts became at mo ...

  2. MySQL中的事务日志

    一.事务日志的作用 事务日志在保证事务的特性的同时,提高事务的执行效率 二.事务日志的工作原理 使用事务日志时,存储引擎修改了表的数据时只需要修改其内存拷贝. 然后再将修改行为记录到持久在硬盘上的事务 ...

  3. KNN算法原理及实现

    1.KNN算法概述 kNN算法的核心思想是如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性.该方法在确定分类决策上只依据最邻近的一 ...

  4. c++_方格填数(最新方法)

      方格填数 如下的10个格子 +--+--+--+ | | | |+--+--+--+--+| | | | |+--+--+--+--+| | | |+--+--+--+ (如果显示有问题,也可以参 ...

  5. 杭电 1856 More is better (并查集求最大集合)

    Description Mr Wang wants some boys to help him with a project. Because the project is rather comple ...

  6. 理解js的几个关键问题(2): 对象、 prototype、this等

    参考文档:http://www.cnblogs.com/ranran/archive/2014/05/19/3737217.html http://speakingjs.com/es5/ch17.ht ...

  7. Leetcode 309.最佳买卖股票时机含冷冻期

    最佳买卖股票时机含冷冻期 给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格.​ 设计一个算法计算出最大利润.在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票): 你不 ...

  8. java常见问题集锦

    Eclipse 编译错误 Access restriction:The type *** is not accessible due to restriction on... 解决方案 Eclipse ...

  9. Charm Bracelet(01背包)

    Bessie has gone to the mall's jewelry store and spies a charm bracelet. Of course, she'd like to fil ...

  10. NYOJ-116士兵杀敌(二),树状数组~~

    士兵杀敌(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:5 描述 南将军手下有N个士兵,分别编号1到N,这些士兵的杀敌数都是已知的. 小工是南将军手下的军师,南将军经常想知 ...