最近一个项目是做环形四麦智能音箱,使用的是思必驰的语音服务,在进行TTS转换时,思必驰text转sppech的音频流是MP3编码格式的,而我的设备端要播放的音频是PCM格式,所以需要进行MP3转PCM之后再进行播放。刚开始是基于Madplay工具实现了转码功能。虽然功能实现了,但是由于libmad是在回调函数output中给出转码后的数据,不方便在我代码中进行逻辑控制,而且这个项目平台SDK已经集成了FFMPEG库,所以想到了换用FFMPEG来实现转码。但在使用过程中碰到如下问题:
第一次MP3流转换时可以正常播放,第二次转换时,av_parser_parse2()接口返回的一帧数据长度不对,导致报错:[mp3 @ 0x7f64000ae0] Header missing。
现象是成功转码一条TEXT之后,下一条就开始报错。猜想应该是第一条MP3数据转换完成之后,没有正常通知解码器“数据结束”。
于是增加一次“数据后处理”,即在转码完成后,通过avcodec_send_packet发送一次空数据给解码器:
增加这一步操作之后,就不再报Header missing的错误了,播放正常。