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 -
因为我需要将从 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 -