【问题标题】:Combine OPUS audio packets from multiple webrtc peer connection合并来自多个 webrtc 对等连接的 OPUS 音频数据包
【发布时间】:2020-10-29 22:51:06
【问题描述】:

两个客户端正在使用 webrtc 服务进行对话。从此, 我从每个 webrtc 对等点收集了两个 rtp.Packet 列表。

var list1 []*rtp.Packet
var list2 []*rtp.Packet

我可以将每个列表保存在单独的ogg 格式文件中。

oggFile, err := oggwriter.New("list1.ogg", 48000, 2)
if err != nil {
    panic(err)
}
for _, t := range list1 {
    if err := oggFile.WriteRTP(t); err != nil {
        panic(err)
    }
}
if err := oggFile.Close(); err != nil {
    //
}

因此,我将为每个客户获取两个单独的音频文件。工作正常。

但我想合并这两个列表,因为这是一个对话。如下所示

// adding all packets in a list
list := make([]*rtp.Packet, 0)
for _, p := range list1 {
    list = append(list, p)
}
for _, p := range list2 {
    list = append(list, p)
}

// sorting packets based on timestamp
sort.Slice(list, func(i, j int) bool {
    return list[i].Timestamp < list[i].Timestamp
})

现在,如果我保存这个列表,我应该得到两个客户之间的实际对话。

但这不起作用。好像只有一个客户在说话,另一个是静音。

据我了解,每个数据包的标头中都有一些内容。当我将它们合并到一个列表中时,它们就搞砸了。最终无法按预期工作。

注意:用户连接到同一台服务器。所有数据包都按顺序实时可用。

任何帮助将不胜感激。

【问题讨论】:

  • 这个问题似乎包含三个非常松散耦合的部分,因此很难理解 1) 发生了什么; 2)你在做什么; 3)你对(2)有什么问题。解释一下:问题从一段明显不正确的代码开始:回调产生一个 goroutine 并立即退出。 goroutine 表面上从某个流中读取一个数据包并且什么都不做(它不使用pkt 变量,所以显示的代码甚至不会编译)。那么,“可以将数据从单独的流写入单独的文件”之间没有任何联系......
  • ...并且“写入单个文件”失败。根据代码 sn-p 我可能会非常猜测它缺乏正确同步的罪魁祸首(并且使用 go install -race 构建您的代码可能会检测到这一点)。
  • 所以你真的应该努力改进你的问题。目前,我们只能说“是的,可能有一些问题”,但这不会让你更接近解决它。
  • 原始代码中有很多部分。我刚刚分享了我在做什么的想法。
  • 这个问题可能值得重构,专注于如何将多个音频输入混合到单个输出。带有到目前为止您可以做的演示代码,但仅包含与音频相关的代码,请跳过 webrtc 部分。

标签: go webrtc opus


【解决方案1】:

这是一个更笼统的答案,可能会给你指点看, 您需要一个混音器来接收来自对等方的所有音频数据并将其写入数组,无论是 ogg 还是 pcm,并以您想要的方式处理它。 如果有任何对混音器的支持,请查看 webrtc api 列表并尝试使用它。

【讨论】:

    【解决方案2】:

    RTP 数据包包含带有时间戳属性的标头。请注意,这不是一个绝对时间戳,它从一个随机偏移开始,这会破坏您的排序想法。

    请参阅https://www.rfc-editor.org/rfc/rfc3550 了解完整详情。这些数据包通常还包括一个同步源或 ssrc,用于标识属于同一发送者的一系列数据包。

    您需要从数据包中提取有效负载,然后使用解码器(通常是 opus 解码器)对其进行解码。然后你将有两个不同的 pcm/wav 文件,然后可以将它们组合起来,例如使用 ffmpeg。但请确保你得到正确的两个流之间的时间偏移

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-05
      • 1970-01-01
      • 2020-07-28
      • 2014-03-14
      • 2017-11-01
      • 2020-07-19
      相关资源
      最近更新 更多