API веб-аудио navigator.getUserMedia возвращает поток для неправильного устройстваJavascript

Форум по Javascript
Ответить
Anonymous
 API веб-аудио navigator.getUserMedia возвращает поток для неправильного устройства

Сообщение Anonymous »

Я пытаюсь использовать API веб-аудио для воспроизведения синусоидального сигнала на определенном устройстве вывода звука.

(Если вам интересно, вариант использования — воспроизведение короткого сигнала частотой 1750 Гц на аудиоинтерфейсе, подключенном к любительскому радио, который «открывает» ретранслятор).
Для этого я сначала использую:

Код: Выделить всё

navigator.mediaDevices.enumerateDevices()
чтобы получить список интерфейсов вывода звука и заполнить им раскрывающийся список.
Затем в функции, прикрепленной к кнопке «Выполнить», я использую текущий выбранный идентификатор устройства в качестве ограничения в:

Код: Выделить всё

navigator.mediaDevices.getUserMedia()
чтобы получить MediaStream конкретного аудиоустройства.
После этого я:
  • Создаю экземпляр AudioContext.
  • Создаю MediaStreamDestinationNode в этом аудиоконтексте из потока
  • Создаю OscillatorNode и подключаю его выход до места назначения.
Однако я столкнулся с проблемой уже на втором этапе.
Похоже, что (проверено на Chrome 145.0.7632.117, macOS Tahoe 26.3), если посмотреть на метку дорожки, первой и единственной дорожкой MediaStream всегда является микрофон моего MacBook, а не выбранное мной динамиковое устройство. По этой причине я также не слышу воспроизводимый звук.
Я создал минимальный фрагмент воспроизведения, демонстрирующий проблему.

Вам нужно будет открыть консоль, чтобы увидеть неожиданную метку дорожки. Вам также может потребоваться вручную предоставить stacksnippets.net разрешения для микрофона и динамика, поскольку Chrome не всегда запрашивает их автоматически.


Код: Выделить всё

$(document).ready(function() {
let enumeratorPromise = navigator.mediaDevices.enumerateDevices();
enumeratorPromise.then((devices) => {
console.log(devices);
devices.forEach((device) => {
console.log("Got device from enumerator", device);
if (device.kind !== "audiooutput") return;
let $deviceOption = $("")
.text(device.label)
.val(device.deviceId)
.appendTo($("#audioout"));
});
});
$("#run").click(function() {
let id = $("#audioout").val();
navigator.mediaDevices
.getUserMedia({
audio: {
deviceId: id
}
})
.then(function(stream) {
console.log(
"got MediaStream for",
id,
stream,
stream.getTracks(),
stream.getTracks()[0].label
);
let audioContext = new AudioContext();
let mediaStreamDestination = audioContext.createMediaStreamDestination(
stream
);

audioContext.createOscillator();
oscillatorNode.type = "sine";
oscillatorNode.frequency.setValueAtTime(1750, audioContext.currentTime);
console.log(mediaStreamDestination);
oscillatorNode.connect(mediaStreamDestination);
//oscillatorNode.connect(audioContext.destination);
oscillatorNode.start();
});
});
});

Код: Выделить всё

Select audio device: 

Play 1750 Hz



Подробнее здесь: https://stackoverflow.com/questions/799 ... ong-device
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Javascript»