Bootstrap

blob语音流 前端播放

首先要熟悉的几个对象

FileReader
ArrayBuffer
DataView
Int32Array
Int16Array
Int8Array

以上几个对象,对于前端来说比较陌生 遥远,三言俩语说不清,具体详细的建议大家查看官方文档。以下内容中 只会提及使用到的部分。

html部分

对于后端返回的 blob格式的语音流,前端如何转化成 src路径,使用audio标签进行播放。

HTML代码部分很简单,就是audio标签即可(我这里是基于vue)

<audio   controls currentTime autoplay   :src='srcUrl'>
</audio>

所以就是要解决 srcUrl即可,即把Blob语音流转化。

JS部分

首先来认识一个类 —FileReader
FileReader对象允许Web应用程序异步读取存储在用户计算机上的文件(或原始数据缓冲区)的内容,使用 File 或 Blob 对象指定要读取的文件或数据。

其中一个方法readAsArrayBuffer():
FileReader.readAsArrayBuffer() - - 开始读取指定的 Blob中的内容, 一旦完成, result 属性中保存的将是被读取文件的 ArrayBuffer 数据对象.

FileReader.onload:
处理load事件。该事件在读取操作完成时触发。

结合onload事件,可以在 onload 事件中console.log(e),会发现e.srcElement.result是readAsArrayBuffer转化的结果。

// Blobdata 就是后端返回给你的Blob数据
const reader = new FileReader();
reader.readAsArrayBuffer(Blobdata);
reader.onload = (e) => {
   
   const bufer = e.srcElement.result;
   const blob = this.addWavHeader(bufer, 16000, 16, 1);
   this.srcUrl = window.URL.createObjectURL(blob);
};

this.addWavHeader 函数是给这段buffer 加上头部信息,这样最后在用window.URL.createObjectURL就可以转化成播放路径。

addWavHeader(samples, sampleRateTmp, sampleBits, channelCount) {
   
      const dataLength = samples.byteLength;
      /* 新的buffer类,预留44bytes的heaer空间 */
      const buffer = new ArrayBuffer(44 + dataLength);
      /* 转为 Dataview, 利用API来填充字节 */
      const view 
;