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 команды эквивалентны:
Использовать библиотеку обертки libv4l2 для всех обращений к устройству V4L2 по умолчанию. v4l2-ctl напрямую осуществляет доступ к к устройству V4L2, но с этой опцией весь доступ происходит через эту библиотеку обертки.
libv4l2 - это библиотека-обертка, которая предоставляет дополнительные возможности и решает различные проблемы при работе с Video4Linux2 (V4L2). Вот ее основные назначения:
1. Преобразование форматов пикселей. Прозрачно конвертирует экзотические или проприетарные форматы в стандартные:
// Без libv4l2 - только родные форматы устройства
ioctl(fd,VIDIOC_QBUF,&buffer);
// С libv4l2 - автоматическая конвертация форматов
v4l2_ioctl(fd,VIDIOC_QBUF,&buffer);
2. Реализация отсутствующих ioctl. Добавляет эмуляцию для ioctl, которые не поддерживаются устройством: без libv4l2: VIDIOC_S_CROP может не работать. С libv4l2 эмулируется функционал cropping.
3. Исправление багов драйверов. Обходит известные ошибки в драйверах различных устройств.
[Практическое использование]
Через переменную окружения. Приложения, использующие libv4l, будут автоматически использовать обертку:
SDTV (Standard Definition Television) - телевизионное вещание стандартной четкости. По "стандартной" имеется в виду начальные стандарты TV, которые появились на рынке изначально.
[Основные характеристики SDTV]
- Разрешение: 480i/576i (576 строк в PAL, 480 в NTSC) - Соотношение сторон: 4:3 (традиционное) или 16:9 (широкоэкранное) - Частота кадров: 25/30 fps (в зависимости от стандарта) - Цифровое представление: 720×480 (NTSC) или 720×576 (PAL)
Современное значение. Хотя SDTV считается устаревшим для вещания, но оно все еще сохраняет актуальность:
- Системы видеонаблюдения до сих пор используют SD-камеры. - Устройства захвата поддерживают SD-входы для работы со старым оборудованием. - Эмуляторы и ретро-системы могут использовать SDTV-режимы.
[Основные стандарты SDTV]
Аналоговые:
- NTSC (National Television System Committee): 480i, 29.97 fps, в основном Северная Америка, Япония. - PAL (Phase Alternating Line): 576i, 25 fps, Европа, Азия, Австралия. - SECAM (Sequential Color with Memory): 576i, 25 fps, Франция, Восточная Европа.
Команда показывает поддерживаемые стандарты видеоустройства:
$ v4l2-ctl --list-standards
Пример вывода:
ioctl: VIDIOC_ENUMSTD
Index : 0
Id : 0x0000000000000001
Name : NTSC
Frame period: 1001/30000
Frame lines : 525
Index : 1
Id : 0x0000000000000002
Name : NTSC-443
Установка стандарта 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
[Сравнение стандартов]
Стандарт
Разрешение
Соотношение
Типичное использование
SDTV
720×480/576
4:3/16:9
Аналоговое ТВ, DVD
EDTV
720p
16:9
"Улучшенное" ТВ
HDTV
1080i/1080p
16:9
Современное ТВ
UHD
4K/8K
16:9
Премиум ТВ
Полная информация о стандартах:
$ 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) - это интервал вертикального гашения в аналоговом телевизионном сигнале:
- Временной интервал между кадрами телевизионного сигнала. - "Пустое" пространство в аналоговом ТВ-сигнале. - Составляет примерно 5% от общего времени кадра. - Возникает, когда луч ЭЛТ-трубки возвращается от нижней строки к верхней.
Изначально этот интервал использовался для:
- Синхронизации ЭЛТ-мониторов. - Возврата луча от нижней части экрана к верхней. - Предотвращения искажений при перерисовке кадра. - Передачи телетекста, телеметрии и другой информации. - Современное применение: цифровые субтитры, электронные программные гиды (EPG), интерактивные сервисы.
Субтитры и скрытые титры:
- CEA-608/708 - стандарты для закрытых титров. - Teletext субтитры - в европейских стандартах.
- VBI данные передаются в MPEG-потоке как отдельные пакеты. - PES пакеты для субтитров и телетекста. - DVB стандарты для передачи дополнительных данных.
Проверка поддержки 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:
- Обработанные данные, разделенные по типам. - Телетекст, скрытые титры, VPS и т.д.
[Современная значимость]
Хотя аналоговое ТВ уходит в прошлое, VBI все еще важно для:
- Обработки архивного видео - Систем ретрансляции - Совместимости со старым оборудованием - Исследовательских задач
VBI - отличный пример того, как "пустое" пространство в техническом стандарте было творчески использовано для передачи дополнительных данных, что в итоге привело к созданию таких сервисов, как телетекст и закрытые титры.
--help-vidcap
Подсказка по всем опциям, которые получают/устанавливают/перечисляют форматы захвата видео (video capture formats).
--help-vidout
Подсказка по всем опциям, которые получают/устанавливают/перечисляют формата вывода видео.
--help-edid
Подсказка по всем опциям, которые получают/устанавливают EDID.
EDID (Extended Display Identification Data) - стандартизированный набор данных, который дисплеи передают источнику сигнала для идентификации своих характеристик. EDID представляет собой следующее:
- Структура данных, хранящаяся в ПЗУ монитора/дисплея. - Стандарт VESA (Video Electronics Standards Association). - Передает технические характеристики дисплея источнику. - Используется по интерфейсам: HDMI, DVI, DisplayPort, VGA.
Основное содержимое EDID:
- Идентификаторы производителя. - Поддерживаемые разрешения. - Размеры экрана (в см и дюймах). - Цветовые пространства. - Частоты обновления. - Тайминги синхронизации.
Значение для видеоустройств. EDID критически важен для:
- Автоматической настройки разрешения и частоты. - Совместимости между источниками видеосигнала и дисплеями. - Plug-and-play функциональности. - Оптимального качества изображения.
В контексте v4l2 работа с EDID позволяет правильно настроить устройства захвата HDMI/DVI для работы с различными источниками сигнала.
[Структура EDID данных]
Базовый блок (128 байт):
- Заголовок (8 байт) - ID производителя (10 байт) - Основные параметры дисплея (5 байт) - Цветовые характеристики (10 байт) - Стандартные тайминги (16 байт) - Детальные тайминги (18 байт) - Расширения (1 байт) - Контрольная сумма (1 байт)
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). Пример:
Отобразит все элементы управления (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:
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]
Производительность:
- Нет копирования данных. - Низкие накладные расходы CPU. - Высокая скорость передачи кадров.
Эффективность:
- Прямой доступ к данным камеры. - Минимальная задержка. - Оптимальное использование памяти.
1. Нехватка буферов. Симптомы: пропущенные кадры, низкий FPS. Решение: увеличить количество буферов.
2. Проблемы с памятью. Симптомы: ошибки mmap, segmentation fault. Решение: проверить доступную память, уменьшить разрешение.
[Альтернативы MMAP]
Для простых случаев, Read/Write - проще, но медленнее.
$ v4l2-ctl --stream-to=file.raw
Для специализированных задач: используйте UserPtr, когда нужно контролировать размещение буферов (требует программирования).
MMAP - это наиболее эффективный метод для высокопроизводительной потоковой передачи видео в Linux, используемый большинством профессиональных приложений для работы с видео.
Стриминг одного кадра видео из /dev/video0 и сохранение его в файл: