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

音视频文件是经过编码、封装而成的。那么反过来,要播放音视频文件,首先得解封装、解码。上一篇博客讨论到音视频编码:走进音视频的世界——音视频编码,我们来个上下呼应,本文与大家探讨一下音视频解码。本质上,是按照既定的解码协议去解析编码内容,也就是编码的逆过程。常见的视频解码器有: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、组包与拼帧

有些封装格式会把一帧数据拆成若干包,因为关键帧数据可能比较大;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有定义,如下表所示:

长度内容说明
ckID4Chunk ID: "fmt ",FOURCC四字节码,注意最后一个填充是空格。
cksize4Chunk size: 16 or 18 or 40
nChannels2Number of interleaved channels,声道数(交织存储)
nSamplesPerSec4Sampling rate (blocks per second),音频采样率
nAvgBytesPerSec4Average bytes rate,音频平均码率
nBlockAlign2Data block size (bytes),音频数据块大小(单位字节)
wBitsPerSample2Bits per sample,量化位数(比如8bits、16bits、32bit
cbSize2Size of the extension (0 or 22),扩展字段长度
wValidBitsPerSample2Number of valid bits,有效的位长度
dwChannelMask4Speaker position mask,声道描述掩码
SubFormat16GUID, 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

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

声道数声道布局描述
1mono<FC>
2stereo(FL, FR)
33.0<FC>, (FL, FR)
44.0<FC>, (FL, FR), <BC>
55.0<FC>, (FL, FR), (SL, SR)
65.1<FC>, (FL, FR), (SL, SR), <BC>, [LFE]
76.1<FC>, (FL, FR), (SL, SR), <RC>, [LFE]
87.1<FC>, (FCL, FCR), (FL, FR), (SL, SR), [LFE]

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

可以到GitHub一起学习音视频:GitHub - xufuji456/FFmpegAndroid: android端基于FFmpeg实现音频剪切、拼接、转码、混音、均衡器音效;视频剪切、水印、截图、转码、编解码、转Gif动图;FFmpeg本地推流、H264与RTMP实时推流直播;FFmpeg滤镜,歌词解析,音视频学习路线,音视频知识总结、流媒体协议​​​​​​​

  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

徐福记456

您的鼓励和肯定是我创作动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值