2015-01-27 4 views
0

클라이언트 자바 스크립트에 마이크 녹음을 작성하고 서버로 전송 한 다음 실크로 변환하려고합니다. 나는 오디오이 설정서버에 쓸 때 마이크의 절반 속도 AudioContext

var speaker = new Speaker({ 
    channels: 1, 
    bitDepth: 16,   
    sampleRate: 44000,  
    signed: true 
}); 

를 사용하여 스피커 모듈을 사용하여 서버에서 재생하지만이 실크로 변환됩니다 때 절반의 속도를 소리가 있습니다. 나는 그것을 작성하지 않은 C 클래스를 사용하여 실크로의 변환이 pcm 파일로 좋게 느려지므로 느려지 게한다고 생각한다. 은 C 파일 내가 Int16array으로 서버에 코드를 작성하는 BinaryJS을 사용하고

#define FRAME_LENGTH_MS 20 
#define SAMPLE_RATE_KHZ 16 
#define SILK_BITRATE 14000 
#define FRAME_SAMPLES (FRAME_LENGTH_MS * SAMPLE_RATE_KHZ) 

이러한 설정이 있습니다.

여기 코드를 복사 하겠지만이 튜토리얼에서 거의 그대로 복사했습니다.

http://blog.groupbuddies.com/posts/39-tutorial-html-audio-capture-streaming-to-node-js-no-browser-extensions

또한 내가 실크 코덱에있는 경우 정확히 비트 레이트, samplerate 어떻게 samplerate를 다운 샘플링하는 방법의 측면에서 audioContext에서 점점 메신저 무엇인지 알고 싶어요.

EDIT : I 않았다

을 (다소)상의 수정하여 절반 속도 해결 onaudioprocess 전 절반 샘플을 제거하여 INT16에 float32 변환 곳.

l = buffer.length; 
     point = Math.floor(l/2); 
     buf = new Int16Array(Math.floor(l/2)); 
     for (var x = l; x > 0;) { 
      var average = (buffer[x] + buffer[x-1])/2; 
      buf[point] = Math.min(1, average)*0xFFFF; 
      point -= 1; 
      x -= 2; 
     } 

     return buf.buffer; 

그러나 오디오 피치는 여전히 절반입니다.

+0

은 내가 – dandavis

+0

내가 숫자가 일치 할 필요가 동의 ... 당신의 숫자가 양쪽에 일치, 그래서 어쨌든 대역폭을 절약 할 수 보내기 전에 클라이언트에 낮은해야한다고 생각하지만, 난 당신을 믿지 않는다 audioContext를 사용하여 클라이언트 측에서 샘플 속도를 제어 할 수 있습니다. 나는 스스로 그것을 다운 샘플링 할 수 있을지도 모르지만 나는 그 기술을 소유하고 있는지 모른다. – Neablis

답변

0

나는이 문제의 나머지 부분에 답할 수있는 몇 가지 다른 질문을 가지고 있지만, AudioContext 객체가 다운 샘플링 알고리즘을 사용하여 동적으로 조정 한 샘플링 속도에 대한 정보를 반환하는지 궁금한 사람들에게 모든 브라우저 샘플링 속도.

navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia;

 var session = { 
      audio: true 
     }; 

     navigator.getUserMedia(session, function(stream){ 
      audioContext = window.AudioContext; 
      context = new audioContext(); 
      sampleRate = context.sampleRate; 
      // Pass sample rate to downsample function with my arraybuffer 
     },function(e){ 
      // error 
     }); 
관련 문제