用ffmpeg拉流HLS转推至nginx-rtmp-module没有声音的问题

命令行很简单,如下

ffmpeg -re -analyzeduration 8000 -probesize 200000 -i http://ip1/test.m3u8 -strict -2 -c:v copy -c:a copy -bsf:a aac_adtstoasc -f flv rtmp://ip2/test/1

从ip1所在的服务器拉一路HLS直播流,转推给ip2所在的服务器上的nginx-rtmp。

用ffmpeg拉流HLS转推至nginx-rtmp-module没有声音的问题_第1张图片

视频没有问题,音频用flash player播放是静音的。

用ffmpeg拉流HLS转推至nginx-rtmp-module没有声音的问题_第2张图片

用VLC播放音视频都正常。

用ffmpeg拉流HLS转推至nginx-rtmp-module没有声音的问题_第3张图片

用windows版ffplay播放音视频也正常。

用ffmpeg拉流HLS转推至nginx-rtmp-module没有声音的问题_第4张图片

其实仔细看,会发现vlc、ffplay虽然能够播放声音,但是他们显示音频是44100Hz,而不是实际的48000Hz。

将nginx-rtmp录制的flv文件下载下来分析

用ffmpeg拉流HLS转推至nginx-rtmp-module没有声音的问题_第5张图片
用ffmpeg拉流HLS转推至nginx-rtmp-module没有声音的问题_第6张图片
用ffmpeg拉流HLS转推至nginx-rtmp-module没有声音的问题_第7张图片

发现录制的文件没有AudioSpecificConfig(ASC)信息。有同学问什么是ASC,可以看这里。前面有篇文章介绍了在windows下编译ffmpeg,打开这个debug一下看看。

用ffmpeg拉流HLS转推至nginx-rtmp-module没有声音的问题_第8张图片

这里flvenc.c中函数flv_write_header中,单步调试一下,

用ffmpeg拉流HLS转推至nginx-rtmp-module没有声音的问题_第9张图片

红圈标注的位置条件为假,所以没有正确的写入AAC sequence header,如果在这里硬编码写入AAC sequence header,声音就正常了。

最简单的解决方法,就是自己重新做一下音频编码。

ffmpeg -re -analyzeduration 8000 -probesize 200000 -i http://ip1/test.m3u8 -strict -2 -c:v copy -c:a aac -bsf:a aac_adtstoasc -f flv rtmp://ip2/test/1

上面的方法简单粗暴,但是会浪费CPU时间,有位大神在去年12月提交了一个补丁 [FFmpeg-devel] [PATCH] AAC sequence header data setup if stream copy,很好的解决这个问题。

-aac_seq_header_data "1190" 这样是直接硬编码AudioSpecificConfig(ASC),最新的代码已删除,只有前面两个了。正确的命令行是(前提是你的ffmpeg代码要是2015.12以后的)

ffmpeg -re -analyzeduration 8000 -probesize 200000 -i http://ip1/test.m3u8 -strict -2 -bsf:a aac_adtstoasc -c copy -flvflags aac_seq_header_detect -f flv rtmp://ip2/test/1

你可能感兴趣的:(用ffmpeg拉流HLS转推至nginx-rtmp-module没有声音的问题)