用 FFmpeg 將 IPC 的 RTSP 拉流轉推 RTMP 到 Nginx-RTMP 再切 HLS,現象是持續丟包、畫面花屏。命令參數看似正確,實則藏著幾個關鍵坑。
ffmpeg -i rtsp://admin:12345@172.27.35.56 \
-vcodec copy -acodec aac -ar 44100 -strict -2 -ac 1 \
-f flv -s 640x480 \
rtmp://172.27.35.2:1935/hls/test2
修正:加上 -bsf:v h264_mp4toannexb(若源是 AVCC 轉 Annex B)或 -bsf:v h264_annexbtoavcc(反之)。實測多數 IPC 輸出 Annex B,推 RTMP 需轉 AVCC:
-vcodec copy -bsf:v h264_annexbtoavcc
複製視頻流時 -s 無效。需解碼再編碼:
-vcodec libx264 -vf scale=640:480 -preset veryfast -tune zerolatency
-ar 44100 -ac 1 強制單聲道 44.1kHz,若源是 48kHz 立體聲會導致重採樣側漏。建議保持原採樣或統一 48kHz:
-acodec aac -ar 48000 -ac 2 -b:a 128k
-rtsp_transport tcp。-fflags nobuffer -flags low_delay -max_delay 500000。proxy_buffering off; proxy_cache off; 避免轉發延遲。ffmpeg -rtsp_transport tcp -i rtsp://admin:12345@172.27.35.56 \
-vcodec libx264 -vf scale=640:480 -preset veryfast -tune zerolatency \
-bsf:v h264_annexbtoavcc \
-acodec aac -ar 48000 -ac 2 -b:a 128k \
-f flv -flvflags no_duration_filesize \
rtmp://172.27.35.2:1935/hls/test2
若網絡確無丟包(iperf3 雙向跑滿帶寬無丟包),上述參數通常能穩定推流。若仍丟包,抓包分析 RTMP 幀序列號是否連續,定位是編碼端還是傳輸層問題。