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)
Я предполагаю, что это связано с преобразованием 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 для отображения, если необходимо.