将h264转换为原始RGB时,gstreamer颜色错误

时间:2015-06-03 19:51:03

标签: linux colors rgb gstreamer

我使用此命令在一台计算机上流式传输:

gst-launch-1.0 -e v4l2src do-timestamp=true ! video264,width=1296,height=730,framerate=30/1 ! h264parse !  rtph264pay config-interval=1 ! gdppay ! udpsink host=192.168.1.116 port=5000

因此输出为YU12格式的h264。我在原始RGB中需要这种格式,因此在我使用的接收器站点上:

gst-launch-1.0 -v udpsrc port=5000 ! gdpdepay ! rtph264depay ! avdec_h264 ! decodebin ! videoconvert ! video/x-raw,format=\(string\)RGB ! videoconvert !  fpsdisplaysink sync=false text-overlay=true

这会导致图像颜色正确,如下所示: fpsdisplaysink is ok

然而,当我将此输出传输到其他程序时,我尝试将rgb帧转换为纹理并使用参数pix_fmt rgb24进行ffplay的自定义输出,颜色错误,图片以某种奇怪的方式移动。 wrong colors with piped output

奇怪的是,当我尝试bgr时,红色在第二个输出中是正确的,fdisplaysink没有改变。

我正在使用gst-launch-1.0 --version gst-launch-1.0 version 1.4.5 GStreamer 1.4.5

感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

如下面的评论中所述:需要“ - q”选项来防止gst-launch将调试信息吐出到stdout管道。

好的,有趣的故事,看起来像你在ffplay中指定视频大小时使用HEIGHTxWIDTH,而在GStreamer中你使用WIDTHxHEIGHT。这个命令工作正常:

gst-launch-1.0 -q videotestsrc pattern = ball! video / x-raw,height = 320,width = 240,framerate = 30/1,format = RGB! fdsink | ffplay -f rawvideo -pixel_format rgb24 -video_size 240x320 -i -

如果颜色发生偏移,你可能会在某处将RGB与BGR混合在一起。

您可以获取所有ffplay像素格式的列表,如下所示:

ffplay -pix_fmts

视频转换支持的GStreamer像素格式在这里:

gst-inspect-1.0视频转换

答案 1 :(得分:0)

事实证明,这是一种管道问题。我不知道为什么,但通过stdout管道到另一个程序只是改变一切。看起来框架是从错误的字节或其他东西开始的。我甚至到了视频正在做一些运动图像效果的地方,每一帧的图像更加移动。它实际上不是使用的颜色空间,它恰好发生在每一个颜色空间中。

我不确定如何删除此问题,我发布的此解决方案不是如何删除它而不是如何避免它。

Stdout无法正常工作,但保存到文件例如。所以我尝试使用命名管道。经典mkfifo。做这样的事

gst-launch-1.0 -v udpsrc port=5000 ! gdpdepay ! rtph264depay ! avdec_h264 ! decodebin ! videoconvert ! video/x-raw,height=730,width=1296,framerate=25/1,format=RGB ! videoconvert ! filesink sync=false location=pipe

并且要么打开管道,要么只是像

那样重定向它
cat pipe | program -

使它像魅力一样工作。没有颜色错误,没有移动的图片。

我不确定linux中的命名管道和stdout管道有什么区别(我根本没有足够的时间研究它们),我只是读过一次,命名管道的开销较少。