用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
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值