web-dev-qa-db-fra.com

ffmpeg pour capturer des images fixes à partir d'un flux H.264

J'essaie de capturer des images fixes à partir d'une caméra IP sans fil H.264 à l'aide de ffmpeg. J'ai trouvé une question similaire ici: Comment puis-je extraire une image JPEG de bonne qualité à partir d'un fichier vidéo H264 avec ffmpeg?

ffmpeg -y -i rtsp://10.2.69.201:554/ch0_0.h264 -r 10 -f image2 /var/www/camera.jpg

Je l'ai implémenté comme indiqué dans cet exemple. Vous pouvez voir un échantillon de l'image que je reçois ici:

Fondamentalement, le problème est que la partie inférieure de l'image est toujours encombrante. Si le ciel a plus de détails et des nuages, toute la moitié inférieure de l’image peut être bouchée ou floue.

Ma caméra a des options de flux limitées. L’un d’eux est l’intervalle I-Frame, vous pouvez le varier entre 25 et 100.

Quelqu'un a-t-il des suggestions sur la manière d'obtenir une meilleure image? Cela ne me dérangerait pas s'il était possible de stocker le flux dans un fichier vidéo et d'extraire une image fixe toutes les 2 minutes. Est-ce quelque chose de facile à faire?

Voici la sortie de ffmpeg:

ffmpeg version 1.2.4 Copyright (c) 2000-2013 the FFmpeg developers
built on Oct  3 2013 07:36:02 with gcc 4.8 (Debian 4.8.1-10)
configuration: --prefix=/usr --extra-cflags='-g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security ' --extra-ldflags='-Wl,-z,relro' --cc='ccache cc' --enable-shared --enable-libmp3lame --enable-gpl --enable-nonfree --enable-libvorbis --enable-pthreads --enable-libfaac --enable-libxvid --enable-postproc --enable-x11grab --enable-libgsm --enable-libtheora --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libx264 --enable-libspeex --enable-nonfree --disable-stripping --enable-libvpx --enable-libschroedinger --disable-encoder=libschroedinger --enable-version3 --enable-libopenjpeg --enable-librtmp --enable-avfilter --enable-libfreetype --enable-libvo-aacenc --disable-decoder=amrnb --enable-libvo-amrwbenc --enable-libaacplus --libdir=/usr/lib/i386-linux-gnu --disable-vda --enable-libbluray --enable-libcdio --enable-gnutls --enable-frei0r --enable-openssl --enable-libass --enable-libopus --enable-fontconfig --enable-libpulse --disable-mips32r2 --disable-mipsdspr1 --disab  libavutil      52. 18.100 / 52. 18.100
libavcodec     54. 92.100 / 54. 92.100
libavformat    54. 63.104 / 54. 63.104
libavdevice    54.  3.103 / 54.  3.103
libavfilter     3. 42.103 /  3. 42.103
libswscale      2.  2.100 /  2.  2.100
libswresample   0. 17.102 /  0. 17.102
libpostproc    52.  2.100 / 52.  2.100
[h264 @ 0x867ed80] RTP: missed 1 packets
    Last message repeated 1 times
[h264 @ 0x867ed80] mb_type 34 in I slice too large at 17 18
[h264 @ 0x867ed80] error while decoding MB 17 18
[h264 @ 0x867ed80] concealing 5732 DC, 5732 AC, 5732 MV errors in I frame
[h264 @ 0x867ed80] RTP: missed 1 packets
Last message repeated 14 times
[rtsp @ 0x867c640] Stream #1: not enough frames to estimate rate; consider increasing probesize
[rtsp @ 0x867c640] Estimating duration from bitrate, this may be inaccurate
Guessed Channel Layout for  Input Stream #0.1 : mono
Input #0, rtsp, from 'rtsp://10.2.69.201:554/ch0_0.h264':
 Metadata:
title           : H.264 Program Stream, streamed by the LIVE555 Media Server
comment         : ch0_0.h264
 Duration: N/A, start: 0.065833, bitrate: 64 kb/s
Stream #0:0: Video: h264 (Constrained Baseline), yuv420p, 1600x1200, 15.19 tbr, 90k tbn, 180k tbc
Stream #0:1: Audio: pcm_alaw, 8000 Hz, mono, s16, 64 kb/s 
Output #0, image2, to '/var/www/camera.jpg':
Metadata:
title           : H.264 Program Stream, streamed by the LIVE555 Media Server
comment         : ch0_0.h264
encoder         : Lavf54.63.104
Stream #0:0: Video: mjpeg, yuvj420p, 1600x1200, q=2-31, 200 kb/s, 90k tbn, 10 tbc
Stream mapping:
Stream #0:0 -> #0:0 (h264 -> mjpeg)
Press [q] to stop, [?] for help
[h264 @ 0x8793260] mb_type 34 in I slice too large at 17 18
[h264 @ 0x8793260] error while decoding MB 17 18
[h264 @ 0x8793260] concealing 5732 DC, 5732 AC, 5732 MV errors in I frame 
[image2 @ 0x86d1640] Could not get frame filename number 2 from pattern '/var/www/camera.jpg' (either set updatefirst or use a pattern like %03d within the filename pattern)
av_interleaved_write_frame(): Invalid argument
9
David Findlay

Comme le suggère votre sortie, le problème est qu'il vous manque RTP paquets et donc des parties essentielles de la vidéo. Avec votre commande, ffmpeg générera exactement une image - dès qu'il verra la fin de la première image - mais il manquait des données. Il essaie donc de dissimuler les erreurs dans les macroblocs, mais il ne peut le faire qu'en copiant des parties de l'image déjà décodée, ce qui conduit aux artefacts que vous voyez ici.

Le wiki de FFmpeg a un exemple de comment créer une vignette toutes les x secondes :

ffmpeg -i rtsp://10.2.69.201:554/ch0_0.h264 -f image2 -vf fps=fps=1/120 img%03d.jpg

Vous pouvez bien sûr essayer de sauvegarder le flux dans un fichier. Dans ce cas, il s’arrêterait après 120 secondes:

ffmpeg -i rtsp://10.2.69.201:554/ch0_0.h264 -c:v copy -t 120 stream.mp4

Si vous le pouvez, essayez de télécharger ou compiler une version statique récente , car votre ffmpeg est un peu plus ancien et vous ne savez jamais si vous n'avez pas rencontré un bogue qui a déjà été corrigé.

12
slhck

Le message RTP: missed 1 packets indique que certaines données sont manquantes dans votre flux.

Essayez d’ajouter l’option -rtsp_transport tcp avant -y afin d’utiliser TCP à la place de UDP.

5
nochkin

Bonjour, j'ai eu le même problème avec le flux RTSP de ma caméra IP il y a quelque temps. La version 1.0 de ffmpeg construite le 21 novembre 2012 à 20:41:28 avec gcc 4.4.6 (GCC) 20120305

J'ai eu le même résultat miniature que vous avec la partie floue en bas.

la commande que j'ai utilisée était:

ffmpeg -i {RTSP_SOURCE} -ss 00:00:01 -f image2 -vframes 1 thumb.jpg

mon problème a été résolu lorsque j'ai suffixé la partie millisecondes dans le paramètre -ss:

ffmpeg -i {RTSP_SOURCE} -ss 00:00:01.500 -f image2 -vframes 1 thumb.jpg

J'ai trouvé cela dans un exemple de la documentation officielle de FFMPEG et cela a fonctionné pour mon cas.

https://trac.ffmpeg.org/wiki/Create%20a%20thumbnail%20image%20every%20X%20seconds%20of%20the%20video

3
Marek Bohuncak