ffmpeg - Непрерывно транслировать веб-камеру в один файл .jpg (перезаписывать)

Я установил ffmpeg и mjpeg-streamer. Последний читает файл .jpg из /tmp/stream и выводит его через http на веб-сайт, поэтому я могу транслировать все, что находится в этой папке, через веб-браузер.

Я написал bash-скрипт, который непрерывно захватывает кадр с веб-камеры и помещает его в /tmp/stream:

while true
do
    ffmpeg -f video4linux2 -i /dev/v4l/by-id/usb-Microsoft_Microsoft_LifeCam_VX-5000-video-index0 -vframes 1 /tmp/stream/pic.jpg
done

Это прекрасно работает, но очень медленно (~ 1 кадр/с). В надежде ускорить его, я хочу использовать одну команду ffmpeg, которая постоянно обновляет .jpg, скажем, со скоростью 10 кадров в секунду. Я пробовал следующее:

ffmpeg -f video4linux2 -r 10 -i /dev/v4l/by-id/usb-Microsoft_Microsoft_LifeCam_VX-5000-video-index0 /tmp/stream/pic.jpg

Однако это, по понятным причинам, приводит к сообщению об ошибке:

[image2 @ 0x1f6c0c0] Could not get frame filename number 2 from pattern '/tmp/stream/pic.jpg'
av_interleaved_write_frame(): Input/output error

... потому что шаблон вывода не годится для непрерывного потока изображений.

Можно ли транслировать только один jpg с помощью ffmpeg?

Спасибо...


person Germanunkol    schedule 13.07.2013    source источник
comment
Чего именно вы пытаетесь достичь? Статическое изображение с камеры на веб-странице?   -  person David Jashi    schedule 13.07.2013
comment
Да, но такой, который обновляется несколько раз в секунду, так что эффективно поток. Это только первый шаг — позже я планирую написать программу, которая будет многократно считывать изображение и работать с ним.   -  person Germanunkol    schedule 13.07.2013
comment
Ну так это не делается. Пара вопросов: 1) какой формат входного потока? 2) Как вы собираетесь показывать видеопоток клиентам?   -  person David Jashi    schedule 13.07.2013
comment
Я думаю, что на второй вопрос уже дан ответ выше: mjpeg-streamer используется для размещения веб-сайта. Он автоматически читает из /tmp/stream в моей настройке и использует любые изображения там. Это обычная установка на Raspberry Pi, используемая вместе с программой raspistill для Raspberry Camera. Однако эта последняя программа, похоже, не работает с моей (не малиновой) веб-камерой, поэтому вместо этого я хотел использовать ffmpeg. Почему формат ввода имеет значение? Я читаю с веб-камеры, и это отлично работает, как указано в моем вопросе. Все, что я хочу, это чтобы ffmpeg работал непрерывно, а не вызывал его несколько раз.   -  person Germanunkol    schedule 13.07.2013
comment
Ну, это полностью зависит от вас, но когда мне пришлось иметь дело с потоком MJPEG, я сделал это несколькими другими способами: 1) я использовал ffmpeg для преобразования его в поток FLV и скормил его ffserver 2) Для камеры с высокой пропускной способностью (30mb/sec) Мне пришлось разделить поток MJPEG на сигнатуру JFIF на отдельные файлы JPEG, а затем собрать их в 1-минутные фрагменты файлов MP4. Дело в том, что обновление JPEG на стороне клиента выглядит ужасно и раздражает, особенно когда он достаточно большой.   -  person David Jashi    schedule 14.07.2013
comment
Я заметил, что mjpeg-streamer может делать то, что я хочу, вообще без использования ffmpeg (последний оказался довольно тяжелым для raspberry pi). Теперь я использую: ./mjpg_streamer -i "input_uvc.so -r 1280×1024 -d /dev/video0 -y" -o "output_http.so -w ./www" из каталога mjpg, что дает мне четкий вывод при высокой частоте кадров... ура! Спасибо за помощь.   -  person Germanunkol    schedule 18.07.2013


Ответы (2)


Вы можете использовать опцию -update:

ffmpeg -y -f v4l2 -i /dev/video0 -update 1 -r 1 output.jpg

Из документации мультиплексора файлов image2:

-update number

If number is nonzero, the filename will always be interpreted as just a
filename, not a pattern, and this file will be continuously overwritten
with new images.
person llogan    schedule 13.07.2013
comment
Использование v4l2 дает мне ошибку Неизвестный формат ввода: «v4l2» на моем raspberry pi (что кажется известной проблемой: ссылка). Использование -f video4linux2 вместо этого дает мне: "Unrecognized opetion 'update' Failed to set value '1' for option 'update' (Аналогичная проблема при использовании avconv). Вывод ffmpeg --version: ffmpeg version 0.8.6-6:0.8.6-1+rpi1 - person Germanunkol; 18.07.2013
comment
@Germanunkol Ваш ffmpeg слишком стар (и вы, вероятно, используете форк FFmpeg, который может не иметь -update в текущем коде). Вот почему вам нужно включить полные выходные данные консоли ffmpeg в свои команды. - person llogan; 18.07.2013
comment
ffmpeg -version дает: ffmpeg version 0.8.6-6:0.8.6-0ubuntu0.12.10.1, Copyright (c) 2000-2013 the Libav developers built on Apr 2 2013 17:02:16 with gcc 4.7.2 ffmpeg 0.8.6-6:0.8.6-0ubuntu0.12.10.1 libavutil 51. 22. 1 / 51. 22. 1 libavcodec 53. 35. 0 / 53. 35. 0 libavformat 53. 21. 1 / 53. 21. 1 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 - person Germanunkol; 26.07.2013

Можно добиться того, что я хотел, используя:

./mjpg_streamer -i "input_uvc.so -r 1280×1024 -d /dev/video0 -y" -o "output_http.so -p 8080 -w ./www"

... из каталога mjpg_streamer. Он сделает всю неприятную работу за вас, отобразив поток в браузере при использовании адреса: http://{IP-OF-THE-SERVER}:8080/ Он также достаточно легкий, чтобы работать на Raspberry Pi.

Здесь — хороший учебник по его настройке.

Спасибо за помощь!

person Germanunkol    schedule 18.07.2013