我正在编写一个Java服务,利用Gstreamer Java Bindings来动态转换输入的媒体文件。
示例代码:
Gst.init(Version.BASELINE, "myPipeline");
pipeline = (Pipeline) Gst.parseLaunch("videotestsrc ! autovideosink");
pipeline.play();
pipeline.getBus().connect((Bus.EOS) (source) -> Gst.quit());
Gst.main();
但是我不明白为什么Gst::init
,Gst::main
和Gst::quite
是静态的这里的方法。在静态使它们的作用域为全局
假设有5个客户同时调用我的服务:
- 5个Gstreamer管道是否同时运行?
- 我怎样才能避免它们通过EOS回调终止对方?
我错过了什么吗?感谢任何帮助!
我不是这方面的专家,但我认为代码中的Gst.init()
,Gst.main()
和Gst.quit()
方法是静态的,因为它们是GStreamer Java绑定库的一部分,这是围绕GStreamer多媒体框架的Java包装器。这些方法初始化并运行GStreamer管道,并且被设计为在静态上下文中使用,这意味着它们独立于管道的任何特定实例。
我相信,当你运行代码时,每个客户都有他们自己的管道实例在运行,但是他们都将共享相同的GStreamer运行时环境。Gst.init()方法初始化GStreamer运行时环境,Gst.quit()方法将其关闭。Gst.main()方法启动GStreamer主循环,该循环处理诸如EOS(流结束)消息之类的事件。
为了避免多个并发运行的管道的EOS回调之间的冲突,可以使用connect()方法的source参数来区分不同管道的EOS消息。例如,你可以为每个管道分配一个唯一的标识符,并在EOS回调中使用该标识符来确定哪个管道已经到达流的末端。
类似如下:
String pipelineName = "myPipeline-" + UUID.randomUUID().toString();
Gst.init(Version.BASELINE, pipelineName);
Pipeline pipeline = (Pipeline) Gst.parseLaunch("videotestsrc ! autovideosink");
pipeline.play();
// Use a lambda expression to handle the EOS message for this pipeline
pipeline.getBus().connect((Bus.EOS) (source) -> {
String pipelineName = source.getName();
System.out.println("Pipeline " + pipelineName + " reached end of stream");
});
Gst.main();
Gst.quit();
我希望这对你有帮助!