webRTC 语音调试代码(WwW.H5.Ltd)

按住A键发送语音数据
html


  1.         
  2.                
  3.                
  4.                
  5.                
  6.         
  7.         

  8.         
  9.         

复制代码





js:


  1. navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia;

  2. var gRecorder = null;
  3. var audio = document.querySelector('audio');
  4. var door = false;
  5. var ws = null;

  6. var tsts = function(){

  7.                 SRecorder.get(function(rec) {
  8.                         gRecorder = rec;
  9.                 });
  10.                 // 初始化 网络,链接本地数据
  11.                 // ws = new WebSocket("wss://x.x.x.x:8888");
  12.                 ws = new WebSocket("ws://127.0.0.1:8001/ChatServer?");
  13.                 
  14.                 // 捂手成功
  15.                 ws.onopen = function() {
  16.                         console.log('握手成功');
  17.                         ws.send('user:test!!!');
  18.                 };

  19.                 ws.onmessage = function(e) {
  20.                         receive(e.data);
  21.                 };
  22.                 // 按下
  23.                 document.onkeydown = function(e) {
  24.                         if(e.keyCode === 65) { // 大写的A
  25.                                 if(!door) {
  26.                                         // 开始录音
  27.                                         gRecorder.start();
  28.                                         door = true;
  29.                                 }
  30.                         }
  31.                 };

  32.                 // 抬起
  33.                 document.onkeyup = function(e) {
  34.                         if(e.keyCode === 65) {
  35.                                 if(door) {
  36.                                         // 发送数据 websocket 服务器
  37.                                         console.log(gRecorder.getBlob())
  38.                                         ws.send(gRecorder.getBlob());
  39.                                         gRecorder.clear();
  40.                                         gRecorder.stop();
  41.                                         door = false;
  42.                                 }
  43.                         }
  44.                 }
  45. }


  46. var SRecorder = function(stream) {
  47.         config = {};        

  48.         config.sampleBits = config.smapleBits || 8;
  49.         config.sampleRate = config.sampleRate || (44100 / 6);

  50.         var context = new AudioContext();
  51.         var audioInput = context.createMediaStreamSource(stream);
  52.         var recorder = context.createScriptProcessor(4096, 1, 1);

  53.         var audioData = {
  54.                 size: 0 //录音文件长度
  55.                         ,
  56.                 buffer: [] //录音缓存
  57.                         ,
  58.                 inputSampleRate: context.sampleRate //输入采样率
  59.                         ,
  60.                 inputSampleBits: 16 //输入采样数位 8, 16
  61.                         ,
  62.                 outputSampleRate: config.sampleRate //输出采样率
  63.                         ,
  64.                 oututSampleBits: config.sampleBits //输出采样数位 8, 16
  65.                         ,
  66.                 clear: function() {
  67.                         this.buffer = [];
  68.                         this.size = 0;
  69.                 },
  70.                 input: function(data) {
  71.                         this.buffer.push(new Float32Array(data));
  72.                         this.size += data.length;
  73.                 },
  74.                 compress: function() { //合并压缩
  75.                         //合并
  76.                         var data = new Float32Array(this.size);
  77.                         var offset = 0;
  78.                         for(var i = 0; i < this.buffer.length; i++) {
  79.                                 data.set(this.buffer[i], offset);
  80.                                 offset += this.buffer[i].length;
  81.                         }
  82.                         //压缩
  83.                         var compression = parseInt(this.inputSampleRate / this.outputSampleRate);
  84.                         var length = data.length / compression;
  85.                         var result = new Float32Array(length);
  86.                         var index = 0,
  87.                                 j = 0;
  88.                         while(index < length) {
  89.                                 result[index] = data[j];
  90.                                 j += compression;
  91.                                 index++;
  92.                         }
  93.                         return result;
  94.                 },
  95.                 encodeWAV: function() {
  96.                         var sampleRate = Math.min(this.inputSampleRate, this.outputSampleRate);
  97.                         var sampleBits = Math.min(this.inputSampleBits, this.oututSampleBits);
  98.                         var bytes = this.compress();
  99.                         var dataLength = bytes.length * (sampleBits / 8);
  100.                         var buffer = new ArrayBuffer(44 + dataLength);
  101.                         var data = new DataView(buffer);

  102.                         var channelCount = 1; //单声道
  103.                         var offset = 0;

  104.                         var writeString = function(str) {
  105.                                 for(var i = 0; i < str.length; i++) {
  106.                                         data.setUint8(offset + i, str.charCodeAt(i));
  107.                                 }
  108.                         };

  109.                         // 资源交换文件标识符
  110.                         writeString('RIFF');
  111.                         offset += 4;
  112.                         // 下个地址开始到文件尾总字节数,即文件大小-8
  113.                         data.setUint32(offset, 36 + dataLength, true);
  114.                         offset += 4;
  115.                         // WAV文件标志
  116.                         writeString('WAVE');
  117.                         offset += 4;
  118.                         // 波形格式标志
  119.                         writeString('fmt ');
  120.                         offset += 4;
  121.                         // 过滤字节,一般为 0x10 = 16
  122.                         data.setUint32(offset, 16, true);
  123.                         offset += 4;
  124.                         // 格式类别 (PCM形式采样数据)
  125.                         data.setUint16(offset, 1, true);
  126.                         offset += 2;
  127.                         // 通道数
  128.                         data.setUint16(offset, channelCount, true);
  129.                         offset += 2;
  130.                         // 采样率,每秒样本数,表示每个通道的播放速度
  131.                         data.setUint32(offset, sampleRate, true);
  132.                         offset += 4;
  133.                         // 波形数据传输率 (每秒平均字节数) 单声道×每秒数据位数×每样本数据位/8
  134.                         data.setUint32(offset, channelCount * sampleRate * (sampleBits / 8), true);
  135.                         offset += 4;
  136.                         // 快数据调整数 采样一次占用字节数 单声道×每样本的数据位数/8
  137.                         data.setUint16(offset, channelCount * (sampleBits / 8), true);
  138.                         offset += 2;
  139.                         // 每样本数据位数
  140.                         data.setUint16(offset, sampleBits, true);
  141.                         offset += 2;
  142.                         // 数据标识符
  143.                         writeString('data');
  144.                         offset += 4;
  145.                         // 采样数据总数,即数据总大小-44
  146.                         data.setUint32(offset, dataLength, true);
  147.                         offset += 4;
  148.                         // 写入采样数据
  149.                         if(sampleBits === 8) {
  150.                                 for(var i = 0; i < bytes.length; i++, offset++) {
  151.                                         var s = Math.max(-1, Math.min(1, bytes[i]));
  152.                                         var val = s < 0 ? s * 0x8000 : s * 0x7FFF;
  153.                                         val = parseInt(255 / (65535 / (val + 32768)));
  154.                                         data.setInt8(offset, val, true);
  155.                                 }
  156.                         } else {
  157.                                 for(var i = 0; i < bytes.length; i++, offset += 2) {
  158.                                         var s = Math.max(-1, Math.min(1, bytes[i]));
  159.                                         data.setInt16(offset, s < 0 ? s * 0x8000 : s * 0x7FFF, true);
  160.                                 }
  161.                         }

  162.                         return new Blob([data], { type: 'audio/wav' });
  163.                 }
  164.         };

  165.         this.start = function() {
  166.                 audioInput.connect(recorder);
  167.                 recorder.connect(context.destination);
  168.         }

  169.         this.stop = function() {
  170.                 recorder.disconnect();
  171.         }

  172.         this.getBlob = function() {
  173.                 return audioData.encodeWAV();
  174.         }

  175.         this.clear = function() {
  176.                 audioData.clear();
  177.         }

  178.         recorder.onaudioprocess = function(e) {
  179.                 audioData.input(e.inputBuffer.getChannelData(0));
  180.         }
  181. };

  182. SRecorder.get = function(callback) {
  183.         if(callback) {
  184.                 if(navigator.getUserMedia) {
  185.                         navigator.getUserMedia({ audio: true},
  186.                                 function(stream) {
  187.                                         var rec = new SRecorder(stream);
  188.                                         callback(rec);
  189.                                 },function() {
  190.                                         alert("");
  191.                                 })
  192.                 }
  193.         }
  194. }

  195. function receive(e) {
  196.         audio.src = window.URL.createObjectURL(e);
  197. }
复制代码

你可能感兴趣的:(webRTC 语音调试代码(WwW.H5.Ltd))