将 h264 转换为原始 RGB 时 gstreamer 颜色错误
gstreamer wrong colors when converting h264 to raw RGB
我使用此命令在一台计算机上进行流式传输:
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
这会生成颜色正确的图像,如下所示:
然而,当我将此输出通过管道传输到其他程序时,我尝试了将 rgb 帧转换为纹理的自定义程序,并使用参数 pix_fmt rgb24 进行了 ffplay,但颜色不正确并且图片发生了一些奇怪的移动方法。
奇怪的是,当我尝试 bgr 时,红色在第二个输出中是正确的,而 fdisplaysink 没有改变。
我正在使用 gst-launch-1.0 --version
gst-launch-1.0 version 1.4.5
GStreamer 1.4.5
感谢任何帮助。
如以下评论所述:需要 "-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
videoconvert 支持的 GStreamer 像素格式在这里:
gst-inspect-1.0 videoconvert
事实证明,这是某种管道问题。我不确定为什么,但是通过 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 中命名管道和标准输出管道之间的区别是什么(我根本没有足够的时间研究它们),我只读过一次,命名管道的开销更少。
我使用此命令在一台计算机上进行流式传输:
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
这会生成颜色正确的图像,如下所示:
然而,当我将此输出通过管道传输到其他程序时,我尝试了将 rgb 帧转换为纹理的自定义程序,并使用参数 pix_fmt rgb24 进行了 ffplay,但颜色不正确并且图片发生了一些奇怪的移动方法。
奇怪的是,当我尝试 bgr 时,红色在第二个输出中是正确的,而 fdisplaysink 没有改变。
我正在使用 gst-launch-1.0 --version
gst-launch-1.0 version 1.4.5
GStreamer 1.4.5
感谢任何帮助。
如以下评论所述:需要 "-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
videoconvert 支持的 GStreamer 像素格式在这里:
gst-inspect-1.0 videoconvert
事实证明,这是某种管道问题。我不确定为什么,但是通过 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 中命名管道和标准输出管道之间的区别是什么(我根本没有足够的时间研究它们),我只读过一次,命名管道的开销更少。