Web Audio API - запись ввода Bluetooth с помощью Chrome Android - PullRequest
0 голосов
/ 25 августа 2018

В настоящее время я пытаюсь получить аудиоданные с гарнитуры 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, но только в одном случае без изменений в коде.Звук также был очень тихим по сравнению с выходом в другом месте.Как только я обновился, он больше не работал.

...