最近在做音频相关的开发,有需求把pcm,opus格式的音频转码成wav格式的。首选是通过ffmpeg命令转码,以opus转码为例,因为我们音频的采样率是16k,通过命令
ffmpeg -i origin.opus -acodec pcm_s16le -ac 1 -ar 16000 origin.wav -y
可以正常转成wav格式。转码之后的header如图1:
但是因为存在一种根深蒂固的思想,wav格式的音频有44个字节的header头,如图2所示,这是普遍认为的wav格式的音频。有关header的详细描述https://www.jianshu.com/p/b7cadd3e9c4d在这个文章中有很详细的描述,这边就不描述了。当时以为转码之后的wav格式的音频的header头固定只有44个字节,但是转码成功之后的文件比例一直不对,查看了整个wav的二进制文件,发现header头不太正常,看到了上面的文章,才知道通过ffmpeg转码之后的wav文件的header会大于44个字节的,如图1所示,因为生成的header中包含一些metadata (artist, genre, 等) ,LIST那块的数据就是。但是问题来了,在现实需求中,很多地方对音频的处理会限制死header为44个字节,至少我看了好多音频处理在处理header的时候,直接就剪掉了44个字节,所以如果这样ffmpeg转码出来的wav音频就不满足需求。经过查找资料,发现了下面的ffmpeg命令是可以解决这个问题的:
ffmpeg -i origin.opus -map_metadata -1 -fflags +bitexact -acodec pcm_s16le -ac 1 -ar 16000 origin.wav -y
这个指令其实就是将metadata移除掉,图2就是通过上面的命令转码得到的数据,可以看到header长度为44个字节,通过这个指令就可以正常获取到44个字节的header头的wav文件了。