GStreamer 中的 fdsink 元素不能用于将正确的字节流输出到管道

The fdsink element in GStreamer cannot be used to output the correct byte-stream to the pipeline

因为我需要将从 GStreamer 命令行拉出的 RTSP 流输出到我的 Python 程序,所以我使用 fdsink 元素从管道输出字节流。 使用 xvimagesink 元素可以正确显示视频。命令行如下

gst-launch-1.0 rtspsrc location=rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mp4 ! queue2 ! rtph264depay ! capsfilter caps="video/x-h264, width=240, height=160" ! avdec_h264 ! videoconvert ! xvimagesink

正确的视频:

然后我使用fdsink代替xvimagesink元素从管道输出字节流并用ffplay播放。它无法显示正确的视频。命令行如下

gst-launch-1.0 rtspsrc location=rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mp4 ! queue2 ! rtph264depay ! capsfilter caps="video/x-h264, width=240, height=160" ! avdec_h264 ! videoconvert ! fdsink | ffplay -f rawvideo -pixel_format rgb24 -video_size 240*160 -i -

错误的视频:

那么是fdsink元素错了还是其他元素错了?感谢您抽出时间帮我解决问题

有两个问题:

  • GStreamer 将文本消息写入 stdout,FFplay 将文本解释为原始像素。
    添加 --quiet 以防止 GStreamer 将文本写入 stdout.

  • 默认的 GStreamer 原始视频格式是“平面 RGB”——红色平面然后绿色平面然后蓝色平面。
    我们可以通过添加将像素格式转换为数据有序 BGR (b,g,r,b,g,r...):
    capsfilter caps="video/x-raw, format=BGR"


以下命令在我的机器上运行良好:

gst-launch-1.0 --quiet rtspsrc location=rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mp4 ! queue2 ! rtph264depay ! capsfilter caps="video/x-h264, width=240, height=160" ! avdec_h264 ! videoconvert ! capsfilter caps="video/x-raw, format=BGR" ! fdsink | ffplay -f rawvideo -pixel_format rgb24 -video_size 240x160 -i -


没有capsfilter caps="video/x-h264, width=240, height=160"也可以:

gst-launch-1.0 --quiet rtspsrc location=rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mp4 ! queue2 ! rtph264depay ! avdec_h264 ! videoconvert ! capsfilter caps="video/x-raw, format=BGR" ! fdsink | ffplay -f rawvideo -pixel_format rgb24 -video_size 240x160 -i -