Утилита qvidcap используется для тестирования устройств видеозахвата video4linux [1], используя либо video-устройство, либо файл, либо через сетевое подключение. Это приложение также может работать как обычное приложение вьюера video/TV.
qvidcap не поддерживает (пока) сжатые видеопотоки, отличные от MJPEG.
Статус выхода: при успешном завершении возвратит 0. Иначе вернет код ошибки.
[Опции]
-d, --device=< dev>
Использовать < dev> в качестве video-устройства. Если < dev> это номер, то используется /dev/video< dev>.
-f, --file=< file>
Читать сырые данные кадров (raw frame data) из файла < file>.
-p, --port[=< port>]
Прослушивать сетевое соединение на указанном порту. По умолчанию используется порт 8362.
-T, --tpg
Использовать генератор тестового видео (test pattern generator). Если не указано ни -d, ни -f, ни -T, то используется /dev/video0.
-c, --count=< cnt>
Остановиться после < cnt> захваченных кадров.
-b, --buffers=< bufs>
Запрос < bufs> буферов (по умолчанию 4), когда происходит стриминг из video-устройства.
-s, --single-step[=< frm>]
Начиная с кадра < frm> (по умолчанию 1), пауза после каждого кадра, пока не будет нажата клавиша Space.
-C, --colorspace=< c>
Переназначить цветовое пространство. Здесь < c> может быть одним из следующих цветовых пространств: smpte170m, smpte240m, rec709, 470m, 470bg, jpeg, srgb, oprgb, bt2020, dcip3.
-X, --xfer-func=< x>
Переназначить функцию преобразования. Здесь < x> может быть одной из следующих функций преобразования: default, 709, srgb, oprgb, smpte240m, smpte2084, dcip3, none.
Transfer Function (функция передачи) - это математическая функция, которая определяет, как линейные значения света (сцены) преобразуются в нелинейные значения сигнала для хранения и передачи, и наоборот. Transfer function - критически важный параметр для обеспечения точной цветопередачи и соответствия между различными устройствами отображения и стандартами.
[Основная концепция]
Проблема:
- Человеческое зрение нелинейно - мы более чувствительны к темным тонам. - Матрица камеры захватывает свет линейно. - Нужно эффективно использовать ограниченный битрейт.
Решение:
- Gamma коррекция - нелинейное кодирование света. - Больше битов на темные тона, меньше на светлые. - Соответствует восприятию человеческого глаза.
Для этого используются различные функции преобразования.
Default - по умолчанию для стандарта.
709 (BT.709), Rec. ITU-R BT.709
- Стандарт для HDTV - Gamma ≈ 2.4
Пример для для HDTV (1080p, 720p):
$ v4l2-ctl --set-xfer-func=709
sRGB, Standard Red Green Blue
- Для компьютерной графики, веб-браузеров - Gamma ≈ 2.2
Пример для компьютерных мониторов, web:
$ v4l2-ctl --set-xfer-func=srgb
opRGB, Optical RGB
- Для профессиональной графики - Широкий цветовой охват - Для обработки изображений
$ v4l2-ctl --set-xfer-func=oprgb
smpte240M, устаревший стандарт SMPTE 240M
- Предшественник BT.709 - Представляет исторический интерес
$ v4l2-ctl --set-xfer-func=smpte240m
smpte2084 (PQ), Perceptual Quantizer
- Для HDR контента (High Dynamic Range) - Используется в Dolby Vision, HDR10
$ v4l2-ctl --set-xfer-func=smpte2084
dcip3, DCI-P3
- Для цифрового кино - Цветовое пространство цифрового кино - Шире, чем sRGB
$ v4l2-ctl --set-xfer-func=dcip3
none, линейный режим (без коррекции)
- Линейная передача - Для RAW обработки - Редко используется напрямую
# Линейный свет → sRGB deflinear_to_srgb(linear):
if linear < =0.0031308:
return12.92* linear
else:
return1.055* (linear ** (1/2.4)) -0.055
[Практическое применение в qvidcap]
Для HDTV контента:
$ qvidcap --xfer-func=709
Для web-стриминга:
$ qvidcap --xfer-func=srgb
Для HDR записи:
$ qvidcap --xfer-func=smpte2084
Для профессиональной обработки:
$ qvidcap --xfer-func=oprgb
[Визуальные различия]
Сравнение gamma кривых:
- sRGB (2.2): ярче средних тонов, для мониторов - BT.709 (2.4): темнее, больше деталей в тенях, для ТВ - PQ: очень крутая кривая, сохраняет детали в ярких областях
Переназначить кодирование Y'CbCr. Здесь < y> может быть одним из следующих кодирований Y'CbCr: default, 601, 709, xv601, xv709, bt2020, bt2020c, smpte240m.
Y'CbCr - метод кодирования цветовой информации в видео сигналах, который отделяет яркость от цветности. Это фундаментальный параметр, который определяет, как цветная информация представляется в цифровом видео, и критически важен для обеспечения точной цветопередачи между различными устройствами и стандартами.
[Основная концепция Y'CbCr]
Компоненты:
- Y' (Luma) - информация о яркости (черно-белое изображение). - Cb (Chrominance Blue) - разность между синим и яркостью. - Cr (Chrominance Red) - разность между красным и яркостью.
Y'CbCr-кодирование используется по следующим причинам:
- Эффективное сжатие информации - человеческий глаз менее чувствителен к цветности. - Совместимость с черно-белыми системами. - Раздельная обработка яркости и цветности.
[Основные стандарты кодирования]
default - по умолчанию для устройства
601 (BT.601), ITU-R BT.601
- Стандарт для SDTV (стандартное разрешение) - Используется для 480i/576i - Цветовой охват: аналогичен sRGB
$ v4l2-ctl --set-ycbcr=601
709 (BT.709), ITU-R BT.709
- Стандарт для HDTV (высокое разрешение) - Используется для 720p/1080i/1080p - Цветовой охват: шире, чем 601
$ v4l2-ctl --set-ycbcr=709
xv601 и xv709
- Extended Gamut версии - Расширенный цветовой охват - Для устройств с широким охватом
Связь с другими параметрами. Обычно используется вместе (согласованная настройка для HDTV):
$ qvidcap \
--ycbcr-enc=709 \ # Кодирование цветности
--colorspace=709 \ # Цветовое пространство
--xfer-func=709 \ # Функция передачи
--quantization=lim_range # Диапазон квантования
-Q, --quant=< q>
Переназначение квантования (quantization). Здесь < q> может быть одним из следующих методов: default, full-range, lim-range.
-P, --pixelformat=< p>
Для video-устройств: установит формат точки. Для чтения из файла данные интерпретируются с использованием этой настройки. Для других режимов эта опция игнорируется. Используйте -l для просмотра списка поддерживаемых форматов точки.
-l, --list-formats
Просмотр поддерживаемых форматов.
-h, --help
Отобразит подсказку.
-t, --timings
Сообщит о таймингах рендера кадров.
-v, --verbose
Выводить более подробные сообщения.
-R, --raw
Открыть устройство в "сыром" режиме.
--opengl
Принудительно использовать openGL для отображения video.
--opengles
Принудительно использовать openGL ES для отображения video.
Следующие опции игнорируются при захвате из video-устройства:
Frame (кадр) и Field (поле) - два разных способа представления видео, связанные с чересстрочной разверткой (interlacing).
[Основные понятия]
Frame (кадр):
- Полное изображение в определенный момент времени - Содержит все строки развертки - Прогрессивная развертка (progressive) - Пример: 1080p, 720p
Field (поле):
- Половина кадра - только четные или нечетные строки - Чересстрочная развертка (interlaced) - Два поля составляют один полный кадр - Пример: 1080i, 576i
Прогрессивный кадр (Frame):
Строка 1: ██████████████
Строка 2: ██████████████
Строка 3: ██████████████
Строка 4: ██████████████ ...
Чересстрочные поля (Fields):
Поле 1 (нечетные строки):
Строка 1: ██████████████
Строка 3: ██████████████
Строка 5: ██████████████ ...
Поле 2 (четные строки):
Строка 2: ██████████████
Строка 4: ██████████████
Строка 6: ██████████████ ...
Для Frame полная частота кадров: 25/30/50/60 fps, каждый кадр содержит полное изображение. Для Field частота полей 50/60 полей в секунду. Каждое поле - половина изображения, но с удвоенной следования.
Могут быть проблемы при неправильном понимании этих терминов. Если перепутать:
- Установка высоты поля вместо кадра: разрешение будет в 2 раза меньше. - Неправильный деинтерлейсинг: "гребенка" на движущихся объектах. - Потеря четкости: неправильное масштабирование.
[Практическое значение в v4l2-ctl]
Устанавливает полную высоту кадра (все строки):
$ v4l2-ctl --set-fmt-video=width=1920,height=1080
Или через отдельный параметр:
$ v4l2-ctl --height=1080
Что НЕ делает эта команда: она не устанавливает высоту поля. НЕ работает:
$ v4l2-ctl --height=540 # для поля 1080i
Примеры разрешений для прогрессивных форматов (Frame).
720p - кадр 1280×720:
$ v4l2-ctl --width=1280 --height=720
1080p - кадр 1920×1080:
$ v4l2-ctl --width=1920 --height=1080
Для чересстрочных форматов (Field).
1080i - кадр 1920×1080 состоит из двух полей по 1920×540, но устанавливается ВСЯ высота кадра:
// Для прогрессивного видео
fmt.fmt.pix.field=V4L2_FIELD_NONE;
// Для чересстрочного видео
fmt.fmt.pix.field=V4L2_FIELD_INTERLACED;
[Современные тенденции]
Переход от Field к Frame:
- Чересстрочная развертка (Field) - устаревающий стандарт - Прогрессивная развертка (Frame) - современный стандарт - HDTV и UHDTV используют в основном прогрессивную развертку
Причины перехода:
- Лучшее качество при быстром движении - Проще обработка и сжатие - Совместимость с LCD/OLED дисплеями
[Практические примеры]
Захват прогрессивного видео 1080p60 - 60 полных кадров в секунду:
Указание `--height` устанавливает полную высоту кадра, независимо от того, является ли видео прогрессивным или чересстрочным. Для чересстрочного видео это означает, что каждое поле будет иметь высоту в 2 раза меньше.
-A, --padding=< bytes>
Установит дополнение по горизонтали (после ширины).
--fps=< fps>
Установит количество кадров в секунду (frames-per-second; по умолчанию 30).
Следующая опция действует только при чтении из файла:
-F, --field=< f>
Переназначает настройку поля. Здесь < f> может быть одной из следующих компоновок поля: any, none, top, bottom, interlaced, seq_tb, seq_bt, alternate, interlaced_tb, interlaced_bt.
Следующие опции специфичны для генератора тестового видео (test pattern generator):
--list-patterns
Перечислит доступные шаблоны для использования вместе с --pattern.
--pattern=< pat>
Выберет тестовый шаблон, по умолчанию 0.
--square
Покажет квадрат в середине выходного тестового шаблона.
--border
Покажет бордюр вокруг видео, в стиле pillar (черные полосы справа и слева) / letterboxed (черные полосы сверху и снизу).
--sav
Вставка SAV кода в каждую строку. Это относится к вставке SAV кодов (Start of Active Video) в видео данные. Это низкоуровневая функция, связанная с аналоговыми и цифровыми видеостандартами.
--eav
Вставка EAV кода в каждую строку EAV (End of Active Video), маркер конца активной видео области. Работает в паре с SAV.
--pixel-aspect=< aspect>
Установит соотношение сторон точки (pixel aspect ratio), по умолчанию действует автоопределение (autodetect). Здесь < aspect> может быть одним из следующего: square, ntsc, pal.
--video-aspect=< aspect>
Установит соотношение сторон видео, по умолчанию используется соотношение сторон кадра (frame ratio). Здесь < aspect> может быть одним из следующих значений: 4 x3, 14x9, 16x9, anamorphic.
--alpha=< alpha-value>
Значение для использования альфа-компонента, диапазон 0-255, по умолчанию 0.
--alpha-red-only
Использовать значение --alpha только для красных цветов, все другие используют 0.
--rgb-lim-range
Кодировать значения RGB как ограниченные [16-235] вместо полного диапазона.
--hor-speed=< speed>
Выбрать скорость для горизонтального перемещения, по умолчанию 0, и диапазон [-3...3].
--vert-speed=< speed>
Выбрать скорость для вертикального перемещения, по умолчанию 0, и диапазон [-3...3].
--perc-fill=< percentage>
Процент фактически заполняемого кадра. Значение по умолчанию - 100%.
Эти опции используют генератор тестового видо (test pattern generator) для тестирования OpenGL:
--test=< count>
Проверить все форматы, каждый тест генерирует < count> кадров.
--test-mask=< mask>
Маска, с которой выполняются тесты. Здесь < mask> это битовая маска из следующих значений:
0x01: итерация по форматам точки 0x02: итерация по полям 0x04: итерация по цветовым пространствам 0x08: итерация по функциям преобразования 0x10: итерация по кодированиям Y'CbCr 0x20: итерация по диапазонам квантования
[Горячие клавиши]
Q Выход из приложения.
P Цикл вперед через все поддерживаемые форматы точки. С нажатым Shift: цикл обратно. С нажатым Ctrlp: восстановит оригинальный формат точки. Доступно только с --file.
I Цикл вперед через все доступные настройки чередования полей (interlaced field). С нажатым Shift: цикл обратно. С нажатым Ctrlp: восстановит оригинальную настройку. Доступно только с --file.
C Цикл вперед через все поддерживаемые пространства цветов. С нажатым Shift: цикл обратно. С нажатым Ctrlp: восстановит оригинальную настройку.
X Цикл вперед по всем поддерживаемым функциям преобразования. С нажатым Shift: цикл обратно. С нажатым Ctrlp: восстановит оригинальную настройку.
Y Цикл вперед по всем поддерживаемым кодированиям Y'CbCr. С нажатым Shift: цикл обратно. С нажатым Ctrlp: восстановит оригинальную настройку.
H Цикл вперед по всем поддерживаемым кодированиям HSV. С нажатым Shift: цикл обратно. С нажатым Ctrlp: восстановит оригинальную настройку.
R Цикл вперед по всем поддерживаемым диапазонам квантования. С нажатым Shift: цикл обратно. С нажатым Ctrlp: восстановит оригинальную настройку.
Правый клик Откроет меню.
Двойной левый клик Переключение в полный экран и обратно.
F Переключение в полный экран и обратно.
ESC Выход из полноэкранного режима.
Space В режиме теста (--test) нажатие пробела пропустит текущий тест и перейдет к следующему. При single-stepping, продолжит на следующем кадре.
Up Уменьшит разрешение на 2 точки по высоте. Доступно только когда разрешено "Override resolution".
Down Увеличит разрешение на 2 точки по высоте. Доступно только когда разрешено "Override resolution".
Left Уменьшит разрешение на 2 точки по ширине. Доступно только когда разрешено "Override resolution".
Right Увеличит разрешение на 2 точки по ширине. Доступно только когда разрешено "Override resolution".