导读
前面我们介绍了使用FFmpeg解码视频,今天我们使用FFmpeg解码音频。我们的目标将mp4中的音频文件解码成PCM数据,并输出到本地文件,然后使用ffplay播放验证。
音频的解码过程就是将经过压缩后的数据重新还原成原始的PCM声音信号的过程。对于音频解码所用到的API和视频解码是一样的。
PCM基础知识
PCM是指未经过压缩的原始声音脉冲信号数据,它主要通过采样率、采样格式(比如每个采样点是8位、16位、32位等)、声道数来描述。
在FFmpeg中有两种表示PCM数据包的模式,分别是planer和packed模式,那么它们有什么区别呢?其中packed又叫做交错模式,而planer又叫平面模式,所谓交错或平面就是不同声道的声音信号排列储存的方式,例如对于一个双声道的PCM数据来说,用packed模式表示是这样子的:
而用laner模式表示的话,则是这样子的:
在FFmpeg中,packed模式的格式有:
它的数据只存在于AVFrame的data[0]中。
而planer模式一般是FFmpeg内部储存音频所使用的模式,例如通过一般planar模式的后面都有字母P标识,planar模式的格式有:
例如对于一帧planar格式的双声道的音频数据,AVFrame中的data[0]表示左声道的数据,data[1]表示的是右声道的数据。
在FFmpeg中我们可以使用函数来判断采样格式是planar模式还是packed模式。
需要注意的一点是planar仅仅是FFmpeg内部使用的储存模式,我们实际中所使用的音频都是packed模式的,也就是说我们使用FFmpeg解码出音频PCM数据后,如果需要写入到输出文件,应该将其转为packed模式的输出。
我们可以使用ffplay播放PCM原始音频数据,命令是:
音频解码
直接上代码吧,有注释:
以下是实现文件:
todo
析构函数释放资源,时间篇幅问题,就不写了。。。
领取专属 10元无门槛券
私享最新 技术干货