FFmpeg 傳遞 MPEG 傳輸流會導致流中出現錯誤和故障

FFmpeg 傳遞 MPEG 傳輸流會導致流中出現錯誤和故障

Unbescholtener Bürger 帶著另一個 FFmpeg 問題回來了。我的目標是運行一個 FFmpeg 實例,該實例透過 RTP 接收 mpeg 傳輸流,對接收到的流執行任意操作,例如轉碼或過濾,然後透過 RTP 傳遞更改後的傳輸流。

但是,即使是最基本的配置,我也無法讓它工作:我有一個 .ts 文件,其中包含一個由一個視訊和一個音訊串流組成的程式。我使用 FFmpeg 的實例將此檔案串流傳輸到本機:

ffmpeg -re -i 1.ts -c copy -f rtp_mpegts rtp://127.0.0.1:5003

使用 ffplay,我驗證它是否正常工作:

ffplay -i rtp://127.0.0.1:5003

結果看起來不錯,聽起來不錯,不會在控制台上導致錯誤訊息。

現在我嘗試在兩者之間放入另一個 FFmpeg 實例,但事情開始走下坡路。我只想 FFmpeg 將流從連接埠 5003 複製到連接埠 5005,而不進行任何進一步的處理或轉碼:

ffmpeg -re -probesize 50M -analyzeduration 50M -i rtp://127.0.0.1:5003?fifo_size=10000 -c copy -f rtp_mpegts rtp://127.0.0.1:5005

我在該控制台上收到大量重複出現的錯誤訊息,當我使用 ffplay 監視連接埠 5005 上的串流時,會出現大量偽影、故障和遺失。控制台輸出大部分看起來像這樣:

...
Input #0, rtp, from 'rtp://127.0.0.1:5003?fifo_size=10000':
  Duration: N/A, start: 1.400022, bitrate: N/A
  Program 1 
    Metadata:
      service_name    : Service01
      service_provider: FFmpeg
    Stream #0:0: Video: h264 (Constrained Baseline) ([27][0][0][0] / 0x001B), yuv420p(progressive), 352x240 [SAR 1:1 DAR 22:15], 29.97 fps, 29.97 tbr, 90k tbn, 59.94 tbc
    Stream #0:1: Audio: ac3 ([129][0][0][0] / 0x0081), 44100 Hz, stereo, fltp, 192 kb/s
Output #0, rtp_mpegts, to 'rtp://127.0.0.1:5005':
  Metadata:
    encoder         : Lavf58.2.102
    Stream #0:0: Video: h264 (Constrained Baseline) ([27][0][0][0] / 0x001B), yuv420p(progressive), 352x240 [SAR 1:1 DAR 22:15], q=2-31, 29.97 fps, 29.97 tbr, 90k tbn, 29.97 tbc
    Stream #0:1: Audio: ac3 ([129][0][0][0] / 0x0081), 44100 Hz, stereo, fltp, 192 kb/s
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
  Stream #0:1 -> #0:1 (copy)
Press [q] to stop, [?] for help
frame=    0 fps=0.0 q=-1.0 size=       0kB time=00:00:00.48 bitrate=   0.0kbits/s speed=0.957x
frame=    0 fps=0.0 q=-1.0 size=       0kB time=00:00:01.01 bitrate=   0.0kbits/s speed=0.991x
frame=    0 fps=0.0 q=-1.0 size=       0kB time=00:00:01.53 bitrate=   0.0kbits/s speed=1.01x 
frame=    1 fps=0.5 q=-1.0 size=      57kB time=00:00:02.05 bitrate= 227.6kbits/s speed=1.01x 
frame=   17 fps=6.7 q=-1.0 size=      83kB time=00:00:02.54 bitrate= 267.6kbits/s speed=   1x 
frame=   32 fps= 11 q=-1.0 size=     121kB time=00:00:03.04 bitrate= 324.9kbits/s speed=   1x 
[rtp @ 0x3db64c0] max delay reached. need to consume packet
[rtp @ 0x3db64c0] RTP: missed 50 packets
[rtp @ 0x3db64c0] PES packet size mismatch
frame=   37 fps= 10 q=-1.0 size=     132kB time=00:00:04.07 bitrate= 266.0kbits/s speed=1.15x frame=   37 fps=9.1 q=-1.0 size=     132kB time=00:00:04.07 bitrate= 266.0kbits/s speed=1.01x 
[rtp @ 0x3db64c0] max delay reached. need to consume packet
[rtp @ 0x3db64c0] RTP: missed 1 packets
[rtp @ 0x3db64c0] PES packet size mismatch
[rtp @ 0x3db64c0] max delay reached. need to consume packet
[rtp @ 0x3db64c0] RTP: missed 1 packets
frame=   47 fps= 10 q=-1.0 size=     150kB time=00:00:04.57 bitrate= 269.3kbits/s speed=1.01x
...

那麼...知道出了什麼問題以及如何修復它嗎?查看資源監視器並沒有發現任何高 CPU、記憶體或網路負載。

答案1

顯然我的問題是-re啟動直通 FFmpeg 實例的命令中的標誌。

如果我事先查看過官方文檔,我就不會問這個問題:

-re(輸入)

以本機幀速率讀取輸入。主要用於模擬抓取設備或即時輸入流(例如從檔案讀取時)。不應與實際的抓取設備或即時輸入流一起使用(可能會導致資料包遺失)。

http://ffmpeg.org/ffmpeg.html#Advanced-options

這正是發生在我身上的事。

相關內容