Java Android WebRTC-会议混音音轨

Java Android WebRTC-会议混音音轨,java,android,webrtc,mixing,conference,Java,Android,Webrtc,Mixing,Conference,我正在尝试解决WebRTC原生Android的一个问题。我已经成功地将AppRTCDemo从1-1调用调整为1-N调用。目前我有以下情况: A(我)可以和B说话/听B说话 A(我)可以和C说话/听C说话 B和C不能相互交谈,也不能相互倾听 为了实现这一点,我(A)分别与B和C有2个对等连接。我知道我需要混合一些媒体流或音频曲目,或者换句话说: 混合(A,B)->发送到C 混合(A,C)->发送到B 有没有关于如何做到这一点的建议?谢谢我相信您在多连接中向双方(乙方和丙方)发送相同的本地流

我正在尝试解决WebRTC原生Android的一个问题。我已经成功地将AppRTCDemo从1-1调用调整为1-N调用。目前我有以下情况:

  • A(我)可以和B说话/听B说话
  • A(我)可以和C说话/听C说话
  • B和C不能相互交谈,也不能相互倾听
为了实现这一点,我(A)分别与B和C有2个对等连接。我知道我需要混合一些媒体流或音频曲目,或者换句话说:

  • 混合(A,B)->发送到C

  • 混合(A,C)->发送到B


有没有关于如何做到这一点的建议?谢谢

我相信您在多连接中向双方(乙方和丙方)发送相同的本地流,因为如果您尝试为不同的连接创建不同的本地流,它将抛出错误,因为它将尝试再次访问麦克风和摄像头,这是不可能的(我相信)

您必须创建类似以下内容的localstream:

stream = sessionFactory.createLocalMediaStream(LOCAL_MEDIA_ID);
要将乙方流发送至丙方,您可以执行以下操作:

  • 步骤1——在甲方和乙方之间创建p2p连接
  • 步骤2——在甲方和丙方之间创建p2p连接
  • 步骤3——当您添加localstream时,您可以调用如下内容

    peerconnection2.addStream(myStream)
    
    AudioTrack t1 = mystream.audioTracks.get(0);
    VideoTrack v1 = myStream.videoTracks.get(0);
    if(myStream.removeTrack(t1)){
     if(myStream.removeTrack(v1)){
      t1 = remoteStreamC.audioTracks.get(0);
      v1 = remoteStreamC.videoTracks.get(0);
    
      myStream.addTrack(t1);
      myStream.addTrack(v1);
     }
    }
    
代替myStream(用于与C的对等连接),您可以添加remoteStreamB(从B获得的远程流)。这将把从B获得的流作为localstream添加到与C的第二个对等连接中

用于从丙方向乙方发送远程流:

  • 假设您与Party-B有peerconnection1。要将远程流从C添加到本地流,首先必须删除当前曲目,然后添加新曲目
  • 为此,你可以这样做

    peerconnection2.addStream(myStream)
    
    AudioTrack t1 = mystream.audioTracks.get(0);
    VideoTrack v1 = myStream.videoTracks.get(0);
    if(myStream.removeTrack(t1)){
     if(myStream.removeTrack(v1)){
      t1 = remoteStreamC.audioTracks.get(0);
      v1 = remoteStreamC.videoTracks.get(0);
    
      myStream.addTrack(t1);
      myStream.addTrack(v1);
     }
    }
    
    通过这种方式,您将更改发送到B的localstream的内容。现在该流将具有来自remotestreamC的音频和视频曲目


但要使此过程无错误,您必须使用错误处理,因为当有人断开连接(B或C)时,您将获得空轨迹。。。。在这种情况下,您还必须立即将挂断请求发送给另一方。

为什么需要将A和B混合发送给C?B和C有没有理由不直接建立连接?@samgak意思是,B和C直接相互连接?如果客户端(A)是一个Android应用程序,并且创建了两个到B的对等连接和另一个到C的对等连接……我不明白如何能够从客户端直接将B连接到C,正如你所建议的那样?B和C运行的是同一个应用程序吗?如果不是,它们是什么?我将其与WebRTC-2-Sip网桥一起使用。B和C是对电话号码的呼叫,可能是voip桌面电话或桌面软电话。我将很快尝试实施您的建议。我会告诉你结果的。非常感谢。你是对的。我只创建了一次localStream。并且,您的第一个示例,B-Party到C-Party工作,在创建C-Party对等连接时,我将B-Party流作为本地媒体传递给C-Party。我尝试了第二个例子,从C方到B方,但没有成功。B方已将localStream连接到它。一旦我按照你的建议更换了曲目,我就会在B-Party上丢失音频。我需要调用B-PeerConnection.removeStream(localStream)然后调用B-PeerConnection.addStream(modifiedStream)吗?换句话说,我如何“替换”B方流?这也会触发新的报价,对吗?好吧,你的回答让我得到了我需要的地方。正如我在PeerConnection中添加或删除MediaStream时发现的那样,RenegotiationNeeded被触发,但没有发送任何报价。所以我强迫它去“createOffer”。奇怪的是,您可能认为它会起作用,因为注释“无需做任何事情;AppRTC遵循预先商定的信令/协商协议”在方法体中。现在,在创建实现您建议的3路呼叫后,对等端的音频质量会显著降低。你知道为什么吗?感谢上述解决方案在添加/删除流时产生较差的音频质量。据我所知,理想的做法是将2个媒体流合并为一个媒体流,并将其添加到对等连接中。有没有关于如何解决这个问题的建议?我们正在改变媒体流,这就是为什么会出现延迟。。。你需要处理好这件事。比如说,另一端的用户将无法知道存在延迟。关于音频质量。。。我只能说,这取决于使用的编解码器。这里我们需要确保两个对等连接使用相同的编解码器。