我目前正在尝试通过Chrome Android 68上的Web Audio API从蓝牙耳机中获取音频数据,该设备运行在与LG HBS-770蓝牙耳机配对的Galaxy S7上。我的AudioWorklet所做的只是简单地获取输入音频并将其通过管道输出。最终,尽管要使用AudioWorklet代替过时的createScriptProcessor()方法,但我还是想使用音频数据来进行录音,类似于Recorderjs的工作方式。
没有连接蓝牙耳机时,它可以完美工作;我说话时会听到来自手机扬声器的声音。但是在连接了耳机并指定耳机的deviceId或任何其他deviceId的情况下,它不会接收任何音频。处理器中输入数组的音频值全为零。
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"}
我也已经在启用蓝牙的Windows 10上运行的Chrome 68上测试了此代码。设备标签不同,因为Windows处理设备驱动程序的方式与Android不同,因此这并不奇怪。但是,即使使用deviceId“ default”运行它,它也能按预期工作。
但是,当在Chrome Android上使用此WebRTC sample测试不同的输入时,音频也成功地来自耳机。看起来不同的是,它将视频元素的接收器ID设置为所选的音频deviceId。但这告诉我,至少可以使用相同的浏览器和设备来识别蓝牙音频输入,只是它不会公开原始音频数据。
有人用这种设置找到了一种从蓝牙麦克风获取音频数据的方法吗?
编辑:经过进一步测试,我从Bluetooth麦克风接收了音频数据,但是只有一次没有对代码进行任何更改。与其他地方的输出相比,音频也非常安静。一刷新,它就不再起作用。