gst-launch 适用于 fakesink 但不适用于 autovideosink

gst-launch works with fakesink but not autovideosink

我正在尝试找出如何在 GStreamer (1.4.4) 中创建一个超越非常简单 playbin 的管道。我有一个流被馈送到 GTK+ DrawingArea 小部件,但它目前正在对其进行信箱化,而我想尝试扩展视频流以适应整个小部件。

为此,我玩过 gst-launch-1.0 应用程序,但我发现最后的 fakesink 似乎有效,但 autovideosink 无效。这两条管道是(X 是 IP 摄像机的 rtspt:// URI):

gst-launch-1.0 rtspsrc location=X ! rtph264depay ! h264parse ! decodebin ! fakesink
gst-launch-1.0 rtspsrc location=X ! rtph264depay ! h264parse ! decodebin ! autovideosink

换句话说,唯一的区别是水槽本身。看来,无论我把水槽放在哪里(即使它只是一个rtspsrc location=X ! sink),问题仍然存在,并且该问题表现为:

rtspsrc gstrtspsrc.c:5074:gst_rtspsrc_loop<rtspsrc0> error: Internal data flow error
rtspsrc gstrtspsrc.c:5074:gst_rtspsrc_loop<rtspsrc0> streaming task paused, reason not-linked (-1)

我已经尝试 运行 更高的调试级别,但输出似乎没有任何有用的信息,除了已经给出的警告之外。

请注意,以下两个命令都可以正常工作:

gst-play-1.0 X
gst-launch-1.0 playbin uri=X

但是,正如所讨论的,我真的不想要 playbin,因为我想在管道中安装自己的视频缩放器。

我(尽管有限)的理解是 rtph264depay 删除了不必要的 RTSP 协议内容,h264parse 解码 H.264 数据,decodebin 自动神奇地选择正确的解码器并且 autovideosink 选择正确的接收器来显示流。

我不完全确定在管道的第五阶段改变某些东西会如何影响第一阶段的工作方式。

那为什么假水槽可以用,而自动选择的水槽不行呢?

在 autovideosink 之前添加 videoconvert 使其工作。

gst-launch-1.0 rtspsrc location=X ! rtph264depay ! h264parse ! decodebin ! videoconvert ! autovideosink

原因是sink元素不支持你decode输出的格式,所以导致错误"streaming task paused, reason not-linked"。

fakesink 不同。它只是丢弃数据,不关心格式,因此不会出现此错误。

playbin 可以播放,因为它会在需要时自动添加转换元素。