Gstreamer Видеоконвертировать неправильно преобразование цветов?

Я запускаю gst-launch-1.0 который захватывает изображения с камеры с nvgstcamera, Изображения кодируются в видео VP9. Видео teeбы к filesink который сохраняет видео в WebM-контейнере и декодере VP9, ​​который передает изображения в appsink,

Позже я хочу извлечь кадры из сохраненного видео и снова запустить их через приложение. Важно, чтобы кадры были абсолютно идентичны тем, которые были переданы в appsink во время захвата видео.

К сожалению, декодированные кадры выглядят немного иначе, в зависимости от того, как вы их извлекаете.

Минимальный рабочий пример:

Запись:

$ gst-launch-1.0 nvcamerasrc ! "video/x-raw(memory:NVMM), format=NV12" ! omxvp9enc ! tee name=splitter \
  splitter. ! queue ! webmmux ! filesink location="record.webm" \
  splitter. ! queue ! omxvp9dec ! nvvidconv ! "video/x-raw,format=RGBA" ! pngenc ! multifilesink location="direct_%d.png"

Воспроизведение с nvvidconv элемент:

$ gst-launch-1.0 filesrc location=record.webm ! matroskademux ! omxvp9dec \
! nvvidconv ! pngenc ! multifilesink location="extracted_nvvidconv_%d.png"

Воспроизведение с videoconvert элемент:

$ gst-launch-1.0 filesrc location=record.webm ! matroskademux ! omxvp9dec \
! videoconvert ! pngenc ! multifilesink location="extracted_videoconvert_%d.png"

Тестирование различий в изображениях:

$ compare -metric rmse direct_25.png extracted_nvvidconv_25.png null
0

$ compare -metric rmse direct_25.png extracted_videoconvert_25.png null
688.634 (0.0105079)

nvvidconv: nvvidconv

videoconvert: videoconvert

Я предполагаю, что это связано с преобразованием I420 в RGB. Так videoconvert кажется, использует другое преобразование цвета, чем nvvidconv,

Запуск трубопровода с gst-launch -v показывает, что возможности элемента в основном одинаковы для обоих конвейеров воспроизведения, единственное отличие состоит в том, что видеоконвертер использует RGB по умолчанию, а nvvidconv использует RGBA. Добавление строки заглавных букв "video/x-raw,format=RGBA" позади videoconvert однако не делает никакой разницы в преобразовании цветов.

Обратите внимание, что это на Nvidia Jetson TX2, и я хотел бы использовать аппаратно-ускоренные плагины gstreamer во время записи (omxvp9enc, nvvidconv), но не во время воспроизведения на другой машине.

Как я могу извлечь из видео изображения, которые идентичны изображениям, проходящим через конвейер во время записи, но без использования Jvidia-специфичных плагинов Nvidia?

1 ответ

Решение

Проверить colorimetry информация - https://developer.gnome.org/gst-plugins-libs/stable/gst-plugins-base-libs-gstvideo.html

Видеоконвертирование, например, учитывает это при конвертации изображений. В зависимости от найденных заглушек на входе и выходе.

Вы, вероятно, должны проверить, что делает Tegra здесь. Скорее всего, есть разница, если сигнал интерпретируется как полный или телевизионный диапазон. Или матрицы отличаются от 601 и 709.

В зависимости от точности все еще могут быть некоторые потери во время преобразования. Для метрик в видеокодеках может иметь смысл оставаться в цветовом пространстве YUV и использовать только RGB для отображения, если необходимо.

Другие вопросы по тегам