是否可以从 .wav 文件创建 MediaStream?

Posted

技术标签:

【中文标题】是否可以从 .wav 文件创建 MediaStream?【英文标题】:Is it possible to create a MediaStream from a .wav File? 【发布时间】:2019-03-17 13:44:19 【问题描述】:

我目前有一个从 navigator.getUserMedia() 接收 MediaStream 的函数,效果很好。我想提供上传音频文件并通过相同功能模仿它的选项。我想知道是否可以上传音频文件并创建一个 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】:

找到答案:

  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
  ;

【讨论】:

我使用 .wav 文件作为输入。但这对我不起作用

以上是关于是否可以从 .wav 文件创建 MediaStream?的主要内容,如果未能解决你的问题,请参考以下文章

从 PCM 转换为 WAV。是不是可以?

比较wav文件

从音频字节创建 wav 文件

如何将服务器生成的音频 wav 文件发送到客户端浏览器? [关闭]

是否可以使用 PHP 生成 WAV 文件?

使用 QAudioRecorder 时禁用创建 wav 文件