AudioContext стерео выход из MediaStreamDestination в Chrome M34
Похоже, что AudioContext.createMediaStreamDestination() по умолчанию используется для монофонического вывода. Это значение по умолчанию будет изменено в будущем ( https://groups.google.com/a/chromium.org/forum/), но есть способ установить количество желаемых выходных данных каналы вручную?
Или есть какой-то другой способ получить поток из WebAudio в WebRTC при сохранении правильного количества каналов?
1 ответ
В настоящее время это кажется довольно сложным. После некоторых исследований я обнаружил, что в документации сказано, что можно установить больше каналов. Несмотря на звонки context.createMediaStreamDestination(2)
Я все еще получаю монопоток на другой стороне. Согласно этому обсуждению кажется, что вы можете добавить несколько потоков. При попытке этого, как локальный (стример), так и удаленный (получатель), кажется, показывают правильные потоки при вызове pc.getLocalStreams()
а также pc.getRemoteStreams()
соответственно. Так что вы можете использовать разделитель каналов, чтобы разделить вход на два монофонических выхода, которые вы можете передавать вместе.
К сожалению, поскольку webRTC и webAudio все еще находятся в стадии разработки, мы пока не можем передавать полученные потоки через web Audio API (используя context.createMediaStreamSource(<RTCStream>)
, это работает только для потоков микрофона), а затем просто отправьте его через слияние каналов, чтобы снова создать линию. Я все еще тестирую, добавляя полученные потоки к двум отдельным элементам Audio, чтобы получить синхронизированный звук.
Небольшое обновление
После некоторого тестирования с добавлением нескольких дорожек в поток и последующей передачей этого потока, получающая сторона <audio>
тег воспроизводил обе дорожки, и он фактически добавил их, как дорожка, содержащая левые каналы, распределена по обоим динамикам, как и правая. Таким образом, я еще не смог разделить их на стороне приемника, но, по крайней мере, смог отправить левый и правый аудио по двум разным каналам. Так что да, пора разработчикам дать нам возможность транслировать полученное аудио через API web audio.
Еще одно обновление
Кажется, что поток, созданный streamDestinationNode
автоматически является стереопотоком. Вы можете найти пример этого здесь (не забудьте добавить музыку в src
поле).
Это поведение также не связано с тем, как мы сейчас воспроизводим полученные потоки - создавая из него objectURL и назначая его <audio>
элемент источника
Это будет означать, что это связано с самой системой потоковой передачи RTC. После тестирования приведенного выше кода с RTCPeerConnection
Кажется, что он просто смешивает каналы.
Поэтому я подумал об использовании другого кодека, Opus. Я нашел некоторый код, чтобы заменить его на этот кодек, и искал способы установить кодек для использования стерео. Я нашел это и это, хотя я понятия не имею, как его использовать. Кроме того, переход на Opus автоматически не меняет его на стерео (это могло быть, если бы кодек был настроен на автоматическое выполнение этого).
Я нашел проект создания SDP для Opus. Я расследую.
РЕДАКТИРОВАТЬ: НАЙТИ
Я нашел это в третьей версии проекта RTUS Opus. Это в примере, и это довольно просто. добавлять stereo=1; sprop-stereo=1
к a=fmtp
линия, и вы сделали. Документ также содержит спецификацию для этих свойств:
стерео: указывает, предпочитает ли декодер прием стереофонических или монофонических сигналов. Возможные значения: 1 и 0, где 1 указывает, что стереофонические сигналы являются предпочтительными, а 0 указывает, что предпочтительными являются только монофонические сигналы. Независимо от параметра стерео, каждый приемник ДОЛЖЕН иметь возможность принимать и декодировать стереосигналы, но отправка стереосигналов на приемник, который сигнализирует о предпочтении моносигналов, может привести к более высокому, чем необходимо, использованию сети и сложности кодирования. Если значение не указано, предполагается моно (стерео =0).
sprop-stereo: указывает, может ли отправитель создавать стереозвук. Возможные значения: 1 и 0, где 1 указывает, что стереофонические сигналы могут быть отправлены, а 0 указывает, что отправитель, скорее всего, будет отправлять только моно. Это не является гарантией того, что отправитель никогда не отправит стереозвук (например, он может отправить предварительно записанное приглашение, использующее стереозвук), но это указывает получателю, что полученный сигнал можно безопасно микшировать до моно. Этот параметр полезен, чтобы не тратить ресурсы приемника за счет работы конвейера обработки звука (например, эхоподавления) в стерео, когда в этом нет необходимости. Если значение не указано, предполагается моно (sprop-стерео =0).
Я надеюсь, это поможет вам. Поскольку я ожидаю, что это для лучшего качества звука, я предлагаю вам прочитать этот документ, чтобы узнать больше о качественной потоковой передаче звука.
нижняя сторона
После тестирования этого с друзьями, кажется, что сторона кодирования (сторона, которая отправляет аудио) генерирует шум в Chrome 34. Я использовал Chrome 36 (dev и canary), и этой ошибки там не происходит. (при потоковой передаче с chrome 34 на 36 вы получаете шум, при потоковой передаче с 36 на 34 вы этого не делаете, так что это проблема на стороне кодирования).
(Почему я пишу такой сложный ответ? Я тоже хочу знать себя:D).