ffmpeg jpg帧捕获 - 如何丢弃损坏的帧

时间:2017-08-31 14:12:05

标签: ffmpeg jpeg video-processing corruption

我使用ffmpeg 2.2.2(Windows)将实时摄像机流导出到JPG帧中。我正在使用命令行:

ffmpeg -err_detect aggressive -i rtsp://[ip address]:554/11 -r 1 -s 640x320 -an -f image2 c:\temp\snapshots\snapshot-%03d.jpg

这将启动一个连续过程,从实时流中每秒输出大约1帧。但是,在导出期间的不同时间,ffmpeg会抛出这样的错误:

[h264 @ 00037ae0] RTP: missed 2 packets=00:01:09.00 bitrate=N/A dup=0 drop=1186
[h264 @ 02fbc340] Cannot use next picture in error concealment
[h264 @ 02fbc340] concealing 4386 DC, 4386 AC, 4386 MV errors in P frame
[h264 @ 00037ae0] RTP: missed 13 packets
[h264 @ 02fbf7a0] left block unavailable for requested intra mode at 0 15p=1196
[h264 @ 02fbf7a0] error while decoding MB 0 15, bytestream 128288
[h264 @ 02fbf7a0] concealing 6409 DC, 6409 AC, 6409 MV errors in I frame

然而,它继续创建一个已损坏的jpg文件。例如,文件的顶部很好,但是相同的像素会抹掉图像的其余部分。这是一个例子: enter image description here

如何强制ffmpeg 1)保存后丢弃这些损坏的图像,或者2)简单地写下"不要写"像这样的错误发生后,图像到文件?

我认为err_detect标志可能有所帮助,但似乎没有任何区别。

2 个答案:

答案 0 :(得分:6)

您可以在输入上尝试discardcorrupt标志。完整的命令行是:

ffmpeg -err_detect aggressive -fflags discardcorrupt -i rtsp://[ip address]:554/11 -r 1 -s 640x320 -an -f image2 c:\temp\snapshots\snapshot-%03d.jpg

答案 1 :(得分:2)

我已经通过强制ffmpeg使用tcp而不是udp来解决此问题。您的命令将如下所示:

添加-rtsp_transport tcp

ffmpeg -rtsp_transport tcp -i rtsp://<ip_camera_url> -r 1 -s 640x320 -an -f image2 c:\temp\snapshots\snapshot-%03d.jpg