走进音视频的世界——音视频解码

音视频文件是经过编码、封装而成的。那么反过来,要播放音视频文件,首先得解封装、解码。上一篇博客讨论到音视频编码:走进音视频的世界——音视频编码_徐福记456-CSDN博客,我们来个上下呼应,本文与大家探讨一下音视频解码。本质上,是按照既定的解码协议去解析编码内容,也就是编码的逆过程。常见的视频解码器有:H264、H265、VP8、VP9、MPEG4、MJPEG、WMV3、MSMPEG4V3,常见的音频解码器有:MP3、AAC、FLAC、AC3、OPUS、VORBIS、AMR、WMA。

一、视频解码

1、pts与dts

dts:Decode Timestamp,解码时间戳,决定什么时候解码该帧数据。

pts:Presentation Timestamp,显示时间戳,决定什么时候显示该帧图像。以参考时钟为基准,超前参考时钟则等待,落后(在30ms与500ms之间)参考时钟则快速渲染,十分落后(超过500ms)参考时钟则丢弃该帧。参考时钟分为三种:系统时钟、音频时钟、视频时钟。一般以音频时钟作为参考时钟,因为人类对声音更加敏感,相对图像而言。

2、关键帧与非关键帧

关键帧:I帧为关键帧,所以I帧可以直接解码还原出一个图像。

非关键帧:P帧与B帧为非关键帧,需要依赖关键帧才能解码。而B帧是双向预测帧,还要另外等待下一个I帧或P帧,才可以成功解码出来。B帧压缩率比较高,但是编解码复杂度也相对高。

3、组包与拼帧

有些封装格式会把一帧数据拆成若干包,比如wmv格式,因为关键帧数据可能比较大;RTP封装数据时,也会把一帧拆成若干包,因为MTU规定网络层最大传输单元为1500bytes。因此,在解封装或者接收网络数据包时,需要根据序号排列,把若干个包组成一个完整包,然后再解码。例如FFmpeg读取一帧数据过程,源码在avformat/utils.c中,如下图所示(参考雷神博客):

                                                    图1—FFmpeg 读帧数据过程 

4、特定帧头

在解析h264/h265编码的视频帧时,需要在帧头添加起始码,一般起始码为0x00 0x00 0x01或者0x00 0x00 0x00 0x01。比如mp4封装格式,一般是以h264为视频编码、aac为音频编码。

二、音频解码

1、planar与packed存储

planar:每个声道数据单独存储。以立体声道为例,L表示左声道,R表示右声道。那么存储格式为LLLLRRRR。在FFmpeg中,第i个声道数据存储在frame->data[i]。类似视频的像素格式YUV420P,Y、U、V三个分量单独存储,4个Y分量对应一个U分量与一个V分量。

packed:所有声道数据交错存储。同样地,以立体声道数据为例。那么存储格式为LRLRLRLR。在FFmpeg中,所有声道数据都存储在frame->data[0]。类似视频的YUV420SP,Y独立存储,UV交错存储,4个Y分量对应一组UV分量。

2、量化位数

量化位数:量化位是对模拟音频信号的幅度轴数字化,它决定了模拟信号数字化的动态范围。量化位数越大,质量越好。bitsPerSample,占2bytes,一般为8bits、16bits、32bits、64bits。在WAVE的Format chunk有定义,如下表所示:

长度 内容说明
ckID 4 Chunk ID: "fmt ",FOURCC四字节码,注意最后一个填充是空格。
cksize 4 Chunk size: 16 or 18 or 40
nChannels 2 Number of interleaved channels,声道数(交织存储)
nSamplesPerSec 4 Sampling rate (blocks per second),音频采样率
nAvgBytesPerSec 4 Average bytes rate,音频平均码率
nBlockAlign 2 Data block size (bytes),音频数据块大小(单位字节)
wBitsPerSample 2 Bits per sample,量化位数(比如8bits、16bits、32bit
cbSize 2 Size of the extension (0 or 22),扩展字段长度
wValidBitsPerSample 2 Number of valid bits,有效的位长度
dwChannelMask 4 Speaker position mask,声道描述掩码
SubFormat 16 GUID, including the data format code

                                                    表1—Format chunk结构


       3、采样率

音频采样率是指录音设备在1秒时间内对声音信号的采样次数,采样频率越高,那么声音的还原越真实自然。常见的采样率有8000Hz、16000Hz、32000Hz、44100Hz、48000Hz。其中44100Hz可达到CD音质标准,也是目前最为常用的采样率。

4、声道数与声道布局

常见声道数有:单声道、立体声道、3声道、4声道、5声道、6声道、7声道、8声道。其中3声道以上,又称为立体环绕声道,其中杜比音效就是采用多声道同时输出,实现立体环绕效果。

声道布局的各个声道描述如下:

   FC: front center
   BC: back center
   FL/FR: front left/right
   FCL/FCR: front center left/right
   FTL/FTR: front top left/right
   SL/SR: back surround left/right
   BL/BR: back left/right
   LFE: low frequency effects

声道数与声道布局关系,如下表所示:

声道数 声道布局 描述
1 mono <FC>
2 stereo (FL, FR)
3 3.0 <FC>, (FL, FR)
4 4.0 <FC>, (FL, FR), <BC>
5 5.0 <FC>, (FL, FR), (SL, SR)
6 5.1 <FC>, (FL, FR), (SL, SR), <BC>, [LFE]
7 6.1 <FC>, (FL, FR), (SL, SR), <RC>, [LFE]
8 7.1 <FC>, (FCL, FCR), (FL, FR), (SL, SR), [LFE]

                                                          表2—声道数与声道布局关系

可以到GitHub一起学习音视频:https://github.com/xufuji456/FFmpegAndroid​​​​​​​

猜你喜欢

转载自blog.csdn.net/u011686167/article/details/108743947