js如何连续播放缓冲区中的二进制音频声音数据?
我通过websocket实时接收声音数据,如果进行实时播放?
网友回复
var buffer = (new Response(data)).arrayBuffer();//二进制缓存区内容 buffer.then(function(buf){ var audioContext = new ( window.AudioContext || window.webkitAudioContext )(); var fileResult =addWavHeader(buf, '8000', '16', '1');//解析数据转码wav audioContext.decodeAudioData(fileResult, function(buffer) { _visualize(audioContext,buffer);//播放 }); //处理音频流,转码wav var addWavHeader = function(samples,sampleRateTmp,sampleBits,channelCount){ var dataLength = samples.byteLength; var buffer = new ArrayBuffer(44 + dataLength); var view = new DataView(buffer); function writeString(view, offset, string){ for (var i = 0; i < string.length; i++){ view.setUint8(offset + i, string.charCodeAt(i)); } } var offset = 0; /* 资源交换文件标识符 */ writeString(view, offset, 'RIFF'); offset += 4; /* 下个地址开始到文件尾总字节数,即文件大小-8 */ view.setUint32(offset, /*32*/ 36 + dataLength, true); offset += 4; /* WAV文件标志 */ writeString(view, offset, 'WAVE'); offset += 4; /* 波形格式标志 */ writeString(view, offset, 'fmt '); offset += 4; /* 过滤字节,一般为 0x10 = 16 */ view.setUint32(offset, 16, true); offset += 4; /* 格式类别 (PCM形式采样数据) */ view.setUint16(offset, 1, true); offset += 2; /* ...
点击查看剩余70%