fix
13404089107
7 天以前 a90bcdf047a8baf02aeec81221aeeb49db523cde
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
(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);