使用LibAV解码UDP流:缓冲区大小不足

时间:2012-03-22 20:41:49

标签: c++ qt4 udp h.264 libav

我正在尝试使用带有Qt的libav库来解码h.264 UDP视频流,但是当我使用avformat_open_file时,我收到以下错误消息:

[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:// ipaddress:port”。

如果有人可以为我解释这个问题,我将不胜感激!

3 个答案:

答案 0 :(得分:1)

当您尝试将UDP数据报读入太小的缓冲区时,会发生该错误。由于UDP不保证传递,因此根据实现情况,该数据包会被截断(或丢弃)。

通过快速查看文档,您可以在网址(See section 6.16 UDP)上指定数据报大小作为选项。

尝试将您的网址更改为:udp://ipaddress:port?buffer_size=10240

答案 1 :(得分:1)

在进行了更多挖掘后,看起来FFMPEG希望您在通过UDP流式传输原始H.264时首先将流编码为MPEGTS。果然,将输出流编码为MPEGTS就可以了。

答案 2 :(得分:0)

确保将buffer_sizepkt_size选项设置得足够大。

udp,因为任何其他协议(例如tcpsctp)都可以提供通用格式(因此mpegtsnutmkv )或者您可以使用rtprtsp以及相应的格式