1

Я использую avconv на Raspberry Pi, чтобы попытаться получить неподвижное изображение с IP-камеры с потоком RTSP видео H.264:

$ avconv -v verbose -i $url -fflags discardcorrupt -t 00:00:01 -r 0.1 -an -vsync 1 -qscale 1 -f image2 images%09d.jpg

У меня возникли некоторые проблемы, предположительно потому, что процессор на Pi не может поспевать за декодированием видео, поэтому иногда результирующий JPEG-файл искажается, например:

поврежденный видеокадр

Вероятно, в 80% случаев я могу получить действительное изображение с помощью приведенной выше команды, но в 20% случаев я получаю вышеупомянутое изображение, которое вбивает ключ в мои планы по компиляции промежутка времени из прямой трансляции видео. Я добавил -fflags discardcorrupt думая, что это поможет, но, похоже, это мало что дало. Я хочу получить только одно изображение, поэтому определена длительность 1 секунда, а -r - менее 1 кадра в секунду.

Что я могу сделать, чтобы avconv только когда-либо выводил правильные кадры видеокадров?

Вывод из вызова avconv который привел к повреждению кадров видео:

avconv version 0.8.4-6:0.8.4-1+rpi1, Copyright (c) 2000-2012 the Libav developers
  built on Nov  5 2012 22:22:18 with gcc 4.6.3
  configuration: --arch=arm --enable-pthreads --enable-runtime-cpudetect --extra-version='6:0.8.4-1+rpi1' --libdir=/usr/lib/arm-linux-gnueabihf --prefix=/usr --disable-yasm --enable-bzlib --enable-libdc1394 --enable-libdirac --enable-libfreetype --enable-frei0r --enable-gnutls --enable-libgsm --enable-libmp3lame --enable-librtmp --enable-libopencv --enable-libopenjpeg --enable-libpulse --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-vaapi --enable-vdpau --enable-libvorbis --enable-libvpx --enable-zlib --enable-gpl --enable-postproc --enable-swscale --enable-libcdio --enable-x11grab --enable-libx264 --enable-libxvid --shlibdir=/usr/lib/arm-linux-gnueabihf --enable-shared --disable-static
  libavutil    51. 22. 1 / 51. 22. 1
  libavcodec   53. 35. 0 / 53. 35. 0
  libavformat  53. 21. 0 / 53. 21. 0
  libavdevice  53.  2. 0 / 53.  2. 0
  libavfilter   2. 15. 0 /  2. 15. 0
  libswscale    2.  1. 0 /  2.  1. 0
  libpostproc  52.  0. 0 / 52.  0. 0
[rtsp @ 0x930680] SDP:
v=0
o=- 1357489248942653 1 IN IP4 192.0.1.123
s=LIVE555 Streaming Media v
i=LIVE555 Streaming Media v
t=0 0
a=tool:LIVE555 Streaming Media v2010.04.09
a=type:broadcast
a=control:*
a=range:npt=0-
a=x-qt-text-nam:LIVE555 Streaming Media v
a=x-qt-text-inf:LIVE555 Streaming Media v
m=video 0 RTP/AVP 96
c=IN IP4 0.0.0.0
b=AS:1000
a=rtpmap:96 H264/90000
a=fmtp:96 packetization-mode=1;profile-level-id=64001F;sprop-parameter-sets=J2QAH62IDkOYIOEMKQpEByHMEHCGFIUiA5DmCDhDCkKQwEIYwhxmMhCGAhDGEOMxkIQwEIYwhxmMhCICEZjOI8KfEfiP4j8R8R4ziMREQoEIjEcR4j5PxH8n5PiPEcRkiLQHgLdgKpAAAAMAEAAAAwPGBAAExLAAExLL3vheEQjU,KO48sA==
a=control:track1
m=audio 0 RTP/AVP 97
c=IN IP4 0.0.0.0
b=AS:64
a=rtpmap:97 MPEG4-GENERIC/8000
a=fmtp:97 streamtype=5;profile-level-id=1;mode=AAC-hbr;sizelength=13;indexlength=3;indexdeltalength=3;config=1588
a=control:track2

[h264 @ 0x9345a0] Missing reference picture
[h264 @ 0x9345a0] decode_slice_header error
[h264 @ 0x9345a0] concealing 2700 DC, 2700 AC, 2700 MV errors
[h264 @ 0x9345a0] concealing 2454 DC, 2454 AC, 2454 MV errors
[rtsp @ 0x930680] Estimating duration from bitrate, this may be inaccurate
Input #0, rtsp, from 'rtsp://192.0.1.123:554':
  Metadata:
    title           : LIVE555 Streaming Media v
    comment         : LIVE555 Streaming Media v
  Duration: N/A, start: 0.000000, bitrate: N/A
    Stream #0.0: Video: h264 (High), yuvj420p, 960x720 [PAR 1:1 DAR 4:3], 30 fps, 30 tbr, 90k tbn, 60 tbc
    Stream #0.1: Audio: aac, 8000 Hz, mono, s16
[buffer @ 0x9fa5c0] w:960 h:720 pixfmt:yuvj420p
Output #0, image2, to 'images%09d.jpg':
  Metadata:
    title           : LIVE555 Streaming Media v
    comment         : LIVE555 Streaming Media v
    encoder         : Lavf53.21.0
    Stream #0.0: Video: mjpeg, yuvj420p, 960x720 [PAR 1:1 DAR 4:3], q=2-31, 200 kb/s, 90k tbn, 0.10 tbc
Stream mapping:
  Stream #0:0 -> #0:0 (h264 -> mjpeg)
Press ctrl-c to stop encoding
[h264 @ 0x9345a0] Missing reference picture
[h264 @ 0x9345a0] decode_slice_header error
[h264 @ 0x9345a0] concealing 2700 DC, 2700 AC, 2700 MV errors
*** drop! 1 fps=  0 q=1.0 size=      -0kB time=10.00 bitrate=  -0.0kbits/s    
*** drop! 2 fps=  1 q=1.0 size=      -0kB time=20.00 bitrate=  -0.0kbits/s dup=0 drop=1    
    Last message repeated 1 times
[h264 @ 0x9345a0] concealing 2454 DC, 2454 AC, 2454 MV errors
*** drop!
error while decoding MB 15 2, bytestream (-17)=20.00 bitrate=  -0.0kbits/s dup=0 drop=4    
[h264 @ 0x9345a0] concealing 2614 DC, 2614 AC, 2614 MV errors
*** drop!
error while decoding MB 23 29, bytestream (-9)=20.00 bitrate=  -0.0kbits/s dup=0 drop=5    
[h264 @ 0x9345a0] concealing 986 DC, 986 AC, 986 MV errors
*** drop!
error while decoding MB 5 35, bytestream (-13)=20.00 bitrate=  -0.0kbits/s dup=0 drop=6    
[h264 @ 0x9345a0] concealing 644 DC, 644 AC, 644 MV errors
*** drop!
error while decoding MB 39 15, bytestream (-37)20.00 bitrate=  -0.0kbits/s dup=0 drop=7    
[h264 @ 0x9345a0] concealing 1810 DC, 1810 AC, 1810 MV errors
frame=    2 fps=  0 q=1.0 Lsize=      -0kB time=20.00 bitrate=  -0.0kbits/s dup=0 drop=7    
video:75kB audio:0kB global headers:0kB muxing overhead -100.028494%

1 ответ1

2

Из ПМФ:

Как правило, параметры применяются к следующему указанному файлу. Следовательно, порядок важен, и вы можете иметь один и тот же параметр в командной строке несколько раз. Каждое вхождение затем применяется к следующему входному или выходному файлу. Исключением из этого правила являются глобальные параметры (например, уровень детализации), которые должны быть указаны в первую очередь.

Таким образом, -fflags discardcorrupt в вашей командной строке применяется к выходному файлу. Если вы хотите применить его к входному файлу, переместите его перед -i.

Я сомневаюсь, что это поможет, хотя, поскольку кажется, что пакеты не повреждены, просто поток не запускается на ключевом кадре. Решением этой проблемы будет использование фильтра выбора для ожидания получения ключевого кадра: -vf 'select = eq(pict_type\, I)'

Также некоторые случайные комментарии в вашей командной строке:

  • -vsync 1 ничего не делает, если вы уже указали -r. -vsync 1 (псевдоним -vsync cfr в более новых версиях) означает, что вы хотите вывод CFR. Частота кадров либо берется из входного файла, либо задается параметром -r. Таким образом, -r автоматически подразумевает -vsync 1.
  • Если вам нужен только один кадр, нет необходимости использовать такие хаки, как -t 00:00:01 -r 0.1. Просто скажи -кадры 1.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .