来源 | HaaS技术社区
1. 前言
多媒体是什么?
维基百科的解释是:多媒体(Multimedia),在电脑应用系统中,组合两种或两种以上媒体的一种人机交互式资讯交流和传播媒体。使用的媒体包括文字、图片、照片、声音(包含音乐、语音旁白、特殊音效)、动画和影片,以及程序所提供的互动功能。目前为止,多媒体的应用领域已涉足诸如广告、艺术,教育,娱乐,工程,医药,商业及科学研究等行业。在物联网场景,多媒体的应用也越来越多。但不管是怎么样的使用场景,多媒体涉及到基础原理和底层知识都是一致的。
本文将聚焦在说明多媒体世界中的视频文件是怎么播放出来的。一个多媒体文件播放涉及到哪些过程?人体通过肉眼看到画面、通过耳朵听到视频声音,这中间经过了哪些处理?本文将尽可能通过简单易懂的文字讲述一个视频文件的播放流程。
2. 播放链路(Pipeline)
一个播放器的构成或者播放器的pipeline虽然有不同的实现,但大多遵循以下的流程:
这些部分功能大致如下:
- MediaSource:视频源文件的来源
- Demux:音视频数据分离
- Video\Audio Decode:音视频数据解码
- Video\Audio Ouput:音频数据外放、视频帧渲染
- AVSync:音视频同步
3. MediaSource
接下来从视频源开始讲起。视频源也就是MediaSource,MediaSource也就是多媒体的数据源,这些数据源包括:
- 本地存储介质的视频文件,uri以“file:\\“前缀;
- 来源于网络http协议传输,uri以“http:\”前缀;
- 来源于网络rtsptp协议传输,uri以“rtsp:\”前缀;
MediaSource实现一般会有read、seek的抽象,根据不同的source来源有不同read、seek操作的实现;这些实现为后续的AV Demux提供数据输入流。
4. Demux
有了视频源之后,接下来就是要把获取到的音视频文件做基本的分析处理了,这里就必须要提到Demux了。Demux部分起到的作用是把音视频文件或者音视频数据流中的音频数据与视频数据分离,分离供后续的音视频decode分别解码。
在demux部分不得不提到AVFormat的概念,这个可以理解为音视频的数据的封装格式,封装格式的意义在于把视频帧与音频帧按照一定格式交织封装,便于存储、传输及分离。
AVFormat封装格式的意义是什么呢?
倘若没有封装格式的交织封装,那会出现大段的视频数据后接音频数据的情况,在最终音视频同步输出方面是不利的,一个好的封装格式可以减少更少的AV数据缓存,即可做到音视频数据同步。
介绍了一些AVFormat的概念,那当在讲AVFormat的时候,到底讲的是什么?其实在日常的接触中,已经有打过照面了,比如大家熟知的视频文件后缀如.mp4、.mp3、.ts、.mkv,这些都是通过文件后缀看到AVFormat。
下面以MP4格式为例简单介绍一下AVFormat的具体内容:
(图片来源:https://www.cnblogs.com/CoderTian/p/8277965.html)
MP4格式就是由一个个的box组合成的box树,所有的数据都包含在box里,下面来了解一下box的基本结构。一个box是由box header和box里面包含的数据组成的,如下图所示:
(图片来源:https://www.cnblogs.com/CoderTian/p/8277965.html)
整个box以box header开头,box header中包含了box的大小(size)和类型(type)等信息。其中,size指明了整个box所占用的大小,包括header部分,如果box很大(例如存放具体视频数据的mdat box),超过了uint32的最大数值,size就被设置为1,并用接下来的64位uint64的largesize来存放大小。box中的字节序为网络字节序,也就是大端字节序(Big-Endian)。box根据header部分包含的信息的不同可以分为box和full box。
一个MP4文件中,主要需要了解的是存储音视频的metadata和音视频数据的box,metadata主要在moov box,音视频数据在mdat box中。
5. Video Decode
解析了音视频文件之后,接下来就需要对音视频分别进行解码了。这里先来看看视频解码。Video Decode就是视频解码,在提到视频解码之前,需要先看一下什么是视频帧。
5.1 视频帧介绍
视频都是由静止的画面组成的, 这些静止的画面被称为帧。为了节省存储空间和传输带宽,视频帧都是通过某个特定的压缩算法压缩而成的,根据压缩算法,视频帧又分为I帧、P帧和B帧。
- I帧(I frame)
又称为内部画面 (intra picture),I 帧通常是每个 GOP(MPEG 所使用的一种视频压缩技术)的第一个帧,经过适度地压缩,做为随机访问的参考点,可以当成图像。I帧的编码流程如下:
而解码刚好利用了DCT转化的可逆性,是编码流程的逆过程。
- P帧
前向预测编码帧。P帧表示的是这一帧跟之前的一个关键帧(或P帧)的差别,解码时需要用之前缓存的画面叠加上本帧定义的差别,生成最终画面。
- B帧
双向预测内插编码帧。B帧是双向差别帧,也就是B帧记录的是本帧与前后帧的差别,换言之,要解码B帧,不仅要取得之前的缓存画面,还要解码之后的画面,通过前后画面的与本帧数据的叠加取得最终的画面。
5.2 色彩空间
I帧、P帧、B帧decode完可以理解为是一帧帧画面,图像的组成可以理解为一个个像素组成,像素的表示涉及到色彩空间,常见的色彩空间包括如下:
- RGB
工业界的一种颜色标准,是通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红、绿、蓝三个通道的颜色,这个标准几乎包括了人类视力所能感知的所有颜色,是目前运用最广的颜色系统之一。
- YUV
YUV是编译true-color颜色空间(color space)的种类,YUV、YCbCr、YPbPr等专有名词都可以称为YUV,彼此有重叠。“Y”表示明亮度灰阶值,“U”和“V”表示的则是色度,作用是描述影像色彩及饱和度,用于指定像素的颜色。
- YUV 4:4:4采样,每一个Y对应一组UV分量。
- YUV 4:2:2采样,每两个Y共用一组UV分量。
- YUV 4:2:0采样,每四个Y共用一组UV分量。
在多媒体视频领域,多用的是YUV的颜色空间。
6. Audio Decode
看完了视频解码,接下来可以来看看音频解码了,Audio Decode就是音频解码。
6.1 audio 编解码介绍
- MP3
MP3即MPEG Audio LayerIII,是一种数字音频编码和有损压缩格式,它被设计来大幅降低音频数据量,通过舍弃PCM音频数据中对人类听觉不重要的部分,达成压缩成较小文件的目的。MP3编码的流程如下:
- AAC
出现于1997年,基于MPEG-2的音频编码技术。由Fraunhofer IIS、杜比实验室、AT&T、Sony等公司共同开发,目的是取代MP3格式。2000年,MPEG-4标准出现后,AAC重新集成了其特性,加入了SBR技术和PS技术,为了区别于传统的MPEG-2 AAC又称为MPEG-4 AAC。
- AC3
AC3(全称Audio Coding3音频编码3)是杜比数码的同义词,杜比数码是一种高级音频压缩技术,它最多可以对6个比特率最高为448kbps的单独声道进行编码
音频数据decode完是一些列的PCM数据。
6.2 PCM介绍
即脉冲编码调制(Pulse Code Modulation,PCM),PCM中,channel的概念。PCM数据靠一个个sample采样描述,用一个个非连续的采样点描述现实中连续的声纹。
channel
- Mono:单声道
- Stereo:立体声,双声道
- 四声环绕
- 5.1声道:杜比、dts
- 7.1声道
sample 位深,即每个sample数据的精度,bit数
- U8:无符号8bit
- S8:有符号8bit
- S\U16LE\BE:有\无符号小\大端16bit
- S\U32LE\BE:有\无符号小\大端32bit
- F32:Float 32bit
sample rate,即每秒采样数
- 8kHz
- 16kHz
- 32kHz
- 44.1kHz
- 48kHz
- ...
7. AVsync
音视频最终渲染输出时,要考虑音视频的同步。在音视频同步中,不得不先了解PTS与DTS的概念。
- PTS
即Presentation Time Stamp,显示时间戳,代表了每一个音视频帧的显示时间戳。
- DTS
即Decode Time Stamp,解码时间戳,代表每一帧音视频帧的decode时间戳。
以下是PTS\DTS的例子:
图片从左至右是视频帧的先后文件组织顺序,也是dts的先后顺序,上面标示的是PTS的顺序即显示的顺序,所以看到第三帧画面是再第四个顺序显示的。
AVSync的方法:
Audio Master
Audio Master即以audio的pts作为视频的参考时钟,让audio数据按照自己的pts顺序播,视频显示时参考音频当前的pts,以决定当前视频帧是要repeat还是因为太迟丢弃。在存在音频数据的情况下, 这个是通常的AVSync方式,原因如下:
- 人耳对声音的敏感度是高于视频的,丢音频帧会明显感觉到声音异常或者pupu音。
- 音频数据采样率是固定的,采样率固定的情况下,数据的输出速度是持续平稳的,这是一个天然优势的时间参考依据。
Video Master
通常在无音频数据时作为参考。
外部时钟作为Master
这个是音视频pts都遵照外部时钟作为参考。
8. Video Render
视频的输出显示需要依靠Video Render来完成。Video 的渲染显示一般基于一些图形库做,比如SDL\OpenGL等等,这些都可以作为图形显示的技术模块,在android上有基于OpenGL封装的surface view,借助surfaceflingle显示。AliOS Things上会有HaaS UI。图形渲染也是一块比较专业的知识,后续会用其他文章来介绍。
9. Audio Output
音频的输出播放需要依靠Audio Output来完成。Audio Output部分是讲PCM数据交到音频设备播放,常见的选择有ALSA等实现。AliOS Things上会有A2SA。音频播放也是一块比较专业的知识,后续会用其他文章来介绍。
10. 总结
到这里一个视频文件总算是播放出来了,是不是非常不容易?这里面确实也涉及到很多专业知识,但总结起来你只要记住4个要素就可以了:
- 视频文件来源
- 视频文件格式解析及音视频数据分离
- 音视频解码
- 音视频播放及同步
是不是又觉得没那么复杂?愿大家在知识的海洋中能找到最适合自己的学习方式,不断学习,保持进步!
更多精品好文