【问题标题】:Gstreamer videoconvert color conversion wrong?Gstreamer videoconvert 颜色转换错误?
【发布时间】:2018-05-14 12:16:22
【问题描述】:

我正在启动一个gst-launch-1.0,它使用nvgstcamera 捕获相机图像。图像被编码为 VP9 视频。视频被 tee'd 到 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:

视频转换:

我的猜测是这与 I420 到 RGB 的转换有关。所以videoconvert 似乎使用了与nvvidconv 不同的颜色转换。

使用gst-launch -v 启动管道显示两个replay pipelines 的元素能力基本相同,唯一的区别是videoconvert 默认使用RGB,而nvvidconv 使用RGBA。但是在videoconvert 后面添加大写字符串"video/x-raw,format=RGBA" 不会对颜色转换产生影响。

请注意,这是在 Nvidia Jetson TX2 上,我想在录制期间使用硬件加速的 gstreamer 插件(omxvp9encnvvidconv),而不是在另一台机器上回放期间。

如何在不使用 Nvidia 的 Jetson 特定插件的情况下从视频中提取与录制期间通过管道运行的图像相同的图像?

【问题讨论】:

    标签: gstreamer tegra video-conversion openmax vp9


    【解决方案1】:

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

    例如,Videoconvert 在转换图像时会将这些考虑在内。取决于在输入和输出中发现的上限。

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

    根据精度,在转换过程中可能仍有一些损失。对于视频编解码器的指标,保留 YUV 色彩空间并在必要时仅使用 RGB 进行显示可能是有意义的。

    【讨论】:

    • nvvidconv 和 videoconvert 都使用 chroma-site=mpeg2,colorimetry=bt709。电视范围是一个有趣的想法,我会尝试检查。
    • 最终解决方案是什么?在使用 gstreamer 管道将 I420 帧保存为 png 和 jpeg 时(或者在 gstreamer 和 opencv 中保存 png 时),我遇到了类似的问题。
    • 抱歉,我不记得了:/我们在某个时候转移到了 GigE 相机,所有这些问题都被新问题所取代;)
    猜你喜欢
    • 2014-05-16
    • 1970-01-01
    • 1970-01-01
    • 2018-02-18
    • 1970-01-01
    • 2016-04-30
    • 2014-06-04
    • 2017-08-11
    • 1970-01-01
    相关资源
    最近更新 更多