2012-03-22 76 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和分别耦合格式