本文主要是介绍用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。
视频没有问题,音频用flash player播放是静音的。
用VLC播放音视频都正常。
用windows版ffplay播放音视频也正常。
其实仔细看,会发现vlc、ffplay虽然能够播放声音,但是他们显示音频是44100Hz,而不是实际的48000Hz。
将nginx-rtmp录制的flv文件下载下来分析
发现录制的文件没有AudioSpecificConfig(ASC)信息。有同学问什么是ASC,可以看这里。前面有篇文章介绍了在windows下编译ffmpeg,打开这个debug一下看看。
这里flvenc.c中函数flv_write_header中,单步调试一下,
红圈标注的位置条件为假,所以没有正确的写入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
原文链接:http://www.jianshu.com/p/55325f29ae5a
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
这篇关于用ffmpeg拉流HLS转推至nginx-rtmp-module没有声音的问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!