当前:多媒体管道复用器

Kurento: multiple mediapipeline mux

我正在考虑创建一个 kms 过滤器,它将输入作为 2 个媒体管道 (A) (B) 并输出一个媒体管道 (C),视频来自第一个媒体管道 (A),音频来自第二个媒体管道 (B) .

我很困惑,我应该在 java 级别上执行此操作还是在 KMS 过滤级别上执行此操作,是否有可能在 Java/KMS 过滤层中实现此操作?

通过媒体管道,我认为你指的是媒体源,对吧?无法混合来自不同管道的媒体。

您可以使用 Composite 混合器元素进行检查。它从未经过测试,但它应该可以工作。将来自 B 的音频和来自 A 的视频混合在一起会非常简单。假设您通过 WebRtcEndpoint

获取该媒体
Composite composite = new Composite.Builder(pipeline).build();
HubPort hubPortA = new HubPort.Builder(composite).build();
webRtcA.connect(hubPortA, MediaType.VIDEO);
HubPort hubPortB = new HubPort.Builder(composite).build();
webRtcB.connect(hubPortB, MediaType.AUDIO);

WebRtcEndpoint 为清楚起见,未显示创建和协商。


编辑 1

以为你可能想要混合更多的不仅仅是这两个,但正如@santoscadenas 指出的那样,如果你只想混合两个不同类型的流,你可以直接使用 WebRtcEndpoint。这也将节省资源并更好地扩展,因为 Composite 是一个非常饥饿的东西。取自其他答案,并根据您的命名约定进行调整,它将是

webRtcA.connect(webRtcOut, MediaType.VIDEO);
webRtcB.connect(webRtOut, MediaType.AUDIO);

最简单的方法是在一个管道中创建所有内容,因为不同的媒体管道无法轻松共享媒体。都可以从客户端实现(java 或 js)。

您可以从两个 Endpoints(例如 WebRtcEndpoints)、webRtcEp1webRtcEp2 接收媒体并使用 webRtcEpOut 发射。然后像这样连接它们:

webRtcEp1.connect (webRtcEpOut, MediaType.AUDIO);
webRtcEp2.connect (webRtcEpOut, MediaType.VIDEO);

此时,WebRctOut 正在从 webRtcEp1 发出音频,从 webRtcEp2 发出视频。