man qvidcap Печать
Добавил(а) microsin   

qvidcap - просмотрщик видео, захваченного v4l2.

Утилита 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 обработки
- Редко используется напрямую

$ v4l2-ctl --set-xfer-func=none

[Математическая основа]

Общая формула gamma коррекции:

V_out = V_in ^ (1/gamma)  // кодирование
V_in = V_out ^ gamma      // декодирование

Пример для sRGB на Python:

# Линейный свет → sRGB
def linear_to_srgb(linear): if linear < = 0.0031308: return 12.92 * linear else: return 1.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: очень крутая кривая, сохраняет детали в ярких областях

[Совместимость с цветовыми пространствами]

HDTV настройки:

$ qvidcap --colorspace=709 --xfer-func=709 --ycbcr=709

sRGB настройки:

$ qvidcap --colorspace=srgb --xfer-func=srgb

HDR настройки:

$ qvidcap --colorspace=2020 --xfer-func=smpte2084 --quantization=lim_range

[Проверка текущих настроек]

В v4l2-ctl:

$ v4l2-ctl --get-fmt-video | grep -i xfer

Или полная информация:

$ v4l2-ctl --all | grep -A5 -B5 "Transfer"

[Когда важно устанавливать transfer function]

Корректный случаи использования:

- Захват для ТВ вещания → BT.709
- Захват для web → sRGB
- HDR контент → SMPTE 2084 (PQ)
- Архивное видео → SMPTE 240M
- Кино-производство → DCI-P3

Если не устанавливать:

- Возможны "неправильные цвета"
- Потеря деталей в тенях/засветке
- Некорректное отображение на разных устройствах

[Пример полной настройки]

Для профессионального видео производства:

qvidcap \
    --xfer-func=709 \
    --colorspace=709 \
    --ycbcr=709 \
    --quantization=lim_range \
    --output=professional.mp4

-Y, --ycbcr-enc=< y>

Переназначить кодирование 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 версии
- Расширенный цветовой охват
- Для устройств с широким охватом

$ v4l2-ctl --set-ycbcr=xv601
$ v4l2-ctl --set-ycbcr=xv709

bt2020 (BT.2020), ITU-R BT.2020

- Стандарт для UHDTV (4K/8K)
- Очень широкий цветовой охват
- Используется для HDR контента

$ v4l2-ctl --set-ycbcr=bt2020

bt2020c (BT.2020 Constant Luminance)

- Constant Luminance версия BT.2020
- Улучшенная обработка яркости
- Более сложные вычисления

$ v4l2-ctl --set-ycbcr=bt2020c

smpte240M, устаревший стандарт

- Предшественник BT.709
- Представляет исторический интерес

$ v4l2-ctl --set-ycbcr=smpte240m

[Математические различия]

Коэффициенты преобразования RGB → Y'CbCr следующие.

BT.601 (SDTV):

Y' = 0.299R + 0.587G + 0.114B
Cb = -0.169R - 0.331G + 0.500B + 128
Cr = 0.500R - 0.419G - 0.081B + 128

BT.709 (HDTV):

Y' = 0.2126R + 0.7152G + 0.0722B
Cb = -0.1146R - 0.3854G + 0.5000B + 128
Cr = 0.5000R - 0.4542G - 0.0458B + 128

BT.2020 (UHDTV):

Y' = 0.2627R + 0.6780G + 0.0593B
Cb = -0.1396R - 0.3604G + 0.5000B + 128
Cr = 0.5000R - 0.4598G - 0.0402B + 128

[Практическое применение в qvidcap]

Для SDTV контента:

$ qvidcap --ycbcr-enc=601

Для HDTV контента:

$ qvidcap --ycbcr-enc=709

Для 4K HDR:

$ qvidcap --ycbcr-enc=bt2020

Полная настройка для HDTV:

$ qvidcap \
    --ycbcr-enc=709 \
    --colorspace=709 \
    --xfer-func=709 \
    --output=hdtv_capture.avi

[Цветовые охваты (Gamut)]

Сравнение охватов:

- BT.601: наименьший охват (~72% NTSC)
- BT.709: больше 601 (~80% NTSC)
- BT.2020: самый широкий (~99% DCI-P3)

[Совместимость с разрешениями]

РазрешениеСтандарт Y'CbCr
480i/576i BT.601
720p BT.709
1080i/1080p BT.709
4K/8K SDR BT.709
4K/8K HDR BT.2020

[Проверка текущих настроек]

В v4l2-ctl:

$ v4l2-ctl --get-fmt-video

Или детальная информация:

$ v4l2-ctl --all | grep -i "ycbcr\|encoding"

[Важность правильного выбора]

Последствия неправильного выбора:

- Неправильные цвета (сдвиг оттенков)
- Потеря деталей в цветности
- Некорректное сжатие
- Проблемы совместимости с устройствами воспроизведения

[Примеры использования]

Захват с камеры наблюдения (SD):

$ qvidcap --ycbcr-enc=601 --size=720x576

Захват с HD камеры:

$ qvidcap --ycbcr-enc=709 --size=1920x1080

Захват HDR контента:

$ qvidcap --ycbcr-enc=bt2020 --xfer-func=smpte2084

Связь с другими параметрами. Обычно используется вместе (согласованная настройка для 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-устройства:

-W, --width=< width>

Установка ширины.

-H, --height=< height>

Установка высоты кадра (не поля!).

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, но устанавливается ВСЯ высота кадра:

$ v4l2-ctl --width=1920 --height=1080

[Определение типа развертки]

Проверка в v4l2-ctl:

$ v4l2-ctl --get-fmt-video

Пример вывода:

Pixel Format: 'YUYV'
Width/Height: 1920/1080
Field: Interlaced  # или: Field: None (для progressive)

Просмотр всех форматов:

$ v4l2-ctl --list-formats-ext

[Работа с полями в программировании]

V4L2 API (язык C):

struct v4l2_format fmt = {0};
fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;

// Для прогрессивного видео fmt.fmt.pix.field = V4L2_FIELD_NONE;

// Для чересстрочного видео fmt.fmt.pix.field = V4L2_FIELD_INTERLACED;

[Современные тенденции]

Переход от Field к Frame:

- Чересстрочная развертка (Field) - устаревающий стандарт
- Прогрессивная развертка (Frame) - современный стандарт
- HDTV и UHDTV используют в основном прогрессивную развертку

Причины перехода:

- Лучшее качество при быстром движении
- Проще обработка и сжатие
- Совместимость с LCD/OLED дисплеями

[Практические примеры]

Захват прогрессивного видео 1080p60 - 60 полных кадров в секунду:

$ v4l2-ctl --set-fmt-video=width=1920,height=1080,pixelformat=YUYV
$ v4l2-ctl --set-parm=60

Захват чересстрочного видео, 1080i50 - 50 "полукадров" (полей) в секунду. Поле автоматически определяется как INTERLACED:

$ v4l2-ctl --set-fmt-video=width=1920,height=1080,pixelformat=YUYV

Указание `--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".

[Ссылки]

1. man v4l2-ctl.