2012-03-22 51 views
2

我試圖使用libav庫使用Qt爲H.264視頻UDP流進行解碼,但是當我使用avformat_open_file,我收到以下錯誤信息:解碼UDP流與LibAV:沒有足夠的緩衝區大小

[udp @ 0x102b5bee0] Part of datagram lost due to insufficient buffer size 

消息出現約10次,然後嘗試失敗。我試圖同時解碼4個不同的UDP流,每個流的幀率爲25fps。 Wireshark表示數據包在3000到10000字節之間。

這是我的呼籲avformat_open_input:

avformat_open_input(&formatContext, udpUrl.toStdString().c_str(), NULL, NULL) 

formatContext在這個調用時的時間NULL,並且udpUrl的格式爲 「UDP:// IP地址:端口」。

如果有人能爲我解釋這個問題,將不勝感激!

+0

這也發生在RTSP流,沒有解決方案似乎工作 – 2015-03-13 11:21:43

回答

1

了一下週圍挖經過它看起來像FFMPEG希望你將流過UDP流原始H.264時,首先編碼爲MPEGTS。果然,將輸出流編碼爲MPEGTS的確有訣竅。

+0

祝賀修復!如果可以,請確保將答案標記爲「已接受」,以便其他人會看到您的問題已得到解答,並能夠從您的解決方案中學習。乾杯〜 – 2012-03-30 16:12:59

+0

啊,謝謝你的提醒! – 2012-03-30 21:45:27

+0

你如何能夠將輸入流編碼爲MPEGTS?它也是ffmpeg的另一端,或者你在使用不同的庫嗎?或者,也許你在本地使用ffmpeg? – njahnke 2012-09-06 18:28:56

1

當您嘗試將UDP數據報讀取到太小的緩衝區時發生此錯誤。由於UDP不保證傳送,因此根據實現情況,此數據包只會被截斷(或丟棄)。

從快速瀏覽文檔看來,您可以在網址(See section 6.16 UDP)上指定數據報大小作爲選項。

試着改變你的網址是這樣的:udp://ipaddress:port?buffer_size=10240

+0

感謝您指向我的文檔。這有很大幫助。儘管如此,我還是嘗試了buffer_size的幾個不同的值,沒有任何改變。將pkt_size設置爲大約10000會消除所有錯誤消息,但我仍然從UDP流中收到錯誤的數據。 – 2012-03-22 22:58:30

0

確保您將buffer_sizepkt_size選項設置得足夠大。

udp,因爲任何其它協議(例如tcpsctp)可以提供通用的格式(因此mpegtsnutmkv),也可以使用rtprtsp和分別耦合格式