avconv (ffmpeg) em Raspberry Pi frequentemente corrompe imagens fixas de vídeo extraídas

1

Estou usando avconv em um Raspberry Pi para tentar obter uma imagem estática de uma câmera IP com um fluxo RTSP de vídeo 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

Estou tendo alguns problemas, presumivelmente porque a CPU no Pi não consegue acompanhar a decodificação do vídeo, então, às vezes, o JPEG resultante está corrompido, por exemplo:

Provavelmente, em 80% das vezes, recebo uma imagem válida do comando acima, mas em 20% das vezes recebo a imagem acima, o que me ajudaria a compilar um lapso de tempo de um feed de vídeo ao vivo . Eu adicionei -fflags discardcorrupt achando que ajudaria, mas isso não parece fazer muito. Eu só quero obter uma única imagem, então é por isso que existe a duração de 1 segundo definida e -r , que é definido para ser menor que 1fps.

Qualquer coisa que eu possa fazer para garantir que avconv apenas exiba fotos de quadros de vídeo válidas?

A saída de uma invocação de avconv que resultou em frames de quadros de vídeo corrompidos:

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%
    
por Weston Ruter 13.01.2013 / 09:48

1 resposta

2

Do TFM:

As a general rule, options are applied to the next specified file. Therefore, order is important, and you can have the same option on the command line multiple times. Each occurrence is then applied to the next input or output file. Exceptions from this rule are the global options(e.g. verbosity level), which should be specified first.

Assim -fflags discardcorrupt em sua linha de comando se aplica ao arquivo output . Se você quiser aplicar ao arquivo de entrada, mova-o antes de -i.

No entanto, duvido que ajude, pois parece que os pacotes não estão corrompidos, apenas o fluxo não inicia em um quadro-chave. Uma solução para isso seria usar o filtro de seleção para aguardar até obter um quadro-chave: -vf 'select = eq (pict_type \, I)'

Além disso, alguns comentários aleatórios na sua linha de comando:

  • -vsync 1 não faz nada se você já estiver especificando -r. -vsync 1 (alias -vsync cfr em versões mais recentes) significa que você quer saída CFR. A taxa de quadros é retirada do arquivo de entrada ou é a especificada por -r. Então -r implica automaticamente -vsync 1.
  • Se você quiser apenas um quadro, não há necessidade de usar hacks como -t 00:00:01 -r 0.1. Apenas diga -frames 1.
por 13.01.2013 / 10:11