命令行很簡單儒鹿,如下
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所在的服務(wù)器拉一路HLS直播流馆截,轉(zhuǎn)推給ip2所在的服務(wù)器上的nginx-rtmp。
視頻沒有問題朽色,音頻用flash player播放是靜音的。
用VLC播放音視頻都正常金矛。
用windows版ffplay播放音視頻也正常毙玻。
其實仔細(xì)看,會發(fā)現(xiàn)vlc、ffplay雖然能夠播放聲音歹垫,但是他們顯示音頻是44100Hz剥汤,而不是實際的48000Hz。
將nginx-rtmp錄制的flv文件下載下來分析
發(fā)現(xiàn)錄制的文件沒有AudioSpecificConfig(ASC)信息排惨。有同學(xué)問什么是ASC吭敢,可以看這里。前面有篇文章介紹了在windows下編譯ffmpeg暮芭,打開這個debug一下看看鹿驼。
這里flvenc.c中函數(shù)flv_write_header中,單步調(diào)試一下辕宏,
紅圈標(biāo)注的位置條件為假畜晰,所以沒有正確的寫入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