自己最近一直做关于音频编解码,播放以及转码的东西。总结一下关于这方面的知识。
先说关于播放的问题,大致步骤是:FFMPEG音频解码=>SDL进行播放pcm数据。在这里遇到的问题:1.解码的时候,文件格式不对,不是S16的格式,之后使用ffmpeg中重采样模块来操作,成功播放;2.一般来说,网络上下载的音频文件采样率一般都是44100的,解码后的数据采样率也必须是44100,否则播放会失败。进行解码重采样的时候,需要更改采样率和格式,这样,才会成功,一般来说,我们所需要的pcm数据文件都是8000赫兹,16bit,1通道。大家可以去参考雷神的代码,百度一下就可以搜索到。但是雷神的代码有一个问题:只能修改解码后的数据格式为S16,当修改采样率的时候,获取的pcm数据是失败的。之后,在ffmepg官网上找到重采样的示例代码,经过自己的调试,是可以进行更改采样率的。
第二个是编码的问题,其实这个问题倒是不大,不过自己需要主要一点,不管是解码还是编码,采样率是不能进行修改的,否则会导致获取的数据文件是不对的。除非进行重采样来修改采样率。
第三个是转码的问题,这个是自己遇到问题最多的地方。雷神有类似的代码,可以去参考。自己就说一下自己遇到的问题吧。总的来说,步骤是音频文件解码再进行编码。由于转码前后的音频文件是不同的。导致音频文件每一帧解码后的数据多少和文件编码每一帧所需要的数据多少是不同的(nb_samples),所以,进行操作的时候,需要利用ffmepg提供的avfifo管道模块来进行操作,把解码的数据放入管道中,根据编码需要的数据量来进行取出数据。这个问题解决了,一般就没有什么大问题了。
其实,ffpemg官网中提供了很多的示例,不过,有的示例不太对头,需要修改一下,是不能copy下来直接使用的。还有,ffmpeg的API更新很快,很多接口都需要修改的。不过,思路是借鉴的。