[Libav-user] Problema with RTP stream (h264)
i.like.privacy.too at gmail.com
Thu Oct 17 14:31:26 CEST 2013
On 10/15/2013 02:21 PM, Rafa Lopez wrote:
> ./ffmpeg -i "rtsp://192.168.0.95:554/profile1
> <http://192.168.0.95:554/profile1>" -y %6d.jpg -log-level debug
> The problem is that I always get corrupt images (example attached). I
> think the problem is
> [h264 @ 0x1c28d60] RTP: missed 146 packets
> [AVIOContext @ 0x7f3190016d20] Statistics: 0 seeks, 3 writeouts
> [h264 @ 0x1f82300] concealing 2237 DC, 2237 AC, 2237 MV errors in I frame
> [h264 @ 0x1fc7160] Frame num gap 8 6
> RTP missed packets. I attach the full log. Anyone can help me?
No way to properly solve with ffmpeg configuration at this point,
although adding "-rtsp_transport tcp" before "-y" will reduce the pain
Unfortunately, the udp layer will set it's SO_RCVBUF kernel buffer to at
most 64K, (which e.g. Linux will translate to a 128K buffer). That
practically guarantees that any single frame larger than 128K (e.g., an
average I-frame in an 1280x720 stream) will not fit within the kernel
socket buffers, resulting in at least one packet (and part of the frame)
dropped, thus the corruption you see.
I do not know of a way to ask FFMPEG to properly increase the UDP kernel
buffer size. I had patched my own ffmpeg to set SO_RCVBUF to 1024K, and
it worked for me. But then I switched to TCP and stopped worrying (Using
TCP instead DOES introduce latency and waste bandwidth, because packets
are getting lost and retransmitted, but I don't care about another 10ms
or 10% higher bandwidth as I'm on a local network).
The udp layer does have a "buffer_size" parameter, but there's no way
that I'm aware of to pass it to the udp layer through the rtsp layer.
More information about the Libav-user