2015-08-14 67 views
1

我想從本地文件上用RTP傳輸的mpegts複製一堆SD源。 (VBR mpeg2video,mp2音頻)。它工作正常的一個組播源用下面的命令:Ubuntu中的FFmpeg RTP網絡問題

ffmpeg -i rtp://@IP1:PORT -c copy video1.mpg 

但是當我跑了第二ffmpeg的情況下使用下面的命令:

ffmpeg -i rtp://@IP2:PORT -c copy video2.mpg 

然後我得到了來自FFmpeg的情況下錯誤(」 RTP:丟棄收到的舊數據包太晚「),並在兩個文件(video1.mpg和video2.mpg)中錄製來自第二個來源(rtp:// @ IP2:PORT)的視頻。

這個問題只發生在Linux(我查了Ubuntu 14.04 - 16.04)。我在Windows中沒有問題,並且可以正確地從文件並行轉碼視頻。在Ubuntu下,即使兩個調諧到不同來源的ffplay實例也會播放相同的內容(來自最後打開的來源)。我試着用VLC回放,沒有這樣的問題。

我可以使用FFmpeg的使用-f選項時解決此問題:
ffmpeg的-f MPEGTS -i RTP:// @ IP1:PORT -c複製video1.mpg

ffmpeg的-f MPEGTS -i rtp:// @ IP2:PORT -c複製video2.mpg,但後來出現以下錯誤:「[mpegts @ 0x306e240] PES數據包大小不匹配」並接收這兩個文件(video1.mpg和video2 .mpg)與工件和凍結效果。兩個操作系統都會出現此問題。

如何在Ubuntu下同時在多個RTP流中使用FFmpeg對視頻進行編碼轉換,而不會出現錯誤和僞像?

+0

你解決你的問題?我得到了RTP包丟失,並且圖片丟失了錯誤。 –

+1

使用udp到http代理(udpxy)爲我解決了這個問題。 –

+0

我想在android中運行ffmpeg,所以我想我不能使用udpxy解決方案。你同意增加最大UDP緩衝區大小可以幫助嗎? –

回答

3

更新:

如果使用多播組,您可能需要設置sources參數接收來自指定地址發送的報文。

源地址= [,地址]

僅接收來自發送方指定的IP地址中的一個發送到多播組的數據包。

ffmpeg -i rtp://[multicast-address]:port?sources=xxx


這很可能是你的Linux機器上造成的undersized receive buffer。既然你提到SD,它必須設置的很低。

可以以字節獲得當前值:

sysctl net.core.rmem_max

,並設置一個新值:

sysctl -w net.core.rmem_max=26214400

或編輯/etc/sysctl.conf

+0

感謝您的回覆。我將net.core.rmem_max設置爲26214400. net.core.rmem_max的值爲212992.還嘗試更改net.core.rmem_default的值,但不幸的是這沒有幫助。 –

+0

如果兩個帶有2個不同源的'ffplay'命令發揮相同的作用,那麼你的組播可能有問題。另一端有什麼傳輸? – aergistal

+0

更新了答案 – aergistal

0

這是不是最好的解決方案,但可以解決此問題。
我跑udpxy如下:udpxy -p 5556
然後運行下列方式的ffmpeg:ffmpeg -i http://0.0.0.0:5556/rtp/239.255.1.1:5044