多媒体技术涵盖的面广,涉及的平台很多,商业化产品也很多。 但是其最核心的技术大致是一样的, 基本框图如下:
数据输入系统:这部分的功能比较单一,主要是采集设备(U 盘,Sdcard,flash,网络等设备)的数据,通过系统文件处理部分,将数据送到后面 Demux 系统。 如果是带操作系统的平台,如 linux, WinCE, android 等等,一般就是常见的 fopen, fread 等文件操作函数;如果是Non-OS 系统或者网络播放,需要自己实现对应的数据操作功能。
Demux 系统:这部分主要是将输入的数据 parse 成 audio /video/subtitle ES(Elementary Stream)流,再分别将video ES 和 audio ES 送对应的 video decoder 和 audio decoder 去解码.前端数据输入系统送进来的流一般是带container 的,如 TS,FLV,MP4 等。这些流不仅仅只有压缩后的数据,还有些 pts,subtitle 等其他信息,一般的解码器只接受纯粹的压缩数据,所以需要进行 Demux(解复用)。Demux 系统是多媒体系统的核心技术之一,也是很多播放器厂商的核心源码。因为要支持多种文件格式,如TS,MPEG,FLV,ASF,WMV 等。这部分code 比较庞大,需要对照每种格式的 spec 来阅读。
基本码流(Elementary Stream),简称ES。是由编码器输出的原始基础码流,它只含有解码器所必需的、并与原始图象或原始音频相接近的信息。MPEG对已压缩信号的句法作了严格的定义,以保证解码器能够正常解码。MPEG对编码器未作定义,但它必须能够提供句法正确的码流。
Elementary Stream(基本码流) 由压缩器输出的用于传送 单路视音频信号的原始码流。
Decode 系统:主要分为 video decoder 和 audio decoder.video decoder 对前端 Demux 模块送出的 video ES 流进行解码,输出的是 video 输出系统支持的 YUV 或RGB 数据;audio decoder 对前端 demux 端送出的 audio ES 数流进行解码,输出的是 audio 输出系统支持的 PCM 数据。尽管上层 AP 多种多样,码流格式也非常多,但是最后送到这一层的都是标准压缩格式(如H264,H263,MPEG4,WMV1 等)的 ES 流和 DTS,DTS 主要是决定解码的时机。由于解码过程非常繁琐,涉及到复杂的数学变换,所以这部分一般都是由底层专用硬件 DSP 完成。由于 PC CPU 性能很强大,PC 的播放大多数是软解。
AV 同步系统: 解码后 audio video 数据经过同步后输出到屏幕或喇叭,参考标准是两者的 pts。因为人耳对声音敏感性远远高于图像,audio 数据轻微的丢失和损坏,耳朵都能识别出来;相反,图像帧数的丢失,人眼不一定能看出来,例如,20FPS 和 25FPS 的视频,非专业人员很难区分开。最基本的原则是依照 audio 的pts 来决定对 video 数据的处理,如果video pts 在声音后面,video 帧可能会静止或缓播等 audio 追上来;相反,如果 video pts 如果在 audio 前面,直接丢 video 帧或快播,追赶 audio,达到音视频同步。如果没有 audio数据,视频会根据帧率解码,直接送到 display 系统。
这部分也是多媒体系统的核心技术之一,也是最容易出错的地方。不同播放器,细节机制方面可能稍有差别,但是基本策略是一样的。
输出系统:主要分为 video 输出系统和 audio 输出系统.对于 video 输出系统是将 YUV,RGB 或其他类型原始数据送到芯片显示系统,有的芯片底层有硬件加速功能。这部分功能比较简单,就是将数据送到屏幕,实现原理和具体芯片方案有很大的关系。对于 audio 输出系统是将PCM 数据送到 audio HAL 层处理后最后从给speaker 输出.