在Gstreamer中实现多流

时间:2016-06-28 04:27:49

标签: gstreamer

我已经编写了一个Gstreamer源插件,它可以生成缓冲区并转换为下游元素并进行预览。最近我收到了一个实现多流的请求,即一个流做预览,另一个流做录制(我猜想使用filesink)。我调查了'tee'插件之前,但事实证明它只支持具有相同格式/分辨率的多个流。我应该使用哪个插件如果两个流具有不同的格式/分辨率,比如说,一个管道中有两个封装过滤器?如果有插件可以做到这一点,你能提供一些如何使用它们的例子吗?

我期望的管道是这样的:

gst-launch-1.0 mysrc ! (some plugins) name=t ! video/x-raw,format=NV12,width=320,height=240 ! xvimagesink t. ! video/x-raw,format=YUY2,width=640,height=480 ! filesink location=img_file

1 个答案:

答案 0 :(得分:1)

我想你要么在你的插件中实现这个,它会生成两个src pad,你只需要正确连接filesink和videosink ..

或者您将使用tee和videoscale视频转换视频元素来实现不同的分辨率。这种方法当然对资源要求更高,第一种方法可能更好地优化(只是猜测,我对你的插件一无所知)。

这是每个不同大小的两个视频链接的示例..你必须意识到你有一个来自你的mysrc的输入..你必须复制它,然后其中一个分支必须调整大小(或者如果有两个,如果你需要)..没有别的办法。你想要的是tee和videoscale / videorate / videoconvert组合的元素..我不确定是否有这样的元素,我不确定它是否会非常有用(但也许它有道理,我只是看不到它).. ..

gst-launch-1.0 videotestsrc ! video/x-raw,width=640,height=480 ! tee name=t t. ! queue ! videoscale ! video/x-raw,width=320,height=240 ! videoconvert ! autovideosink t. ! queue ! videoscale ! video/x-raw,width=200,height=200 ! videoconvert ! autovideosink

也许我只是不明白你的问题。