Объедините аудиопакеты OPUS из нескольких одноранговых соединений webrt c - PullRequest
3 голосов
/ 09 июля 2020

Два клиента разговаривают с помощью службы webrt c. Из этого у меня есть два списка rtp.Packet, собранных с каждого узла webrt c.

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
})

Теперь, если я сохраню этот список, я должен был получить реальный разговор между двумя клиентами.

Но это не работает. Похоже, говорит только один клиент, а другой молчит.

Насколько я понимаю, в каждом пакете что-то есть в заголовке. Когда я объединил их в один список, они запутались. И в конечном итоге не работает должным образом.

Примечание: пользователи подключены к одному серверу. все пакеты доступны в реальном времени последовательно.

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

1 голос
/ 09 июля 2020

Пакеты RTP содержат заголовок с атрибутом отметки времени. Обратите внимание, что это не абсолютная временная метка, и она начинается со случайного смещения, что нарушает вашу идею сортировки.

См. https://tools.ietf.org/html/rfc3550 для получения полной информации. Пакеты обычно также включают источник синхронизации или ssr c, который идентифицирует серию пакетов, принадлежащих одному и тому же отправителю.

Вам нужно будет извлечь полезную нагрузку из пакета, а затем использовать декодер (обычно opus decoder) для их декодирования. Тогда у вас будет два разных файла pcm / wav, которые затем можно будет объединить, например, с помощью ffmpeg. Но убедитесь, что вы правильно указали временной сдвиг между обоими потоками

0 голосов
/ 09 июля 2020

Это более общий c ответ, может дать вам указатель, на который нужно посмотреть. Что вам нужно, так это микшер, чтобы получать все аудиоданные от одноранговых узлов и записывать их в массив, будь то ogg или pcm, и обрабатывать его любым способом вы хотите. Пожалуйста, посмотрите список api webrt c, есть ли какая-либо поддержка аудиомикшера, и попробуйте использовать его.

...