man v4l2-ctl |
![]() |
Добавил(а) microsin | ||||||||||||||||||||||||||||||||||||
v4l2-ctl - приложение для управления драйверами video4linux. SYNOPSIS v4l2-ctl [-h] [-d < dev>] [множество других опций] [Описание] Утилита v4l2-ctl используется для управления драйверами video4linux: video, vbi, radio или swradio, на ввод и вывод. Она способна управлять практически любым аспектом таких устройств, охватывающим полный API V4L2. Состояние выхода: при успешном завершении возвратит 0, иначе будет возвращен код ошибки. [Опции] -d, --device < dev> Использовать < dev> в качестве устройства V4L2. Если < dev> начинается с цифры, то используется /dev/video< dev>. Иначе если было ранее указано -z, то < dev> это имя объекта или идентификатор интерфейса (если с префиксом 0x), который находится в топологии коммуникационного устройства со строкой информации шины, как указано параметром -z. Таким образом, следующие 2 команды эквивалентны: v4l2-ctl -d /dev/video0 --stream-mmap --stream-to=/dev/null --stream-count=1000 -v, --verbose Включить подробный вывод сообщений. --version Показать версию. -w, --wrapper Использовать библиотеку обертки libv4l2 для всех обращений к устройству V4L2 по умолчанию. v4l2-ctl напрямую осуществляет доступ к к устройству V4L2, но с этой опцией весь доступ происходит через эту библиотеку обертки. libv4l2 - это библиотека-обертка, которая предоставляет дополнительные возможности и решает различные проблемы при работе с Video4Linux2 (V4L2). Вот ее основные назначения: 1. Преобразование форматов пикселей. Прозрачно конвертирует экзотические или проприетарные форматы в стандартные: // Без libv4l2 - только родные форматы устройства ioctl(fd, VIDIOC_QBUF, &buffer); 2. Реализация отсутствующих ioctl. Добавляет эмуляцию для ioctl, которые не поддерживаются устройством: без libv4l2: VIDIOC_S_CROP может не работать. С libv4l2 эмулируется функционал cropping. 3. Исправление багов драйверов. Обходит известные ошибки в драйверах различных устройств. [Практическое использование] Через переменную окружения. Приложения, использующие libv4l, будут автоматически использовать обертку: $ export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libv4l2.so
$ v4l2-ctl --stream-mmap --stream-to=host
В программах на C: #include < libv4l2.h> [Конкретные решаемые проблемы] 1. Проблема с форматом MJPEG: устройство может требовать MJPEG, но приложение ожидает YUYV. libv4l2 автоматически конвертирует MJPEG → YUYV. 2. Исправление некорректных размеров: драйвер сообщает неверный размер буфера, libv4l2 корректирует вычисления. [Проверка использования] Убедиться, что приложение использует libv4l2: $ ldd $(which v4l2-ctl) | grep v4l2
$ strace v4l2-ctl --list-formats 2>&1 | grep v4l2
Принудительное использование, даже если приложение не слинковано с libv4l2: $ LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libv4l2.so v4l2-ctl --all
[Пример работы с проблемным устройством] Без libv4l2: может произойти ошибка "Inappropriate ioctl for device". $ v4l2-ctl --set-fmt-video=width=1280,height=720,pixelformat=YUYV
С libv4l2: libv4l2 эмулирует недостающую функциональность. $ LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libv4l2.so
$ v4l2-ctl --set-fmt-video=width=1280,height=720,pixelformat=YUYV
[Преимущества использования] - Совместимость: работа с большим количеством устройств Именно поэтому многие приложения (например, `vlc`, `mplayer`) используют libv4l2 для лучшей совместимости с различными видеоустройствами. -h, --help Напечатает сообщение подсказки по опциям. --help-io Напечатает подсказку по всем опциям, которые получают/установят/перечисляют входы и выходы, для video и audio. --help-meta Напечатает подсказку по всем опциям, которые получают/установят/перечисляют форматы метаданных. --help-misc Напечатает подсказку по различным опциям. --help-overlay Подсказка по всем опциям, которые получают/установят/перечисляют форматы overlay и framebuffer. --help-sdr Подсказка по всем опциям, которые получают/установят/перечисляют форматы software defined radio (SDR). --help-selection Подсказка по всем опциям, которые работают с выделениями: cropping (обрезка), composing (создание). --help-stds Подсказка по всем опциям, которые работают со стандартами SDTV и таймингами Digital Video. SDTV (Standard Definition Television) - телевизионное вещание стандартной четкости. По "стандартной" имеется в виду начальные стандарты TV, которые появились на рынке изначально. [Основные характеристики SDTV] - Разрешение: 480i/576i (576 строк в PAL, 480 в NTSC) Современное значение. Хотя SDTV считается устаревшим для вещания, но оно все еще сохраняет актуальность: - Системы видеонаблюдения до сих пор используют SD-камеры. [Основные стандарты SDTV] Аналоговые: - NTSC (National Television System Committee): 480i, 29.97 fps, в основном Северная Америка, Япония. Цифровые: - ATSC (Северная Америка). [Использование в v4l2-ctl] Команда показывает поддерживаемые стандарты видеоустройства: $ v4l2-ctl --list-standards
Пример вывода: ioctl: VIDIOC_ENUMSTD
Index : 0
Id : 0x0000000000000001
Name : NTSC
Frame period: 1001/30000
Frame lines : 525
Установка стандарта NTSC: $ v4l2-ctl -d /dev/video0 --set-standard=0
Установка стандарта PAL: $ v4l2-ctl -d /dev/video0 --set-standard=1
Просмотр текущего стандарта: $ v4l2-ctl -d /dev/video0 --get-standard
[Сравнение стандартов]
Полная информация о стандартах: $ v4l2-ctl --all
Проверка, поддерживает ли устройство стандарты: $ v4l2-ctl --list-formats-ext
Команда `--help-stds` в v4l2-ctl помогает работать с этими устаревшими, но все еще актуальными стандартами. --help-streaming Подсказка по всем опциям, которые работают со стримингом. --help-subdev Подсказка по всем опциям, которые работают с устройствами v4l-subdevX. --help-tuner Подсказка по всем опциям, которые работают с тюнерами и модуляторами. --help-vbi Подсказка по всем опциям, которые получают/установят/перечисляют форматы VBI. VBI (Vertical Blanking Interval) - это интервал вертикального гашения в аналоговом телевизионном сигнале: - Временной интервал между кадрами телевизионного сигнала. Изначально этот интервал использовался для: - Синхронизации ЭЛТ-мониторов. Субтитры и скрытые титры: - CEA-608/708 - стандарты для закрытых титров. Данные телеметрии: VPS (Video Programming System) Получение телетекста через VBI: $ v4l2-ctl -d /dev/video0 --get-vbi-cap
В цифровом телевидении: - VBI данные передаются в MPEG-потоке как отдельные пакеты. [Работа с VBI в v4l2] Просмотр VBI возможностей: $ v4l2-ctl --help-vbi
$ v4l2-ctl --list-formats | grep -i vbi
Настройка VBI форматов. Просмотр поддерживаемых VBI форматов: $ v4l2-ctl --list-formats-vbi
Установка VBI формата: $ v4l2-ctl --set-fmt-vbi=...
[Примеры использования в Linux] Захват VBI данных через v4l2-ctl: $ v4l2-ctl -d /dev/video0 --stream-vbi --stream-to=teletext.dat
Через специализированные утилиты: $ zxing -q /dev/vbi0 # для чтения телетекста
Проверка поддержки VBI устройством, поиск VBI устройств: $ ls -la /dev/vbi*
$ ls -la /dev/dvb/
Проверка возможностей: $ v4l2-ctl --all | grep -i vbi
Форматы VBI в v4l2. Примеры VBI форматов: $ v4l2-ctl --list-formats-vbi
# Может показать:
# - VBI_NTSC
# - VBI_PAL
# - RAW VBI
# - SLICED VBI
[Типы VBI данных] Raw VBI: - Необработанные данные VBI. Sliced VBI: - Обработанные данные, разделенные по типам. [Современная значимость] Хотя аналоговое ТВ уходит в прошлое, VBI все еще важно для: - Обработки архивного видео VBI - отличный пример того, как "пустое" пространство в техническом стандарте было творчески использовано для передачи дополнительных данных, что в итоге привело к созданию таких сервисов, как телетекст и закрытые титры. --help-vidcap Подсказка по всем опциям, которые получают/устанавливают/перечисляют форматы захвата видео (video capture formats). --help-vidout Подсказка по всем опциям, которые получают/устанавливают/перечисляют формата вывода видео. --help-edid Подсказка по всем опциям, которые получают/устанавливают EDID. EDID (Extended Display Identification Data) - стандартизированный набор данных, который дисплеи передают источнику сигнала для идентификации своих характеристик. EDID представляет собой следующее: - Структура данных, хранящаяся в ПЗУ монитора/дисплея. Основное содержимое EDID: - Идентификаторы производителя. Значение для видеоустройств. EDID критически важен для: - Автоматической настройки разрешения и частоты. В контексте v4l2 работа с EDID позволяет правильно настроить устройства захвата HDMI/DVI для работы с различными источниками сигнала. [Структура EDID данных] Базовый блок (128 байт): - Заголовок (8 байт) [Работа с EDID в v4l2] Просмотр EDID, чтение EDID с устройства: $ v4l2-ctl --get-edid
$ v4l2-ctl --get-edid | edid-decode
Запись EDID в файл: $ v4l2-ctl --get-edid > display.edid
Установка EDID, загрузка EDID в устройство: $ v4l2-ctl --set-edid=file=display.edid
$ v4l2-ctl --set-edid=hex=00ffff...
Проверка загруженного EDID: $ v4l2-ctl --info
$ v4l2-ctl --query-dv-timings
Установка EDID для устройства захвата: $ v4l2-ctl -d /dev/video0 --set-edid=file=1080p60.edid
Проверка установленного EDID: $ v4l2-ctl -d /dev/video0 --get-edid | edid-decode
[Утилиты для работы с EDID] Парсинг и анализ: edid-decode. Декодирование EDID: $ v4l2-ctl --get-edid | edid-decode
$ cat display.edid | edid-decode
Просмотр в человеко-читаемом формате: $ edid-decode display.edid
Создание EDID файлов. Генерация EDID для конкретного разрешения (используя специализированные утилиты): $ cedid -r 1920x1080 -f 60 > 1080p60.edid
Генерация EDID. Использование awyeadid для создания EDID: $ git clone https://github.com/akatrevorjay/edid-generator
$ cd edid-generator
$ ./generate-edid
[Настройка HDMI захвата] 1. Получить EDID с целевого дисплея: $ v4l2-ctl -d /dev/video0 --get-edid > target_display.edid
2. Декодировать для проверки: $ edid-decode target_display.edid
3. Установить EDID в устройство захвата: $ v4l2-ctl -d /dev/video1 --set-edid=file=target_display.edid
4. Проверить доступные форматы: $ v4l2-ctl -d /dev/video1 --list-formats-ext
[Типичные проблемы и решения] 1. Устройство не читает EDID. Принудительная установка EDID: $ v4l2-ctl -d /dev/video0 --set-edid=file=forced.edid --fix-edid-checksums
2. Неправильное определение разрешения. Создание EDID с нужным разрешением, установка его в устройство: $ v4l2-ctl --set-edid=file=custom_resolution.edid
[Расширения EDID] CEA Extension: - Дополнительные форматы видео DisplayID Extension: - Высокие разрешения (4K, 8K) --help-all Подсказка по всем опциям. --all Отобразит всю доступную информацию. -C, --get-ctrl < ctrl>[,< ctrl>...] Получит значение элемента управления (controls) [VIDIOC_G_EXT_CTRLS]. -c, --set-ctrl < ctrl>=< val>[,< ctrl>=< val>...] Установит значение элемента управления [VIDIOC_S_EXT_CTRLS]. -D, --info Покажет информацию драйвера [VIDIOC_QUERYCAP]. -e, --out-device < dev> Использовать < dev> для выходных потоков вместо устройства по умолчанию, как установлено --device. Если < dev> начинается с цифры, то используется /dev/video< dev>. Иначе если было ранее указано -z, то < dev> это имя объекта или идентификатор интерфейса (если с префиксом 0x), который находится в топологии коммуникационного устройства со строкой информации шины, как указано параметром -z. -E, --export-device < dev> Использовать устройство < dev> для экспорта буферов DMA. Если < dev> начинается с цифры, то используется /dev/video< dev>. Иначе если было ранее указано -z, то < dev> это имя объекта или идентификатор интерфейса (если с префиксом 0x), который находится в топологии коммуникационного устройства со строкой информации шины, как указано параметром -z. -z, --media-bus-info < bus-info> Найдет media-устройство по указанной строке bus-info. Если установлено, то опции -d, -e и -E могут использовать имя объекта или идентификатор интерфейса для ссылки на узлы устройства (device nodes). Пример: v4l2-ctl -z platform:vivid-000 -d vivid-000-vid-cap -k, --concise Более краткий вывод, если это возможно. -l, --list-ctrls Отобразит все элементы управления (controls) и их значения [VIDIOC_QUERYCTRL]. -L, --list-ctrls-menus Отобразит все элементы управления и их меню [VIDIOC_QUERYMENU]. -r, --subset < ctrl>[,< offset>,< size>]+ Подмножество (subset) N-мерного массива для получения/установки элемента управления < ctrl> для любой размерности, указанной кортежем (< offset>, < size>). --list-devices Выведет список всех устройств. Если была указана опция -z, то перечислит только media-устройства с информационной строкой шины, указаной опцией -z. --log-status Лог состояния платы в логе kernel [VIDIOC_LOG_STATUS]. --get-priority Запросить текущий приоритет доступа [VIDIOC_G_PRIORITY]. --set-priority < prio> Установить новый приоритет доступа [VIDIOC_S_PRIORITY]. Здесь < prio> может быть 1 (background), 2 (interactive) или 3 (record). --silent Установит только код результата, не будут выводиться никакие сообщения. --sleep < secs> Сон на < secs> секунд, вызов QUERYCAP и закрытие дескриптора файла. [Примеры использования] Список всех устройств video: v4l2-ctl [-A|--list-devices] Список поддерживаемых форматов video и разрешений устройства video по умолчанию /dev/video0: v4l2-ctl --list-formats-ext Список поддерживаемых форматов video и разрешений определенного устройства video: v4l2-ctl --list-formats-ext [-d|--device] путь/до/video_device Получение всех подробностей по video-устройству: v4l2-ctl --all [-d|--device] путь/до/video_device Захват JPEG фото с указанным разрешением из video-устройства: v4l2-ctl [-d|--device] path/to/video_device \ Захват сырого видеопотока из video-устройства: v4l2-ctl [-d|--device] path/to/video_device \ Список всех элементов управления (controls) video-устройства и их значений: v4l2-ctl [-l|--list-ctrls] [-d|--device] путь/до/video_device Установить значение элемента управления video-устройства: v4l2-ctl [-d|--device] path/to/video_device [-c|--set-ctrl] control_name=value Запросить информацию об устройстве /dev/video1: v4l2-ctl -d1 -D Стриминг видео с помощью MMAP stream I/O из /dev/video0: v4l2-ctl -d0 --stream-mmap MMAP (Memory Mapping) - это механизм отображения файлов или устройств в память процесса. В контексте V4L2 и видеоустройств MMAP используется для эффективного обмена данными между ядром и пользовательским пространством. 1. Что такое MMAP в V4L2 MMAP позволяет: - Отобразить буферы драйвера непосредственно в память приложения. 2. Типы I/O в V4L2 Read/Write I/O. Традиционный способ - копирование данных: $ v4l2-ctl --stream-to=file.raw
MMAP I/O. Прямой доступ к буферам драйвера: $ v4l2-ctl --stream-mmap --stream-to=file.raw
User Pointer I/O: приложение предоставляет свои буферы. [Как работает MMAP в V4L2] Процесс работы: 1. Запрос буферов у драйвера. 2. Отображение буферов в память приложения. 3. Цикл обработки: - Старт захвата кадра. [Преимущества MMAP] Производительность: - Нет копирования данных. Эффективность: - Прямой доступ к данным камеры. Сравнение MMAP с другими методами:
[Практическое использование в v4l2-ctl] Базовый пример: $ v4l2-ctl -d /dev/video0 --stream-mmap --stream-to=video.raw
С настройками формата: $ v4l2-ctl -d /dev/video0 \
--set-fmt-video=width=640,height=480,pixelformat=YUYV \
--stream-mmap \
--stream-to=host 192.168.1.100
С ограничением количества кадров: $ v4l2-ctl -d /dev/video0 --stream-mmap --stream-count=100 --stream-to=frames/
[Программная реализация MMAP] Пример на C: #include < linux/videodev2.h> [Диагностика проблем с MMAP] Проверка поддержки MMAP: $ v4l2-ctl -d /dev/video0 --all | grep -i mmap
Мониторинг использования памяти. Во время потоковой передачи: $ watch -n 1 'cat /proc/meminfo | grep -E "(MemFree|Cached)"'
Проверка производительности. Замер FPS с MMAP: $ v4l2-ctl -d /dev/video0 --stream-mmap --stream-to=/dev/null --stream-count=300
[Оптимизация MMAP] Количество буферов. Обычно наличие 4-8 буферов оптимально: $ v4l2-ctl -d /dev/video0 --set-bufsize=4
Размер буферов автоматически вычисляется на основе формата: $ v4l2-ctl -d /dev/video0 --set-fmt-video=width=1920,height=1080
[Типичные проблемы] 1. Нехватка буферов. Симптомы: пропущенные кадры, низкий FPS. Решение: увеличить количество буферов. 2. Проблемы с памятью. Симптомы: ошибки mmap, segmentation fault. Решение: проверить доступную память, уменьшить разрешение. [Альтернативы MMAP] Для простых случаев, Read/Write - проще, но медленнее. $ v4l2-ctl --stream-to=file.raw
Для специализированных задач: используйте UserPtr, когда нужно контролировать размещение буферов (требует программирования). MMAP - это наиболее эффективный метод для высокопроизводительной потоковой передачи видео в Linux, используемый большинством профессиональных приложений для работы с видео. Стриминг одного кадра видео из /dev/video0 и сохранение его в файл: v4l2-ctl --stream-mmap --stream-count=1 --stream-to=file.raw Стриминг видео из /dev/video0 и отправка его по сети. Используйте на хосте 'qvidcap -p' для просмотра видео [1]. v4l2-ctl --stream-mmap --stream-to-host < hostname> Стриминг видео из /dev/video0, используя буферы DMABUF, экспортированные из /dev/video2: v4l2-ctl --stream-dmabuf --export-device /dev/video2 Стриминг видео между устройствами памяти (memory-to-memory device): v4l2-ctl --stream-mmap --stream-out-mmap Стриминг видео из устройства захвата (capture video device /dev/video1) в устройство вывода видео (/dev/video2): v4l2-ctl -d1 --stream-mmap --out-device /dev/video2 --stream-out-dmabuf [Ссылки] 1. man qvidcap. |