Как транслировать поток Opus из Discord в RTP

Я использую бота Node.JS Discord для потоковой передачи голосового вызова через RTP. В настоящее время в моем обработчике событий speaking у меня есть

var cmd = child_process.spawn("ffmpeg", [
          '-protocol_whitelist', 'file,crypto,sdp,rtp,udp,pipe,opus',
          '-re',
          '-acodec', 'opus',
          '-i', '-',
          '-ar', '8000',
          '-acodec', 'pcm_mulaw',
          '-f', 'mulaw',
          '-f', 'rtp',
          `rtp://${rtp_ip}:${rtp_port}`]);
reciever.createOpusStream(user).pipe(cmd.stdin);

эквивалентно запуску команды ffmpeg ffmpeg -protocol_whitelist file,crypto,sdp,rtp,udp,pipe,opus -re acodec opus -i - -ar 8000 -acodec pcm_mulaw -f mulaw -f rtp rtp://${rtp_ip}:${rtp_port}

Варианты этой команды вызывают ошибки в диапазоне от pipe:: Invalid input или pipe:: Invalid argument до Invalid data on input. и [mp3 @ 0x5615decebe60] Format mp3 detected only with low score of 1, misdetection possible! [mp3 @ 0x5615decebe60] Failed to read frame size: Could not seek to 16101. Может ли кто-нибудь помочь мне с отправкой ReadableStream (opus) в поток mulaw RTP? Спасибо!


person qxu21    schedule 14.08.2018    source источник
comment
Каков формат, то есть инкапсуляция (не кодек) входящих данных? Огг?   -  person Gyan    schedule 14.08.2018
comment
Я использую метод discord.js, описанный здесь: discord.js.org/#/docs/main/stable/class/   -  person qxu21    schedule 14.08.2018
comment
Хорошо, это невозможно (по крайней мере, с ffmpeg). Поток имеет недопустимый формат — см. github.com/discordjs/discord.js/ вопросы/2462   -  person Gyan    schedule 14.08.2018
comment
Это для необработанного потока Opus прямо из Discord, переданного в стандартный ввод ffmpeg. Вместо этого я мог бы использовать createPCMstream, но это, вероятно, дополнительные накладные расходы.   -  person qxu21    schedule 14.08.2018


Ответы (1)


Я спросил в ffmpeg IRC и понял, что необработанные битовые потоки Opus не могут быть декодированы. Вместо этого я передал необработанный поток PCM и добавил -f s32le к входу, который указан как формат в ffmpeg -formats.

person qxu21    schedule 16.08.2018