本文已参与「新人创作礼」活动, 一起开启掘金创作之路。
文件信息
封装格式
封装格式也叫容器,是指使用什么样的文件协议来存储音视频数据。一般来说与其文件扩展名具有强相关性。常见的封装格式包括 mp4、mkv、avi、flv 等。不同的封装格式的文件有不同的头部信息,也支持不同的音视频编码格式。
总比特率
音频、视频、及可能存在的其他数据的码率之和,即存放一秒钟的音视频信息需要多少比特的字节数。
流
视频数据、音频数据、字幕数据等在文件中或者在传输过程中是线性存储的,因此又称为视频流、音频流、字幕流。因此,在文件中可能会引起困惑,文件中怎么存放呢?其实是三种流数据交叉存放,每帧数据上有特殊的变量标记该帧数据是视频、音频还是字幕。同样,也会有可能有一个文件会有多个视频流、音频流、字幕流,因此还有流索引值(stream id)来标记该帧的数据是具体属于哪一个数据流的。
流信息
编码格式
编码格式是指文件内部具体的某一数据流(视频流、音频流、字幕流等)特定的编码的协议,如常见的视频编码格式包括 h264、h265、av1 等,常见的音频编码格式包括 aac、mp3、flac 等。同一种封装格式支持多种不同的编码格式,例如 MP4 内部的视频可以是 h264,也可以是 h265。
分辨率 pi x pi
画幅大小,宽、高方向上各用多少个像素点来描绘这个画面。
因此,分辨率越大,编解码压力越大,速度越慢,但经过放大后的画质越好,文件也越大。
帧率 frames / second
每秒钟有多少帧,每一帧就是一个不同的画面。每一帧就是一个需要编码、解码的单位。
因此,帧率越高,画面连续性越好,但编码压力、解码压力(工作量)都会越大,编码速度、解码速度都会越慢。由于一秒钟存储的画面越多,所以文件也会越大。
码率/比特率/位率 bits / second
视频中,每秒钟的画面需要多少位的数据来存储。因此,分辨率、帧率、编码格式、时长等其他参数均相同时,码率越大,文件越大,画面质量越好。
音频中,每秒钟的声音需要多少位的数据来存储。
采样率 Hz 次 / second
声音是连续的波,音频数据是对声音按照一定的采样率对声波进行离散的采样保存下来的值的集合。因此采样率即每秒钟对声波有多少次的采样,显然,采样率越高,对声音保存的信息越完整,也显然将占用更多的数据空间。常见的采样率有 44.1kHz,48kHZ。
时间基 time base
编解码器计算某一帧视频画面或某一段音频采样点的显示时刻(渲染时刻)时的一个换算基准。例如 44.1kHz 采样率的音频的时间基一般为 1/44100,因此,假设一段音频的播放时刻是整个文件的第 2.5 秒时,则其 pts = 2.5 * 44100 = 110250。常见的 h264 的时间基为 1/10240,因此如果一帧视频的 pts = 20480,则其应该被显示在第 2 秒时。
帧信息
I 帧 P 帧 B 帧
I 帧
I 帧是关键帧(Intra Picture),又称帧内编码帧,解码器可以只用一个 I 帧就解码出一个画面。所以,I 帧的大小是三种帧里最大的。压缩率最低,只压缩了空间上的冗余信息。
P帧
P 帧是参考帧(predictive-frame) ,确切地说是前向预测编码帧。需要依靠前面的 I 帧或者 P 帧才能编解码。压缩率比 I 帧高,压缩了时间上的冗余信息,或者说提取了运动特性,压缩率约在 20 左右,几乎所有的 H 264 编码流都带有大量的 P 帧。
B帧
B 帧是双向预测帧,全称为双向预测内插编码帧(bi-directional interpolatedprediction frame),这个帧比较特殊,存储的是本帧与前后帧的差别,因此带 B 帧的视频在解码时逻辑更复杂,CPU 开销更大。因为是前后双向预测参考,所以,B 帧需要其后的 P 帧解码后才能被解码,因此这将导致解码顺序和展示(显示)顺序的不一致,将引入 DTS 和 PTS 的概念。B 帧的压缩率最高,因此,有 B 帧会减小文件大小,但是因为需要其后的 P 帧作参考才能被解码,所以带 B 帧会降低其实时性,编解码速度也会更慢。
IDR 帧
IDR (Instantaneous Decoding Refresh),即使解码刷新。IDR 帧是一种特殊的 I 帧,作用是立刻刷新,使错误不至于传播下去,从 IDR 帧开始,重新算一个新的序列开始编解码。
GOP
Group Of Pictures,一般来说,是指两个 I 帧之间的距离。显然,同样时长的文件,GOP 越大,I 帧越少,文件越小,但视频的画面质量将越差。参考传声筒游戏,越长,后面走样越严重。
PTS DTS
DTS 是 Decoding Time Stamp,即解码时间戳,其告诉我们解码器该在什么时候解码这一帧数据。因为通常把视频刚开始显示时,或者音频刚开始播放时的那一刻称为 0 时刻,因此 dts 是有负值的,这很容易理解,需要在展示之前就把它解码好。
PTS 即 Presentation Time Stamp,即展示(显示)时间戳,告诉我们播放器该在什么时候显示/播放这一帧的数据。
因为 B 帧是前后双向参考帧,因此,有 B 帧的视频文件其存放的视频帧数据 dts 是顺序的,但 pts 不是。
像素格式
存放同样一张图像,有不同的像素格式,最简单的想法是利用光的三原色,分别记录每个像素的红绿蓝色分量,然后不同数值的三个分量的光混合到一起就会组合出各种颜色,但是这种存放需要较多的数据来记录。后来又发现了各种新的像素格式,或者说色彩空间,例如YUV(Ycbcr) 等,记录同一张图像,不同的颜色格式占用的空间不一样。
宽、高、像素格式确定后,一张图像至少需要多少内存来存放就确定了。
字节对齐
为啥说是至少需要多少内存呢?是因为图像编码时,尤其是 h264 编码过程中,会有宏块的概念,即把一整张图像划分成若干个 16 * 16 或者 32 * 32 的小图像,然后利用多线程或者显卡并行编码压缩,因此,通常来说,一个 720 * 1080 的视频解码后的画面大小通常是 736 * 1088。
采样格式
对应于视频中的像素格式,音频中,用多少数据、怎样的数据来存放一个采样点的信息,也包括多种格式,例如 S8,S16,FLT 等,分别是指使用 8 位 short,16 位 short,以及 32 位 浮点型数据来存储,因此,音频的位深度可以由采样格式确定。
声道分布
常见的声道为左声道、右声道、单声道、立体声、环绕立体声等。声道分布是一个枚举值,他们相互之间也是满足相互组合关系的。例如立体声是左声道和右声道的组合,环绕立体声是立体声和中央半声道的组合。因此,声道数可以由声道分布确定。
确定了声道数、音频位深、采样率之后,一秒钟的音频数据大小 = 声道数 × 采样率 × 位深。