【问题标题】:Android WebRTC - Mix AudioTracks for ConferenceAndroid WebRTC - 为会议混合音轨
【发布时间】:2016-09-19 18:17:18
【问题描述】:

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

  • A(我)可以和B说话/听B
  • A(我)可以和 C 说话/听 C
  • B 和 C 不能互相交谈或听对方说话。

为了实现这一点,我 (A) 分别与 B 和 C 有 2 个 PeerConnections。我知道我需要混合一些媒体流或音轨的方式,或者换句话说:

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

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

关于如何做到这一点的任何指示?谢谢

【问题讨论】:

  • 为什么要混合A和B并发送给C? B和C有什么理由不直接建立连接?
  • @samgak 意思是,B 和 C 直接相互连接?如果客户端 (A) 是一个 Android 应用程序,并创建了 2 个到 B 的对等连接和另一个到 C...我不明白如何从客户端直接将 B 连接到 C?
  • B 和 C 运行的是同一个应用程序吗?如果不是,它们是什么?
  • 我将它与 WebRTC-2-Sip 桥接器一起使用。 B 和 C 是对电话号码的呼叫,可以是 voip 桌面电话或桌面软件电话。

标签: java android webrtc mixing conference


【解决方案1】:

我相信您在多连接中向双方(B 方和 C 方)发送相同的本地流,因为如果您尝试为不同的连接创建不同的本地流,则会抛出错误,因为它会尝试访问 mic和相机再次这是不可能的(我相信)。

您必须像这样创建本地流:

stream = sessionFactory.createLocalMediaStream(LOCAL_MEDIA_ID);

要将Party-B的流发送到Party-C,您可以这样做:

  • step1--在甲方和乙方之间建立p2p连接
  • step2--在party-A和party-C之间建立p2p连接
  • 第 3 步——当你添加本地流时,你会调用类似这样的东西

    peerconnection2.addStream(myStream)
    

代替 myStream(用于与 C 的对等连接),您可以添加 remoteStreamB(您从 B 获得的远程流)。这会将您从 B 获取的流作为本地流添加到与 C 的第二个对等连接中。

用于从 Party-C 向 Party-B 发送远程流:

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

    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 的本地流的内容。现在该流将包含来自 remotestreamC 的音频和视频轨道。

但要使此过程无错误,您将不得不使用错误处理,因为当有人断开连接(B 或 C)时,您将获得空轨道....在这种情况下,您必须立即发送挂断也向对方提出要求。

【讨论】:

  • 我会尽快尝试实施您的建议。我会让你知道结果。谢谢!!
  • 你是对的。我只创建一次 localStream 。而且,您的第一个示例,B-Party 到 C-Party 有效,在创建 C 方 peerConnection 时,我将 B 方流作为 localMedia 传递给 C 方。我已经尝试了第二个示例 C-Party 到 B-Party,但没有成功。 B 方已经附加了 localStream。一旦我按照您的建议替换了曲目,我就会在 B-Party 上丢失音频。我需要调用 B-PeerConnection.removeStream(localStream) 然后 B-PeerConnection.addStream(modifiedStream) 吗?换句话说,我如何“替换” B 方流?这也应该触发新的报价,对吗?
  • 好的,你的回答让我得到了我需要的地方。事实证明 onRenegotiationNeeded 被触发,但是当我从 PeerConnection 添加或删除 MediaStream 时没有发送任何报价。所以我强迫它“createOffer”。奇怪,因为您认为它会起作用,因为注释“无需做任何事情;AppRTC 遵循预先商定的信令/协商协议”在方法主体中。现在,在创建实施您建议的 3 路呼叫之后,对等端的音频质量会显着下降。任何想法为什么?谢谢
  • 上述解决方案在添加/删除流时会产生较差的音频质量。据我了解,理想情况是将 2 个媒体流合并为一个媒体流并将其添加到对等连接。关于如何解决这个问题的任何指示?
  • 我们正在改变媒体流,这就是为什么会有滞后......你需要处理这种情况。比如说另一端的用户将无法知道存在延迟。关于音频质量......我只能说这取决于使用的编解码器。我们需要在这里确保两个对等连接使用相同的编解码器。
猜你喜欢
  • 2011-03-25
  • 2012-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-03
相关资源
最近更新 更多