Воспроизведение AudioStream приложения WebRTC C ++ с аудиоустройства - PullRequest
0 голосов
/ 16 апреля 2019

Я написал два приложения командной строки на C ++, которые используют WebRTC:

  • Клиент создает PeerConnection и открывает AudioStream
  • Сервер получает и воспроизводит AudioStream

Базовая реализация работает: они обмениваются SDP-Offer и -Answer, находят свои внешние IP-адреса с помощью ICE, создаются PeerConnection и PeerConnectionFactory с соответствующими ограничениями и т. Д. Я добавил ловушку на стороне сервера для RtpReceiverImpl::IncomingRtpPacketкоторый записывает полученные данные в файл.Файл содержит действительный звук PCM.Поэтому я предполагаю, что клиент успешно передает данные через сеть на серверное приложение.

На стороне сервера мой обратный вызов PeerConnectionObserver::OnAddStream вызывается и получает MediaStreamInterface.Кроме того, я могу перебирать свои DeviceManagerInterface::GetAudioOutputDevices через мои аудиоустройства.В общем, все в порядке.

Чего не хватает: мне нужен какой-то клей, чтобы сказать WebRTC, чтобы проигрывать мой AudioStream на соответствующем устройстве.Я видел, что могу получить объекты AudioSink, AudioRenderer и AudioTrack.Опять же: к сожалению, я не вижу интерфейса для передачи их на аудиоустройство.Может ли кто-нибудь помочь мне с этим?

Одно важное замечание: я хочу избежать отладки реального оборудования.Поэтому я добавил -DWEBRTC_DUMMY_FILE_DEVICES при сборке моих модулей WebRTC.Он должен записывать аудио в выходной файл, но файл содержит только 0x00.Входной файл успешно прочитан, потому что, как я упоминал ранее, аудио передается по протоколу RTP.

1 Ответ

0 голосов
/ 03 мая 2019

Наконец, я нашел решение: во-первых, я должен сказать, что мой код использует WebRTC с 2017 года. Итак, следующие вещи могли быть изменены и / или уже исправлены:

После отладки моегоКод и библиотека WebRTC, которые я видел: Когда добавлен удаленный поток, воспроизведение должно начаться автоматически.Нет необходимости на стороне разработчика вызывать playout() в VoiceEngine или что-то похожее.Когда библиотека распознает удаленный аудиопоток, воспроизведение приостанавливается, новый источник добавляется в микшер, и воспроизведение возобновляется.Единственные API для управления воспроизведением предоставляются webrtc::MediaStreamInterface, который передается через PeerConnectionObserver::OnAddStream.Примеры: SetVolume() или set_enabled().

Итак, что пошло не так в моем случае?Я использовал класс FileAudioDevice, который должен записывать необработанные аудиоданные в выходной файл вместо динамиков.Моя реализация содержит две ошибки:

  • FileAudioDevice::Playing() в любом случае вернул true.Из-за этого библиотека добавила удаленный поток, захотела возобновить воспроизведение, под названием FileAudioDevice::Playing(), который вернул true и прервался, потому что считал, что AudioDevice уже находился в режиме воспроизведения.
  • Кажется, в баге есть ошибкаКласс FileWrapper.Окончательный вывод записывается в FileAudioDevice::PlayThreadProcess() через _outputFile.Write(_playoutBuffer, kPlayoutBufferSize) на диск.Однако это не работает.К счастью, простой C fwrite () как хакерское исправление работает.
...