【发布时间】:2016-04-11 10:37:54
【问题描述】:
我正在考虑创建一个 kms 过滤器,它将输入作为 2 个媒体管道 (A) (B) 并输出一个媒体管道 (C),其中包含来自第一个媒体管道 (A) 的视频和来自第二个媒体管道 (B) 的音频。
我很困惑,我应该在 java 级别执行此操作还是在 KMS 过滤级别执行此操作,甚至可以在 Java/KMS 过滤层中实现此目标吗?
【问题讨论】:
标签: kurento
我正在考虑创建一个 kms 过滤器,它将输入作为 2 个媒体管道 (A) (B) 并输出一个媒体管道 (C),其中包含来自第一个媒体管道 (A) 的视频和来自第二个媒体管道 (B) 的音频。
我很困惑,我应该在 java 级别执行此操作还是在 KMS 过滤级别执行此操作,甚至可以在 Java/KMS 过滤层中实现此目标吗?
【问题讨论】:
标签: kurento
最简单的方法是在一个管道中创建所有内容,因为不同的媒体管道无法轻松共享媒体。所有都可以从客户端(java或js)实现。
您可以从两个Endpoints(例如WebRtcEndpoints)、webRtcEp1 和webRtcEp2 接收媒体并使用webRtcEpOut 发射。然后像这样连接它们:
webRtcEp1.connect (webRtcEpOut, MediaType.AUDIO);
webRtcEp2.connect (webRtcEpOut, MediaType.VIDEO);
此时,WebRctOut 正在从 webRtcEp1 发射音频,从 webRtcEp2 发射视频。
【讨论】:
通过媒体管道,我认为您指的是媒体来源,对吗?无法混合来自不同管道的媒体。
您可以使用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);
【讨论】: