web-dev-qa-db-ja.com

Raspberry Piのavconv(ffmpeg)は、抽出されたビデオ静止画像を破損することがよくあります

RaspberryPiでavconvを使用して、H.264ビデオのRTSPストリームを使用してIPカメラから静止画像をフェッチしようとしています。

$ 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のCPUがビデオのデコードに追いついていないために、いくつかの問題が発生しています。そのため、結果のJPEGが破損することがあります。

corrupted video frame

おそらく80%の確率で上記のコマンドから有効な画像を取得できますが、20%の確率で上記の画像を取得すると、ライブビデオフィードからタイムラプスをコンパイルする計画にレンチが投げ込まれます。追加した -fflags discardcorrupt役立つと思いましたが、あまり効果がなかったようです。単一の画像のみを取得したいので、1秒の期間が定義されて-r1fps未満に設定されています。

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
Weston Ruter

TFMから:

原則として、オプションは次に指定されたファイルに適用されます。したがって、順序は重要であり、コマンドラインで同じオプションを複数回使用できます。次に、各オカレンスが次の入力ファイルまたは出力ファイルに適用されます。このルールの例外は、最初に指定する必要があるグローバルオプション(詳細レベルなど)です。

したがって、コマンドラインの-fflags destroycorruptは、outputファイルに適用されます。入力ファイルに適用する場合は、-iの前に移動します。

パケットが破損していないように見えるので、ストリームがキーフレームで開始されないだけなので、それが役立つとは思えません。これに対する解決策は、選択フィルターを使用して、キーフレームを取得するまで待機することです。 -vf'select = eq(pict_type \、I) '

また、コマンドラインに関するいくつかのランダムなコメント:

  • -vsync 1は、すでに-rを指定している場合は何もしません。 -vsync 1(新しいバージョンではエイリアス-vsync cfr)は、CFR出力が必要であることを意味します。フレームレートは、入力ファイルから取得されるか、-rで指定されたものです。したがって、-rは自動的に-vsync1を意味します。
  • フレームが1つだけ必要な場合は、-t 00:00:01 -r0.1のようなハックを使用する必要はありません。 -frames1とだけ言ってください。
2
elenril