Android多媒体软件开发入门(一)

PART 1

OTT 是“Over The Top”的缩写,是指通过互联网向用户提供各种应用服务。这种应用和目前运营商所提供的通信业务不同,它仅利用运营商的网络,而服务由运营商之外的第三方提供。目前,典型的OTT业务有互联网电视业务,苹果应用商店等。不少OTT服务商直接面向用户提供服务和计费,使运营商沦为单纯的“传输管道”,根本无法触及管道中传输的巨大价值。

 

YUV(一种颜色编码方法),主要用于电视系统以及模拟视频领域,分为三个分量,“Y”表示明亮度(Luminance或Luma),也就是灰度值;而“U”和“V” 表示的则是色度(Chrominance或Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色。由于亮度信息(Y)与色彩信息(UV)分离,没有UV信息一样可以显示完整的图像,只不过是黑白的,这样的设计很好地解决了彩色电视机与黑白电视的兼容问题。由于YUV不像RGB那样要求三个独立的视频信号同时传输,所以用YUV方式传送占用极少的带宽。

YUV码流的存储格式与其采样的方式密切相关,主流的采样方式有三种,YUV4:4:4,YUV4:2:2,YUV4:2:0,根据采样格式从码流中还原每个像素点的YUV值,因为只有正确地还原了每个像素点的YUV值,才能通过YUV与RGB的转换公式提取出每个像素点的RGB值,然后显示出来。

提取每个像素的YUV分量参照:

YUV 4:4:4采样,每一个Y对应一组UV分量,每像素32位

YUV 4:2:2采样,每两个Y共用一组UV分量,每像素16位

YUV 4:2:0采样,每四个Y共用一组UV分量,每像素16位

平常所讲的YUV A:B:C的意思一般是指基于4个像素来讲,其中Y采样了A次,U采样了B次,V采样了C次.

 

RGB565 每个像素用16位表示,RGB分量分别使用5位、6位、5位

RGB555 每个像素用16位表示,RGB分量都使用5位(剩下1位不用)

RGB24  每个像素用24位表示,RGB分量各使用8位

RGB32  每个像素用32位表示,RGB分量各使用8位(剩下8位不用)

ARGB32 每个像素用32位表示,RGB分量各使用8位(剩下的8位用于表示Alpha通道值)

转换过程

1.RGB2YUV

在做RGB信号到YUV信号的转换时,一般是先转换到YUV444格式,然后再将UV信号的分辨率降低,变成我们所需的格式。

2.YUV2RGB

在播放视频或显示图像的时候,我们需要将YUV信号转换为RGB信号。这个步骤称为渲染(Rendering)。

在做YUV到RGB的转换时,首先需要将缩水的UV信号的分辨率拉升到与Y信号相同的分辨率,然后再转换到RGB信号。

PART 2

1080p是一种视频显示格式,P意为逐行扫描(Progressive scanning),与它对应的是I意为隔行扫描(interlace scanning)

视频压缩中,每帧代表一幅静止的图像。而在实际压缩时,会采取各种算法减少数据的容量,其中IPB就是最常见的。I帧是关键帧,属于帧内压缩。就是和AVI的压缩是一样的。 P是向前搜索的意思。B是双向搜索。他们都是基于I帧来压缩数据。I帧可以理解为一帧画面的完整保留;解码时只需要本帧数据就可以完成(因为包含完整画面)P帧表示的是这一帧跟之前的一个关键帧(或P帧)的差别,解码时需要用之前缓存的画面叠加上本帧定义的差别,生成最终画面。(也就是差别帧,P帧没有完整画面数据,只有与前一帧的画面差别的数据)

B帧是双向差别帧,也就是B帧记录的是本帧与前后帧的差别,要解码B帧,不仅要取得之前的缓存画面,还要解码之后的画面,通过前后画面的与本帧数据的叠加取得最终的画面。B帧压缩率高,但是解码时CPU会比较累~。

DTS(Decoding Time Stamp):即解码时间戳,这个时间戳的意义在于告诉播放器该在什么时候解码这一帧的数据。PTS(Presentation Time Stamp):即显示时间戳,这个时间戳用来告诉播放器该在什么时候显示这一帧的数据。需要注意的是:虽然 DTS、PTS 是用于指导播放端的行为,但它们是在编码的时候由编码器生成的。当视频流中没有 B 帧时,通常 DTS 和 PTS 的顺序是一致的。但如果有 B 帧时解码顺序和播放顺序不一致了。比如一个视频中,帧的显示顺序是:I B B P,现在我们需要在解码 B 帧时知道 P 帧中信息,因此这几帧在视频流中的顺序可能是:I P B B,DTS 告诉我们该按什么顺序解码这几帧图像,PTS 告诉我们该按什么顺序显示这几帧图像。

音频没有类似视频中 B 帧,不需要双向预测,所以音频帧的 DTS、PTS 顺序是一致的。

要实现音视频同步,通常需要选择一个参考时钟,参考时钟上的时间是线性递增的,编码音视频流时依据参考时钟上的时间给每帧数据打上时间戳。在播放时,读取数据帧上的时间戳,同时参考当前参考时钟上的时间来安排播放。这里的说的时间戳就是我们前面说的 PTS。实践中,我们可以选择:同步视频到音频、同步音频到视频、同步音频和视频到外部时钟。

 

PART 3

开放多媒体加速层(Open Media Acceleration,缩写为OpenMAX),一个不需要授权、跨平台的软件抽象层,以C语言实现的软件接口,用来处理多媒体。OpenMAX是专门用于音视频、图像编解码的。一个完整的多媒体设备包括设备硬件、设备驱动以及设备应用程序。与之对应的是OpenMAX的DL、IL、AL层,DL层定义了众多的API,全方位包含了OpenMAX音频、视频以及图像处理功能,这些功能可以由硅供应商(芯片原厂)实现并优化,然后编解码厂商在此基础上实现一些广泛的编解码功能。

IL层是作为一个比较低层级的接口来服务于嵌入式设备的音视频、图像编解码。它使得应用程序与多媒体框架可以以一种统一的方式与多媒体编解码器对接,而编解码器本身可以是硬件与软件的任何组合形式,这样编解码器可以做到对用户透明,用户无需关注编解码器的实现细节问题。

AL层为多媒体中间件与应用层之间提供一个标准化的API接口,多媒体中间件提供能够完成预期的API功能的服务。AL层为多媒体接口(应用)提供跨平台可移植性。

机顶盒中数据是如何流向的呢?机顶盒demux的流程:清流数据大致流向: TS流-->tuner -->demux-->Buffer-->app

TS流中的数据是前段经过编码、复用、调制之后的数据,机顶盒通过tuner对TS流解调,demux解复用然后将数据送到buffer中,最后机顶盒通过读取buffer获得需要的数据。

MPEG-2支持隔行扫描和逐行扫描。在逐行扫描模式下,编码的基本单元是帧。在隔行扫描模式下,基本编码可以是帧,也可以是场(field)。

封装格式就是把视频数据和音频数据打包成一个文件的规范。仅仅看文件的后缀,很难能看出具体使用了什么视音频编码标准。总的来说,不同的封装格式之间差距不大,各有优劣。

猜你喜欢

转载自blog.csdn.net/songkai320/article/details/51777583