2014-04-19 4 views
1

나는 지난 몇 시간 동안이 코드 조각을 작동 시키려고 노력해 왔습니다. AudioTrack 예제가 최소한으로 작동한다는 것을 의미합니다. 많은 예제가 복잡하지 않다는 것을 알았 기 때문에입니다. Android : Audiotrack이 사인파를 재생하면 윙윙 거리는 소리가납니다.

private void playSound() { 
    // AudioTrack definition 
    int mBufferSize = AudioTrack.getMinBufferSize(44100, 
         AudioFormat.CHANNEL_OUT_MONO,  
         AudioFormat.ENCODING_PCM_8BIT); 

    mAudioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, 44100, 
         AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_8BIT, 
         mBufferSize, AudioTrack.MODE_STREAM); 

    // Sine wave 
    double[] mSound = new double[4410]; 
    short[] mBuffer = new short[4410]; 
    for (int i = 0; i < mSound.length; i++) { 
     mSound[i] = Math.sin((2.0*Math.PI * 440.0/44100.0*(double)i)); 
     mBuffer[i] = (short) (mSound[i]*Short.MAX_VALUE); 
    } 

    mAudioTrack.setStereoVolume(0.1f, 0.1f); 
    mAudioTrack.play(); 

    mAudioTrack.write(mBuffer, 0, mSound.length); 
    mAudioTrack.stop(); 
    mAudioTrack.release(); 

} 

나는 기능 playSound()를 호출

, 나는 단지 모든 순수 사인파 같은 소리하지 않는 짧은 버즈를 얻을. 8000Hz에서 44100Hz에 이르는 다양한 샘플링 속도와 다른 버퍼 크기를 시도했습니다.

mBuffer의 내용을 내보내는 경우 사인파가 올바르게 생성되었음을 알 수 있습니다. 그것은 비록 피치가 너무 높지만 Matlab으로 재생하면 정확하게 재생됩니다.

내가 올바르게하지 못하는 것이 있습니까? 또한 16 비트 인코딩을 시도하면 전혀 소리가 들리지 않습니다.

+0

안녕하세요 loadstar, 나는 반대 기능을하고 싶습니다, 오디오를 녹음하고 동시에 그 사인파, 어떤 도움 음모를 꾸미고 싶습니까 ?? – Neji

답변

1

ENCODING_PCM_8BIT 대신에 ENCODING_PCM_16BIT에 충실하십시오 (문서에 명시된 바와 같이, 장치가 지원할 수있는 것은 아닙니다).

왼쪽 및 오른쪽 채널에서 볼륨을 최대 (1.0f 또는 getMaxVolume())로 조정하십시오 (실제로는 진폭이 낮음).

버퍼를 4410 (재생 중 100ms 만)에서 2 * 44100 (재생 2 초를 나타냄)으로 늘리십시오.

관련 문제