2

我正在启动一个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

视频转换:视频转换

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

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

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

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

4

1 回答 1

1

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

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

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

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

于 2017-11-30T15:11:44.163 回答