В настоящее время я пытаюсь получить аудиоданные с гарнитуры Bluetooth через API Web Audio на Chrome Android 68, работающем на Galaxy S7 в паре с гарнитурой LG HBS-770 Bluetooth.То, что делает мой AudioWorklet - это просто принимает входной звук и передает его на выход.В конце концов, я хотел бы использовать аудиоданные для записи, подобно тому, как работает Recorderjs , хотя использование AudioWorklet заменяет устаревший метод createScriptProcessor ();
Когда не подключена гарнитура Bluetoothработает отлично;Я слышу свой голос из динамиков телефона, пока я говорю.Но с подключенной гарнитурой и указанием идентификатора устройства для гарнитуры или любого другого идентификатора устройства он не получает никакого звука.Все значения аудио из входного массива в процессоре равны нулю.
Javascript:
function testAudio(deviceKeyword) {
navigator.mediaDevices.enumerateDevices().then((devices) => {
for (var i = 0; i < devices.length; i++) {
var device = devices[i];
if (device.kind === "audioinput" && device.label.toLowerCase().includes(deviceKeyword || "bluetooth")) {
return device.deviceId;
}
}
return "default";
}).then((deviceId) => {
return navigator.mediaDevices.getUserMedia({
audio: {
deviceId: deviceId
}
})
}).then((mediaStream) => {
audioContext.resume();
audioContext.audioWorklet.addModule('processor.js').then(() => {
worklet = new AudioWorkletNode(audioContext, 'recording-processor');
inputPoint = audioContext.createGain();
realAudioInput = audioContext.createMediaStreamSource(mediaStream);
realAudioInput.connect(inputPoint)
.connect(worklet).connect(audioContext.destination);
});
}).catch((e) => {
alert('Error getting audio');
console.log(e);
});
}
processor.js:
class RecordingProcessor extends AudioWorkletProcessor {
constructor() {
super();
}
process(inputs, outputs) {
let input = inputs[0];
let output = outputs[0];
for (let channel = 0; channel < output.length; ++channel) {
output[channel].set(input[channel]);
}
return true;
}
}
registerProcessor('recording-processor', RecordingProcessor);
Я подтвердил, чтоУстройство отображается в списке, предоставленном enumerateDevices:
InputDeviceInfo {deviceId: "18e8607057971918c2887f128411d9145180643b558e984f2d923ce8e1e0637f", kind: "audioinput", label: "Bluetooth headset", groupId: "82880db278303462d41f48fc89709372351631ce3e38405bd37448db47084e40"}
Я также тестировал этот код на Chrome 68, работающем в Windows 10 с включенным Bluetooth.Метки устройств отличаются, так как Windows обрабатывает драйверы устройств значительно иначе, чем Android, так что это не удивительно.Но даже если он работает с идентификатором устройства «default», он работает как положено.
Однако при тестировании различных входов с использованием этого образца WebRTC на Chrome Android звук также успешно поступает из гарнитуры.,Похоже, что он по-другому делает то, что устанавливает идентификатор элемента видео для выбранного аудиоустройства.Но это говорит мне о том, что аудиовход Bluetooth можно по крайней мере распознать, используя тот же браузер и устройство, он просто не предоставляет необработанные аудиоданные.
Кто-нибудь нашел способ получения аудиоданных с микрофона Bluetoothв настройках такого рода?
РЕДАКТИРОВАТЬ: После дальнейшего тестирования я получил аудиоданные с микрофона Bluetooth, но только в одном случае без изменений в коде.Звук также был очень тихим по сравнению с выходом в другом месте.Как только я обновился, он больше не работал.