2011-08-31 3 views
4

AmrInputStream을 사용하여 PCM-16에서 AMR로 변환하고 있습니다. AmrInputStream에 대한 자세한 내용은 여기를 참조하십시오. http://hi-android.info/src/android/media/AmrInputStream.java.htmlAmrInputStream을 사용하여 PCM-16을 AMR로 변환

JNI 및 항목 사용에 대해 이야기하는 동안 프로그래밍에 익숙하지 않습니다. JNI가 무엇인지 알지 못해서이 토론에 필요하지 않다고 생각합니다. . 위의 AmrInputStream도 SDK 나 NDK에서는 찾을 수 없지만 사용할 수있었습니다.

인터넷에서 스트림을 사용하는 방법을 검색했지만 예제를 찾지 못했습니다. 결국 나는 그것을 실험하여 모든 InputStream과 비슷하다는 것을 알게되었다. 여기에 코드

InputStream inStream; 
    inStream = new FileInputStream("abc.wav"); 
    AmrInputStream aStream = new AmrInputStream(inStream); 

    File file = new File("xyz.amr");   
    file.createNewFile(); 
    OutputStream out = new FileOutputStream(file); 

    byte[] x = new byte[1024]; 
    int len; 
    while ((len=aStream.read(x)) > 0) { 
     out.write(x,0,len); 
    } 

    out.close(); 

내가이를 테스트 한이 근무하고의 (편집 (! 앞에 # 추가 요구 재생을위한 출력 파일 AMR \ n 개의 태그를.)하세요 AMR 태그가 있어야합니다 # AMR \ n을).

제 질문은 8000Hz로 샘플링 된 PCM-16 파일에서만 작동하도록했습니다. 원래 PCM-16 파일에 사용 된 (더 높은) 주파수는 (언더 샘플링 된) 결과를 낳습니다. AmrInputStream.java 파일에 SAMPLES_PER_FRAME 변수가 있습니다.이 변수는 재생하려고 시도했지만 아무 것도 영향을 미치지 않습니다.

모든 조언이나 관련 토론을 환영합니다!

+0

더 높은 빈도로 wav를 amr로 안드로이드로 변환하는 해결책을 찾았습니까? –

+0

@lan 낮음 AmrInputStream을 사용하여 amr 16khz로 변환 할 수 있습니까? –

+0

amr 헤더는 어떻게 작성합니까? –

답변

3

SAMPLES_PER_FRAME은 amrencoder가 한 번에 (20 msec의 오디오에 매핑되는) 동작하는 데이터 블록입니다. (http://hi-android.info/src/android/media/AmrInputStream.java.html의 바닥에서) AMR 인코더 기능의 서명에서

private static native int GsmAmrEncoderNew(); 

private static native void GsmAmrEncoderInitialize(int gae); 

private static native int GsmAmrEncoderEncode(int gae, 
     byte[] pcm, int pcmOffset, byte[] amr, int amrOffset) throws IOException; 

private static native void GsmAmrEncoderCleanup(int gae); 

private static native void GsmAmrEncoderDelete(int gae); 

인코더에 samplerate를 전달하는 방법이있을 것 같지 않습니다. (GAE는 기본 핸들) 샘플 속도 이 api로 8k atleast에 하드 코드되었습니다.

+0

도움에 감사드립니다! –

관련 문제