首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

FFmpeg 推流 RTMP 到 Nginx 丟包?命令無誤,多半是網絡抖動或編碼器不匹配

     編輯:程式設計綜合問答

用 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

潛在問題點

1. `-vcodec copy` 直接複製視頻流,但 RTSP 可能是 H.264 Annex B 格式,RTMP 需要 AVCC(含 NALU 長度前綴)

修正:加上 -bsf:v h264_mp4toannexb(若源是 AVCC 轉 Annex B)或 -bsf:v h264_annexbtoavcc(反之)。實測多數 IPC 輸出 Annex B,推 RTMP 需轉 AVCC:

-vcodec copy -bsf:v h264_annexbtoavcc

2. `-s 640x480` 強制縮放,但未重新編碼,導致分辨率不匹配

複製視頻流時 -s 無效。需解碼再編碼:

-vcodec libx264 -vf scale=640:480 -preset veryfast -tune zerolatency

3. 音頻重採樣參數衝突

-ar 44100 -ac 1 強制單聲道 44.1kHz,若源是 48kHz 立體聲會導致重採樣側漏。建議保持原採樣或統一 48kHz:

-acodec aac -ar 48000 -ac 2 -b:a 128k

4. 網絡層面

  • RTSP over TCP 更穩:-rtsp_transport tcp。
  • 增加緩衝:-fflags nobuffer -flags low_delay -max_delay 500000。
  • 檢查 Nginx 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 幀序列號是否連續,定位是編碼端還是傳輸層問題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved