背景
在生产环境中,我们使用ffmpeg进行视频转码,将RTSP转HLS或者FLV在web端观看.每一路视频对应一个ffmpeg进程.一直都跑的挺好的.
问题
最近运维人员发现一个故障点:
有一路视频停了,其它都正常.
排查
检查后发现该路视频的确不正常:
- 看进程输出的
m3u8
和ts
,长时间不更新了. - 看任务管理器,该路
ffmpeg
进程存在,但是其IO
确实不正常,基本上不变,而其它路的IO
都是持续增长的.这说明一个问题,该路ffmpeg
进程阻塞了.
生产环境需要尽快恢复,所以我重启了一下这个进程,问题解决.但是墨菲定律告诉我们,这个问题发生了,那肯定会继续发生下去.所以要排查原因.
过程十分艰苦,但最终发现似乎是因为aac编码阻塞
导致的,网上也有类似的问题反馈:
https://stackoverflow.com/questions/2410459/encode-audio-to-aac-with-libavcodec
以及:
https://ffmpeg.org/pipermail/libav-user/2011-August/000501.html
阻塞点是aacenc
里面aac_encode_frame
进入了无限循环无法退出,就是这个:
这个代码横竖看不懂,我猜是因为aac编码时,默认需要一个合适的固定码率,