gst-launch-1.0 无法通过 UDP 流式传输 audio/video 并将其同时显示在 window 上

gst-launch-1.0 can't stream audio/video through UDP and display it on a window simultaneously

我在 Windows 上通过 UDP 成功流式传输文件 (audio/video),并在另一台机器上使用 VLC (this was covered on Whosebug before) 观看它:

gst-launch-1.0 -v filesrc location=video.mkv ! decodebin name=dec ! videoconvert ! x264enc ! video/x-h264 ! mpegtsmux name=mux ! queue ! udpsink host=127.0.0.1 port=5000 sync=true dec. ! queue ! audioconvert ! voaacenc ! audio/mpeg ! queue ! mux.

您可以在 VLC 上进行测试:Media > Open Network Stream > Network URL > udp://@:5000

但是在播放视频时,我还想在 window 上显示它,所以我可以自己看直播(不需要音频)。

为实现这一目标,我开始了一系列小实验,这样我就可以毫无意外地更改原始管道。如果您正在阅读这个问题,您就会知道我的计划效果不佳。

我的第一个实验是在单个 window:

上只显示视频
gst-launch-1.0 -v filesrc location=video.mkv ! decodebin ! autovideosink

然后,我将其更改为在 2 windows 上显示相同的视频,以确保我了解如何使用多线程:

gst-launch-1.0 -v filesrc location=video.mkv ! decodebin name=dec ! queue ! tee name=t t. ! queue ! videoconvert ! autovideosink t. ! autovideosink

最后,是时候将这两个部分混合在一起,并在本地显示时通过网络流式传输视频了。结果当然不是我所期望的:只有第一帧似乎是流式传输,然后一切都冻结了:

gst-launch-1.0 -v filesrc location=video.mkv ! decodebin name=dec ! tee name=t ! queue ! autovideosink t. ! queue ! videoconvert ! x264enc ! video/x-h264 ! mpegtsmux name=mux ! queue ! udpsink host=127.0.0.1 port=5000 sync=true dec. ! queue ! audioconvert ! voaacenc ! audio/mpeg ! queue ! mux.

似乎数据不再流经管道(出于某种我不知道的原因),我尝试添加 autovideosink 破坏了一切。

关于如何正确执行此操作的任何提示?

拆分数据的正确时机是在filesrc之后:

gst-launch-1.0 -v filesrc location=video.mkv ! tee name=t ! queue ! decodebin ! autovideosink t. ! queue ! decodebin name=dec ! videoconvert ! x264enc ! video/x-h264 ! mpegtsmux name=mux ! queue ! udpsink host=127.0.0.1 port=5000 sync=true dec. ! queue ! audioconvert ! voaacenc ! audio/mpeg ! queue ! mux.

所以数据在其他任何事情发生之前直接流向 autovideosink 而另一个线程也在同一时刻加入,将数据流向 queue 和第二个 decodebin .