在Java服务中运行并发GStreamer管道的最佳实践是什么?



我正在编写一个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::mainGst::quite是静态的这里的方法。在静态使它们的作用域为全局

假设有5个客户同时调用我的服务:

  1. 5个Gstreamer管道是否同时运行?
  2. 我怎样才能避免它们通过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();

我希望这对你有帮助!

相关内容

  • 没有找到相关文章

最新更新