网络音频API-使用Chrome Android记录蓝牙输入

时间:2018-08-25 00:25:47

标签: android google-chrome bluetooth audio-recording web-audio

我目前正在尝试通过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麦克风接收了音频数据,但是只有一次没有对代码进行任何更改。与其他地方的输出相比,音频也非常安静。一刷新,它就不再起作用。

0 个答案:

没有答案