+
95
-

js如何连续播放缓冲区中的二进制音频声音数据?

js如何连续播放缓冲区中的二进制音频声音数据?

我通过websocket实时接收声音数据,如果进行实时播放?

网友回复

+
15
-

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%

我知道答案,我要回答