Android中的流媒体(一)常识

一.常识
(一).视频传输编码
(1)MPEG 参考链接:http://baike.baidu.com/view/1645953.htm
1.1 MPEG:视频编码标准是主要应用于实时视频通信领域,如会议电视;MPEG系列标准是由ISO/IEC制定的,
主要应用于视频存储(DVD)、广播电视、因特网或无线网上的流媒体等。


1.2 现存的标准:数字视频技术广泛应用于通信、计算机、广播电视等领域,带来了会议电视、可视电话及数字电视、媒体存储等一系列应用,
促使了许多视频编码标准的产生。ITU-T与ISO/IEC是制定视频编码标准的两大组织,ITU-T的标准包括H.261、H.263、H.264,
两个组织也共同制定了一些标准,H.262标准等同于MPEG-2的视频编码标准,而最新的H.264标准则被纳入MPEG-4的第10部分。
(2)ffmpeg 参考链接:http://baike.baidu.com/link?url=70UHk1glgCTfRjTbwmr3O7NjHHhLtKjbL7p9gaHA3pv_PeyTT0cL1Bp00o0CvGYclT0-lKFEEjPM3VAxsDl-dq
1.1 ffmpeg :FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。
它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,
libavcodec里很多code都是从头开发的。
FFmpeg在Linux平台下开发,但它同样也可以在其它操作系统环境中编译运行,包括Windows、Mac OS X等。这个项目最早由Fabrice Bellard发起,
现在由Michael Niedermayer维护。许多FFmpeg的开发人员都来自MPlayer项目,而且当前FFmpeg也是放在MPlayer项目组的服务器上。
项目的名称来自MPEG视频编码标准,前面的"FF"代表"Fast Forward".




(二)Android5.0 NuPlayer多媒体框架(参考:http://blog.csdn.net/mandagod/article/details/47207511)
(1)概况:
Android流媒体框架在Gingerbread Android2.3版本的时候加入的,其中实现的核心就是NuPlayer。
在之前的版本中一般认为Local Playback就用Stagefrightplayer+Awesomeplayer,流媒体用NuPlayer。从现在来看,NuPlayer大有替换掉StagefrightPlayer+AwesomePlayer的趋势,
现在NuPlayer也可以完美地实现本地播放。
Android2.3时引入流媒体框架,而流媒体框架的核心是NuPlayer。Android4.0之后HttpLive和RTSP协议开始使用NuPlayer播放器,Android5.0(L版本)之后本地播放也开始使用NuPlayer播放器。
在实现上NuPlayer和Awesomeplayer不同,NuPlayer基于StagefrightPlayer的基础类构建,利用了更底层的ALooper/AHandler机制来异步地处理请求,
ALooper列队消息请求,AHandler中去处理,所以有更少的Mutex/Lock在NuPlayer中。AHnadler机制请参考前面的一篇文章,AHandler机制。
Android5.0之前,StageFright架构使用的传递消息机制是TimedEventQueue模型
Android升级到5.0之后,NuPlayer使用的是AHandler消息机制,类似于Handler (Android5.0之前,StageFright架构使用的传递消息机制是TimedEventQueue模型)
Awesomeplayer中利用了omxcodec而NuPlayer中利用了Acodec。
Android流媒体在5.0上资源文件主要分为HTTPLiveSource、RTSPSource GenericSource,其中GenericSource是4.1版本加入的。其中RTSP和HLS流是最主要的,
两者本别基于RTSP协议和HLS协议。 
(2)AHandler机制
Android APP开发中为了不阻塞UI线程,利用handler,把UI线程分开异步执行,使用handler去执行某项比较费时的操作,然后异步更新UI线程。这部分是用Java来实现的,
和传统Java的线程机制很类似。
流媒体(5.0中用的是NuPlayer)中也是类似的,因为联网,codec都很费时,需要异步执行。AHandler机制基于C++的实现,NuPlayer就是继承了AHandler,
实际上就是用的AHandler。
对于handler消息机制,构成就必须包括一个Loop,message。那么对应的AHandler,也应该有对应的ALooper, AMessage。底层的多媒体框架NuPlayer中,
都是用AHandler消息机制实现的。
(3)音视频同步
在NuPlayer框架中,音视频同步的工作是由Renderer来完成的,而在StageFright框架, Render是显示用的。
NuPlayer框架中,音视频同步的策略是音/视频往后delay,被动同步,而不会主动seek;简单讲就是如果视频来早了会等一下音频,如果视频来晚了会通过丢帧机制同步,
连续丢帧直到音视频同步上为止,因为音频太敏感,所以只视频做此处理,而音频不做这样的处理,总之策略就是:视频早等晚丢。
Stagefright框架中,音视频同步的策略是,视频向前向后双向同步,too late时video会主动往前seek;too early的时候video会delay
在NuPlayer的start步骤中,新建了一个Renderer的循环线程mRendererLooper,并且把mRenderer作为这个循环线程的Handler,在这个线程内对音视频数据进行同步、送显等操作 。


(4)渲染
渲染器是3D引擎的核心部分,它完成将3D物体绘制到屏幕上的任务。渲染器分为硬件渲染器和软件渲染器组成。
渲染器是3D引擎的核心部分,它完成将3D物体绘制到屏幕上的任务。渲染器分为硬件渲染器和软件渲染器:
1.硬件渲染器通常基于底层图形API(应用程序接口)构建,采用适合硬件架构的光栅化方法进行渲染。图形API负责与硬件的通信,常用的图形API包括DirectX和OpenGL。
OpenGL API通过OpenGL图形库来使用3D硬件,多数3D卡支持这种方法。而DirectX API使用微软的DirectX库——归并到 Windows操作系统中。在老的3D卡上面,
OpenGL一般绘制速度较快一些,而在现代的3D卡上面,DirectX表现则更加出色。现在的OpenGL版本只有一个,而DirectX版本有很多。DirectX通过提供更新版本的方式来扩展功能,
而OpenGL通过一个通用的扩展(OpenGL Ext)来对功能进行扩展。
2.软件渲染器则纯粹利用CPU的能力进行计算,通常采用光线追踪的方法进行渲染。软件渲染器没有统一的应用程序标准,但是有很多通用的渲染算法,如光子映射,
蒙特卡洛,辐射度等等。
3.硬件渲染器和软件渲染器应用领域不同:硬件渲染器主要用于实时渲染,比如游戏和虚拟现实。而软件主要用于离线渲染,比如效果图和影视级、产品级渲染。
这主要是因为硬件渲染器的速度快但是灵活度不足,而软件渲染器虽然速度不够理想但是可以使用非常复杂的渲染算法,达到相片级的真实度和效果

猜你喜欢

转载自blog.csdn.net/gongxiaoou/article/details/53692465
今日推荐