Можно ли создать MediaStream из файла .wav? - PullRequest
1 голос
/ 17 марта 2019

В настоящее время у меня есть функция, которая получает MediaStream от navigator.getUserMedia (), которая прекрасно работает. Я хотел бы дать возможность загружать аудиофайл и имитировать его, используя ту же функцию. Мне было интересно, можно ли загрузить аудиофайл, создать объект Mediastream и передать его через функцию ниже?

    startUserMedia(stream) {
    this.setState({ audio: stream });
    var audioContext = new AudioContext();
    var source = audioContext.createMediaStreamSource(stream);
    var processor = audioContext.createScriptProcessor(8192, 1, 1);

    source.connect(processor);
    processor.connect(audioContext.destination);

    const that = this;
    let audioBuffers = [];
    this.setState({ currentDuration: 0 });
    processor.onaudioprocess = function(e) {
      // Do something with the data, i.e Convert this to WAV
      if (that.state.currentDuration < that.state.chunkDuration) {
        that.setState({
          currentDuration: that.state.currentDuration + e.inputBuffer.duration
        });

        resampler(e.inputBuffer, 16000, function(event) {
          const buffer = event.getAudioBuffer();
          if (that.state.voiceActive) {
            audioBuffers.push(buffer);
          }
        });
      } else {
        if (!that.state.voiceActive) {
          that.mergeAndSendAudio(audioBuffers, audioContext);
          that.setState({ currentDuration: 0 });
          audioBuffers = [];
          audioBuffers.push(e.inputBuffer);
        } else {
          audioBuffers.push(e.inputBuffer);
        }
      }
    };

    var options = {
      onVoiceStart: function() {
        console.log("voice start");
        that.setState({ voiceActive: true });
      },
      onVoiceStop: function() {
        console.log("voice stop");
        that.setState({ voiceActive: false });
      },
      onUpdate: function(val) {
        // console.log('curr val:', val);
      }
    };
    vad(audioContext, stream, options);
  }

1 Ответ

1 голос
/ 17 марта 2019

Нашел ответ:

  handleselectedFile = event => {
    this.setState({
      selectedFile: event.target.files[0],
      loaded: 0
    });

    const objectURL = window.URL.createObjectURL(event.target.files[0]);
    const audio = new Audio(objectURL);
    const stream = audio.captureStream();

    audio.play().then(_ => {
      this.startUserMedia(stream);
    }); // stream now has input
  };
...