FFmpeg开发笔记(十四)FFmpeg音频重采样的缓存
也就是说,重采样函数swr_convert一次只会输出指定长度的音频数据,超出这个长度的数据被留在重采样的缓存当中。那么在对一个音频文件转换格式之时,有可能所有音频帧都遍历完了,重采样缓存里面还保存着剩余未取走的音频数据。此时要像对待视频编码缓存那样,想办法把剩下的音频数据冲出来。
具体到代码实现上,在调用swr_convert函数之时,倒数第二个参数填NULL,表示输入的数据内容为空;倒数第一个参数填0,表示输入的数据大小为0。这便告诉采样器,已经没有要转换的音频了,请把缓存中剩余的数据冲出来吧。那么swr_convert函数的返回值就是本次冲走的输出数据大小,当返回值为0时,表示重采样缓存已经冲光了,再也没有剩余的数据了,此时才能结束音频的格式转换操作。
当然,对于常见的mp3和aac格式,它们每帧的长度是固定的,正常情况调用一次swr_convert函数即可输出完整的音频数据,无需另外处理重采样缓存。只有ogg、amr、wma等格式的每帧音频长度不固定,才需要额外处理音频的重采样缓存,于是对《FFmpeg开发实战:从零基础到短视频上线》一书第五章的重采样代码改动如下。
打开chapter05/swrmp3.c,把下面这行
改为下面几行(因为ogg、amr和wma的frame_size为0,所以需要另外赋值):
另外在轮询数据包的循环结束之后,补充下面的重采样缓存冲刷代码,这样新生成的音频文件才是完整的:
接着执行下面的编译命令。
编译完成后执行以下命令启动测试程序,期望把ring.ogg重采样后保存为MP3文件。
程序运行完毕,发现控制台输出以下的日志信息,说明完成了对ogg文件重采样mp3音频的操作。
然后打开影音播放器可以正常播放output_swrmp3.mp3,表示上述代码正确实现了将ogg音频数据重采样再转存MP3文件的功能。