On 06/26/2012 04:02 AM, Alex Cohn wrote:
The demonstrated effect could easily be explained by lost packets.
With a UDP stream, some packets can be lost. You could try to improve
the situation on the receiver side by making your socket buffers
larger, but the problem may be out of your control. For example, with
WiFi such behavior, especially with high bitrates, is quite typical.

For large frames (even as small as 1280x720), the way libavcodec works might be the culprit: It sets the UDP socket buffer size to 64K by default (which IIRC linux interprets to mean 128K, still small; not sure about other operating systems). If you give the UDP url yourself, you can add a ?buffer_size= parameter to fix this. However, if the URL is constructed by e.g. RTSP, there is no way to specify a buffer size. On the cameras I use, an I-frame at 1280x720 of a typical scene is often 300K and almost always >200K - so packet loss is essentially guaranteed for almost every I-frame.

If the original poster is using rtsp, they might need to switch to rtsp/tcp until this is fixed, even if there is no UDP packet loss at the network level.

I pointed this out in <http://ffmpeg.org/pipermail/libav-user/2012-February/001294.html>; I've just noticed it was sent as HTML for some reason, so I'm copying again here in case this is relevant and hard to find or was impossible to read back then:

----

If you look at udp.c (just git pulled), routine udp_open actually parses the URI looking for libav-specific instructions such as "reuse", "ttl", "localport", "pkt_size", "buffer_size", "connect" and "localaddr". Specifically, the "buffer_size" parameter (which defaults to UDP_MAX_PKT_SIZE=65536 for reading) is used to set the UDP buffer size. I need to increase that buffer size significantly (to > 256KB) so that packets don't get lost., because I-frames at 1280x720 are already 220KB/sec. I can recompile replacing the default buffer_size from UDP_MAX_PKT_SIZE to (e.g.) 4*UDP_MAX_PKT_SIZE, but I'd rather do that with configuration and use a stock libav.

So, the question is: given that I'm passing an rtsp url ("rtsp://a.b.c.d/axis-media/media.amp"), how do I set buffer_size and/or ttl? There does not appear to be an avoption based way to do that, but maybe I'm missing something?

(This is also relevant to setting the timeout for tcp transports, and I guess; although the http transport does seem to get its parameters from avoptions; and rtsp does pass "localport", "ttl" and "connect" parameter to udp somehow)


_______________________________________________
Libav-user mailing list
[email protected]
http://ffmpeg.org/mailman/listinfo/libav-user

Reply via email to