ffmpeg для зйомки фотографій з потоку H.264


9

Я намагаюся зафіксувати нерухомі зображення з бездротової IP-камери H.264 за допомогою ffmpeg. Тут я знайшов подібне запитання: Як я можу витягти зображення JPEG хорошої якості з відеофайлу H264 за допомогою ffmpeg?

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

Я реалізував це, як показано в тому прикладі. Ви можете побачити зразок зображення, яке я отримую тут:

В основному питання полягає в тому, що нижня частина зображення завжди блокована. Якщо небо має більше деталей і затуманило, вся нижня половина зображення може бути кривавою або розмитою.

Моя камера має обмежені параметри потоку. Одним з яких є інтервал I-Frame, ви можете змінювати його між 25–100.

Хтось має якісь пропозиції щодо того, як я можу отримати кращий образ? Я не заперечував би, чи можна було фактично зберігати потік у відеофайлі, а також витягувати фотографії кожні 2 хвилини. Це щось легко зробити?

Ось вихід 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

Відповіді:


12

Проблема, на яку натякає ваш вихід, полягає в тому, що вам не вистачає пакетів RTP і, отже, важливих частин відео. За допомогою вашої команди ffmpeg видасть рівно одне зображення - як тільки воно побачить кінець першого кадру - але деякі дані відсутні. Тож він намагається приховати помилки в макроблоках, але це може зробити лише шляхом копіювання частин уже декодованого зображення, що призводить до артефактів, які ви бачите тут.

У вікні FFmpeg є приклад того, як створювати мініатюру кожні х секунд :

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

Можна, звичайно, спробувати зберегти потік у файлі. У цьому випадку воно припиняється через 120 секунд:

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

Якщо ви можете, спробуйте завантажити або скласти недавню статичну збірку , оскільки ваш ffmpeg трохи старший, і ви ніколи не знаєте, чи не натрапили на помилку, яка вже була виправлена.


1
Дякую за це. Чи можливо записувати потік і виводити все-таки кожні х секунд?
Девід Фіндлай

1
Так, це досить просто. Після -f image2 -vf … img%03d.jpgпросто додайте інший вихід. В основному цеffmpeg -i <input> <output-1 options> <output-1 file> <output-2 options> <output-2 file> …
slhck

5

RTP: missed 1 packetsПовідомлення є ознакою того, що у вас є деякі дані відсутні з вашого потоку.

Спробуйте додати , -rtsp_transport tcpперш ніж -yваріант , щоб використовувати TCP замість UDP.


Так, якщо ви можете використовувати TCP, це чудова порада. І під можливістю я маю на увазі, якщо у вас є стабільний зв'язок із низькою затримкою та достатньою пропускною здатністю. Ви можете відчути дещо більшу затримку потоку.
Yngve Sneen Lindal

3

Привіт, я мав таку ж проблему з потоком RTSP з моєї IP камери деякий час тому. ffmpeg версія 1.0, побудована 21 листопада 2012 20:41:28 з gcc 4.4.6 (GCC) 20120305

У мене був такий самий результат ескізів, як у вас із розмитою частиною внизу.

Команда, яку я використав, була:

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

мою проблему було вирішено, коли я суфіксував частину мілісекунд у параметрі -ss:

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

Я з’ясував це на прикладі офіційної документації FFMPEG, і це працювало для моєї справи.

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


з моєї сторони проблема полягала в тому, що процесор, що кодував кадр, був перевантажений, зробивши png, а потім перетворивши його на jpeg, як другий крок допоміг
user230910
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.