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. MySQL丨03丨基本语句

    MySQL语句都是以 ; 号结尾的 看库(刘大婶直接面对的是各种档案袋) show databases; 建库(新弄了一个档案袋) create database database_name; 删库( ...

  2. 深入Linux内核架构——进程管理和调度(上)

    如果系统只有一个处理器,那么给定时刻只有一个程序可以运行.在多处理器系统中,真正并行运行的进程数目取决于物理CPU的数目.内核和处理器建立了多任务的错觉,是通过以很短的间隔在系统运行的应用程序之间不停 ...

  3. nginx 配置虚拟主机访问PHP文件 502错误的解决方法

    最近配置Nginx 服务器虚拟主机 访问目录发现报502错误 百度了很多方法 都不管用  我擦 各种抓狂----- 原本Nginx配置如下: 网上找了很多方法: 查看日志   借助nginx的错误日志 ...

  4. pwnable.kr cmd1之write up

    看一下源代码: #include <stdio.h> #include <string.h> int filter(char* cmd){ ; r += strstr(cmd, ...

  5. Codeforces 879C/878A - Short Program

    传送门:http://codeforces.com/contest/879/problem/C 本题是一个位运算问题——位运算的等价变换. 假设位运算符“&”“|”“^”是左结合的,且优先级相 ...

  6. 一些简单的JavaScript的方法

    <script type="text/javascript"> //js跳转 function UserMouserDown() { confirm('你确定要删除吗? ...

  7. HDU1754-I Hate It,线段数水题~~2016.4.11

    I Hate It                                                                                           ...

  8. Kubernetes集群中修复状态为NotReady的节点

    度个假回来发现自己集群中的节点都挂了,全部是NotReady状态 但是除了.10节点外,其他主机并没有挂,可以远程连接上, 那就考虑是kubernetes系统的问题 解决的方法是重启kube-prox ...

  9. Linux基础之基本命令cat less more sort uniq alias 命令行 bash简单描述(三)

    获取Linux当前最新的内核版本号经常关注www.kernel.org 目录管理:ls cd pwd mkdir rmdir tree 文件管理:touch stat file rm cp mv na ...

  10. HDU1272 迷宫通路数

    Problem Description 上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走.但是她设计迷宫的思路不一样,首先她认为所有的通道都应该 ...