Gstreamer视频转换颜色转换错了?

时间:2017-11-30 14:19:37

标签: gstreamer tegra video-conversion openmax vp9

我发布gst-launch-1.0,用nvgstcamera抓取相机图片。图像被编码为VP9视频。视频为teefilesink,用于将视频保存在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启动管道显示两个重放管道的元素功能基本相同,唯一的区别是videoconvert默认使用RGB,而nvvidconv使用RGBA。在"video/x-raw,format=RGBA"后添加大写字符串videoconvert会使颜色转换没有区别。

请注意,这是在Nvidia Jetson TX2上,我想在录制过程中使用硬件加速的gstreamer插件(omxvp9encnvvidconv),但在另一台机器上重播时不会。

如何在录制过程中从视频中提取与通过管道运行的图像相同的图像,但不使用Nvidia的Jetson专用插件?

1 个答案:

答案 0 :(得分:0)

检查colorimetry信息 - https://developer.gnome.org/gst-plugins-libs/stable/gst-plugins-base-libs-gstvideo.html#GstVideoColorimetry

Videoconvert例如在转换图像时会考虑这些因素。取决于输入和输出中找到的上限。

你可能需要检查Tegra在这里做了些什么。如果信号被解释为全范围或电视范围,则很可能存在差异。或者矩阵与601和709不同。

根据精确度,转换过程中可能仍会有一些损失。对于视频编解码器的指标,如果必须,可以留在YUV色彩空间并仅使用RGB进行显示。