ffplay实时处理变速音频卡顿问题求助
兄弟我太懂你这种头疼的情况了!用ffmpeg实时把自己的语音变速,再用ffplay通过管道播放,结果音频断断续续卡顿,暂停一下再继续就正常,加了-re还不管用,确实挺闹心的。
先给你分析下问题根源:ffplay默认是跟着系统实时时钟来同步播放的,但你用ffmpeg变速后的音频,数据的时间轴和系统时钟已经不匹配了——比如你把语音加速到2倍,那音频数据的生成速率是原速率的2倍,但ffplay还是按原实时速度去播放,就会出现缓冲区数据跟不上或者溢出的情况,自然就卡顿了。而暂停的时候,ffplay会把管道里的音频数据先填满缓冲区,恢复播放时就有足够的数据支撑,所以就流畅了。
下面给你几个实用的解决方案,你可以挨个试试:
让ffplay跟着输入流的时间戳同步播放:用
-sync ext参数,这个参数会让ffplay放弃系统时钟,转而根据输入音频流的时间戳来调整播放速度,完美适配变速后的数据流。你的播放命令可以改成:ffplay -sync ext pipe:配合你之前的ffmpeg变速命令一起用,应该能解决核心的同步问题。
增大ffplay的音频缓冲区:给ffplay分配更大的缓冲空间,让它能提前存储更多变速后的音频数据,避免因为数据供应不及时导致卡顿。可以用
-buffer_size参数调整缓冲区大小,比如:ffplay -buffer_size 2097152 pipe:这里的数值是字节数,2097152就是2MB,你可以根据实际情况往上调,比如4MB(4194304)试试。另外也可以用音频滤镜来优化缓冲:
ffplay -af "aresample=async=1:min_hard_comp=0.1:first_pts=0" pipe:这个滤镜会让音频重采样时更灵活地处理同步问题,减少卡顿。
别用
-re参数! 你之前加的-re是让ffmpeg按原实时速率输出数据,但你已经做了变速处理,这个参数反而会强制限制ffmpeg的输出速率,导致变速后的音频数据供应不足,卡顿更严重,所以果断去掉它就对了。
要是单个参数效果不够,还可以把-sync ext和-buffer_size结合起来用,比如:
ffplay -sync ext -buffer_size 2097152 pipe:
你可以先从-sync ext开始试,这个应该是最直接解决同步问题的方法,大概率能搞定你的卡顿情况。
备注:内容来源于stack exchange,提问作者boplip

