我成功地通过Windows上的UDP流式传输文件(音频/视频(,并在另一台带有VLC的机器上观看它(这在Stackoverflow之前已经介绍过(:
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上对此进行测试:媒体>开放网络流>网络URL>udp://@:5000
但是,在流式传输视频时,我也想将其显示在窗口上,这样我就可以自己观看流式传输(不需要音频(。
为了实现这一目标,我从一系列小实验开始,这样我就可以毫无意外地更改原始管道。如果你正在阅读这个问题,你知道我的计划效果不佳。
我的第一个实验是在单个窗口中仅显示视频:
gst-launch-1.0 -v filesrc location=video.mkv ! decodebin ! autovideosink
然后,我将其更改为在 2 个窗口上显示相同的视频,以确保我了解如何使用多线程:
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
。