Вопрос или проблема
В Linux нужно. Я думаю, что с помощью ffmpeg или аналогичного решения можно принимать видео вход, объединять с графическим изображением и выводить видео на конкретный монитор? Это позволит отображать информационный баннер поверх live-видеопотока. Графика, конечно, будет в основном с прозрачным фоном.
Смотря на примеры ffmpeg, это можно сделать с существующими видеофайлами, но ffmpeg должен принимать live-видео как входные данные, так и генерируемый результат как выходное видео, не так ли?
Моя система Linux определенно видит подключенную камеру…
# v4l2-ctl --list-devices
USB Video: USB Video (usb-0000:01:00.0-1.1):
/dev/video0
/dev/video1
/dev/media0
Но я, похоже, не могу получить правильную конфигурацию, чтобы прочитать видеоданные?
~# ffmpeg -f v4l2 -list_formats all -i /dev/video1
ffmpeg version 7.0.2-3ubuntu1 Copyright (c) 2000-2024 the FFmpeg developers
built with gcc 14 (Ubuntu 14.2.0-2ubuntu1)
configuration: --prefix=/usr --extra-version=3ubuntu1 --toolchain=hardened --libdir=/usr/lib/aarch64-linux-gnu --incdir=/usr/include/aarch64-linux-gnu --arch=arm64 --enable-gpl --disable-stripping - -disable-libmfx --disable-omx --enable-gnutls --enable-libaom --enable-libass --enable-libbs2b --enable-libcdio --enable-libcodec2 --enable-libdav1d --enable-libflite --enable-libfontconfig --enable-l ibfreetype --enable-libfribidi --enable-libglslang --enable-libgme --enable-libgsm --enable-libharfbuzz --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-l ibwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzimg --enable-openal --enable-opencl --enable-opengl --disable-sndio --disable-libvpl --enable-libdc1394 --enable-libdrm --enable- libiec61883 --enable-chromaprint --enable-frei0r --enable-ladspa --enable-libbluray --enable-libcaca --enable-libdvdnav --enable-libdvdread --enable-libjack --enable-libpulse --enable-librabbitmq --en able-librist --enable-libsrt --enable-libssh --enable-libsvtav1 --enable-libx264 --enable-libzmq --enable-libzvbi --enable-lv2 --enable-sdl2 --enable-libplacebo --enable-librav1e --enable-pocketsphinx --enable-librsvg --enable-libjxl --enable-shared
libavutil 59. 8.100 / 59. 8.100
libavcodec 61. 3.100 / 61. 3.100
libavformat 61. 1.100 / 61. 1.100
libavdevice 61. 1.100 / 61. 1.100
libavfilter 10. 1.100 / 10. 1.100
libswscale 8. 1.100 / 8. 1.100
libswresample 5. 1.100 / 5. 1.100
libpostproc 58. 1.100 / 58. 1.100
[video4linux2,v4l2 @ 0xaaaac16cea80] ioctl(VIDIOC_G_INPUT): Неподходящий ioctl для устройства
[in#0 @ 0xaaaac169ea60] Ошибка открытия входного устройства: Неподходящий ioctl для устройства
Ошибка открытия файла входа /dev/video1.
Ошибка открытия входных файлов: Неподходящий ioctl для устройства
Чтобы протестировать оборудование, я установил OBS (Open Broadcast System) Studio. OBS может нормально видеть вход с камеры, он определяет, что вход с камеры установлен на 1080p60.
Ответ или решение
Чтобы решить задачу наложения графического изображения на живое видео с использованием FFmpeg на Linux, необходимо учесть несколько аспектов, таких как корректная настройка захвата видеопотока с вашего устройства, наложение изображения и вывод на определенный монитор. Давайте рассмотрим это подробно.
1. Проверка наличия устройства видеоввода
Вы уже подтвердили, что ваша система видит веб-камеру с помощью команды v4l2-ctl --list-devices
. Убедитесь, что вы используете правильное устройство при захвате видео. Из вашего вывода видно, что устройства /dev/video0
и /dev/video1
доступны. Попробуйте оба устройства, чтобы выяснить, какое из них является вашим источником видео.
2. Параметры захвата видео
Используя FFmpeg, можно проверить доступные форматы видео с помощью команды:
ffmpeg -f v4l2 -list_formats all -i /dev/video0
Если вы получите ошибку Inappropriate ioctl for device
, попробуйте другое устройство, например, /dev/video1
.
3. Наложение графического изображения
Чтобы наложить изображение с прозрачным фоном на видео, нужно использовать фильтры FFmpeg. Например:
ffmpeg -f v4l2 -i /dev/video0 -i overlay.png -filter_complex "overlay=x=10:y=10" -f x11grab :0.0
В этом примере:
-i /dev/video0
указывает источник живого видео.-i overlay.png
задает изображение с прозрачным фоном.overlay=x=10:y=10
помещает изображение на координаты (10, 10) относительно видео.-f x11grab :0.0
указывает вывод на конкретный монитор (в данном случае – это X-сервер).
4. Установка нужных зависимостей
Если у вас возникли проблемы с использованием FFmpeg, убедитесь, что у вас установлена последняя версия и все необходимые библиотеки:
sudo apt update
sudo apt install ffmpeg
5. Вывод на конкретный монитор
Для указания конкретного монитора можно использовать xrandr
для определения доступных мониторов. После этого, в командной строке, укажите нужный вывод, например:
ffmpeg -f v4l2 -i /dev/video0 -i overlay.png -filter_complex "overlay=x=10:y=10" -f x11grab -s 1920x1080 -r 30 -i :0.0
6. Проверка ошибок
Если возникают ошибки при запуске команды, проверьте следующее:
- Существуют ли права доступа к устройству видеозахвата (
/dev/video*
). - Подходит ли кодек для вашего видео. При необходимости попробуйте изменить кодек на
libx264
илиh264
в выходном файле. - Используйте флаг
-loglevel debug
для подробного журнала ошибок.
Заключение
Используя вышеуказанные шаги, вы сможете наложить графическое изображение на живое видео и вывести его на определенный монитор в Linux с помощью FFmpeg. Это обеспечит вам возможность отображения информационных баннеров поверх видеопотока. Если у вас по-прежнему остаются проблемы, рассмотрите возможность использования других инструментов, таких как OBS, которые могут упростить процесс наложения изображений на видео.