Аудиозапись с использованием WebAudio api в react с функцией воспроизведения / паузы

#javascript #reactjs #web-audio-api

#javascript #reactjs #web-audio-api

Вопрос:

У меня есть приложение в react с webaudio api для записи голоса. В нем есть функция воспроизведения / паузы. Иногда звук воспроизводится без голоса, иногда некоторые части отсутствуют, но длина звука правильная. Иногда звук правильный. Ниже приведен мой код. Кто-нибудь может указать на ошибку в коде?

 import React from 'react';
import { Button} from 'react-bootstrap';
import { saveAs } from 'file-saver';
import 'bootstrap/dist/css/bootstrap.min.css';
import './App.css';


var audioBufferUtils = require("audio-buffer-utils")
var encodeWAV = require('audiobuffer-to-wav')

let audio = new Audio();
var context = new AudioContext()
var audioBuffer = []
function App() {

  var status  = true

  function listen() {
    initDevice()
  }

  function pauseRecording(){
    if (status){
      context.suspend()
      status = false
    }
    else{
      context.resume()
      status = true
    }
    
  }

  function initDevice(){
  const handleSuccess = function(stream) {
    const source = context.createMediaStreamSource(stream);
    const processor = context.createScriptProcessor(1024, 1, 1);
    
    source.connect(processor);
    processor.connect(context.destination);
    processor.onaudioprocess = function(e) {
      audioBuffer =  audioBufferUtils.concat(audioBuffer,e.inputBuffer)
    };
  };

  navigator.mediaDevices.getUserMedia({ audio: true, video: false })
      .then(handleSuccess);
  };
  function saveAudio(){
    context.suspend()
    var wav = encodeWAV(audioBuffer)
    var blob = new Blob([ new DataView(wav) ], {
      type: 'audio/wav'
    })

    let finalAudio = new Audio()
    var url = window.URL.createObjectURL(blob)        
    finalAudio.src = url
    finalAudio.play()
    saveAs(blob,"test.wav")

  }

  return (
        <div >
          <Button variant="warning" id="listen" onClick={listen}>Listen</Button>
          <Button variant="warning" id="stop" onClick={pauseRecording}>play/pause</Button>

          <Button variant="warning" id="stop" onClick={saveAudio}>Save</Button>
        </div>
  );
}

export default App;
  

Я хочу использовать webaudio api, потому что мне нужно обработать звук после завершения записи

Ответ №1:

Код кажется прекрасным. Я подозреваю, что проблема здесь в том, что ScriptProcessor задыхается. Поскольку он не может завершить выполнение onaudioprocess вовремя для следующего вызова onaudioprocess . Обычно это приводит к такому случайному поведению.

Простая вещь, которую нужно попробовать, это поиграть с bufferSize параметром ScriptProcessor. Иногда это может помочь.

Другим возможным решением может быть перенос объединения аудиобуферов в WebWorker, чтобы основной поток был готов к выполнению следующего onaudioprocess . Я считаю, что библиотеки, такие как recorder.js сделайте это.

Наконец, вы также можете рассмотреть возможность использования чего-то вродеhttps://github.com/mattdiamond/Recorderjs или один из обновленных форков для этого