【发布时间】: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 部分。