Advertisement
Guest User

Untitled

a guest
Aug 27th, 2016
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.71 KB | None | 0 0
  1. var localMediaStream = null;
  2. var localScriptProcessor = null;
  3. audioData = []; // 録音データ
  4.  
  5. var onAudioProcess = function(e) {
  6. var input = e.inputBuffer.getChannelData(0);
  7. var bufferData = new Float32Array(bufferSize);
  8. for (var i = 0; i < bufferSize; i++) {
  9. bufferData[i] = input[i];
  10. }
  11.  
  12. audioData.push(bufferData);
  13. };
  14. var startRecording = function() {
  15. navigator.getUserMedia(
  16. { audio: true },
  17. function(stream) {
  18. localMediaStream = stream;
  19. var scriptProcessor = audioContext.createScriptProcessor(bufferSize, 1, 1);
  20. localScriptProcessor = scriptProcessor;
  21. var mediastreamsource = audioContext.createMediaStreamSource(stream);
  22. mediastreamsource.connect(scriptProcessor);
  23. scriptProcessor.onaudioprocess = onAudioProcess;
  24. scriptProcessor.connect(audioContext.destination);
  25. },
  26. function(e) {
  27. console.log(e);
  28. }
  29. );
  30. };
  31.  
  32. var exportWAV = function(audioData) {
  33.  
  34. var encodeWAV = function(samples, sampleRate) {
  35. var buffer = new ArrayBuffer(44 + samples.length * 2);
  36. var view = new DataView(buffer);
  37.  
  38. var writeString = function(view, offset, string) {
  39. for (var i = 0; i < string.length; i++){
  40. view.setUint8(offset + i, string.charCodeAt(i));
  41. }
  42. };
  43.  
  44. var floatTo16BitPCM = function(output, offset, input) {
  45. for (var i = 0; i < input.length; i++, offset += 2){
  46. var s = Math.max(-1, Math.min(1, input[i]));
  47. output.setInt16(offset, s < 0 ? s * 0x8000 : s * 0x7FFF, true);
  48. }
  49. };
  50.  
  51. writeString(view, 0, 'RIFF'); // RIFFヘッダ
  52. view.setUint32(4, 32 + samples.length * 2, true); // これ以降のファイルサイズ
  53. writeString(view, 8, 'WAVE'); // WAVEヘッダ
  54. writeString(view, 12, 'fmt '); // fmtチャンク
  55. view.setUint32(16, 16, true); // fmtチャンクのバイト数
  56. view.setUint16(20, 1, true); // フォーマットID
  57. view.setUint16(22, 1, true); // チャンネル数
  58. view.setUint32(24, sampleRate, true); // サンプリングレート
  59. view.setUint32(28, sampleRate * 2, true); // データ速度
  60. view.setUint16(32, 2, true); // ブロックサイズ
  61. view.setUint16(34, 16, true); // サンプルあたりのビット数
  62. writeString(view, 36, 'data'); // dataチャンク
  63. view.setUint32(40, samples.length * 2, true); // 波形データのバイト数
  64. floatTo16BitPCM(view, 44, samples); // 波形データ
  65.  
  66. return view;
  67. };
  68.  
  69. var mergeBuffers = function(audioData) {
  70. var sampleLength = 0;
  71. for (var i = 0; i < audioData.length; i++) {
  72. sampleLength += audioData[i].length;
  73. }
  74. var samples = new Float32Array(sampleLength);
  75. var sampleIdx = 0;
  76. for (var i = 0; i < audioData.length; i++) {
  77. for (var j = 0; j < audioData[i].length; j++) {
  78. samples[sampleIdx] = audioData[i][j];
  79. sampleIdx++;
  80. }
  81. }
  82. return samples;
  83. };
  84.  
  85. var dataview = encodeWAV(mergeBuffers(audioData), audioContext.sampleRate);
  86. var audioBlob = new Blob([dataview], { type: 'audio/wav' });
  87.  
  88. var myURL = window.URL || window.webkitURL;
  89. var url = myURL.createObjectURL(audioBlob);
  90. return url;
  91. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement