(function (window) { var Player = function () { //创建一个音频环境对象 audioContext = window.AudioContext || window.webkitAudioContext; var context = new audioContext(); var isPlaying = false; var audioBuffers = [] var audioBuffer = context.createBuffer(1, 8000, 8000); var playNextBuffer = function() { isPlaying = false; if (audioBuffers.length) { playAudio(audioBuffers.shift()); } //if (audioBuffers.length > 1) audioBuffers.shift(); //console.log(audioBuffers.length) }; var copyToCtxBuffer = function(fromBuffer) { var nowBuffering = audioBuffer.getChannelData(0); var buffer = new Int8Array( fromBuffer); for (var i = 0; i < 8000; i++) { var word = (buffer[i * 2] & 0xff) + ((buffer[i * 2 + 1] & 0xff) << 8); nowBuffering[i] = (((word + 32768) % 65536) - 32768) / 32768.0; } }; var playAudio = function(fromBuffer) { if (isPlaying) { //var buffer = new Int8Array( fromBuffer); //copyAudioOutputArray(buffer); audioBuffers.push(fromBuffer); return; } isPlaying = true; copyToCtxBuffer(fromBuffer); var source = context.createBufferSource(); source.buffer = audioBuffer; source.connect(context.destination); source.onended = playNextBuffer; //setTimeout(playNextBuffer, audioBufferTime-audioBuffers.length*200); source.start(); }; config = {}; config.channelCount = 1; config.numberOfInputChannels = config.channelCount; config.numberOfOutputChannels = config.channelCount; config.sampleBits = config.sampleBits || 16; //采样数位 8, 16 //config.sampleRate = config.sampleRate || (context.sampleRate / 6); //采样率(1/6 44100) config.sampleRate = config.sampleRate || 8000; //采样率16K //创建缓存,用来缓存声音 config.bufferSize = 8192; //将声音输入这个对像 var audioOutput = context.createBufferSource(); //设置音量节点 var volume = context.createGain(); audioOutput.connect(volume); // 创建声音的缓存节点,createScriptProcessor方法的 // 第二个和第三个参数指的是输入和输出都是声道数。 var player = context.createScriptProcessor(config.bufferSize, 0, config.channelCount); //开始播放 this.start = function () { audioOutput.connect(player); player.connect(context.destination); }; //停止 this.stop = function () { player.disconnect(); context.close(); }; this.addPlay = function (blob) { var reader = new FileReader(); // 读取这四个字节 reader.readAsArrayBuffer(blob); reader.onload = function (e) { var buffer = reader.result; var view = new DataView(buffer); playAudio(view.buffer); }; }; var $bo=$("#inbo"); var $change=$("#change"); var width=$bo.width(); //音频采集 player.onaudioprocess = function (e) { //console.log(e.playbackTime); }; }; //抛出异常 Player.throwError = function (message) { throw new function () { this.toString = function () { return message; };}; }; //获取播放机 Player.get = function (callback) { if (callback) { var rec = new Player(); callback(rec); } }; window.Player = Player; })(window);