2011-08-31 158 views
4

我正在使用AmrInputStream从PCM-16转换为AMR。 AmrInputStream的详细信息可以在这里找到http://hi-android.info/src/android/media/AmrInputStream.java.html使用AmrInputStream将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 )。

我的问题属于,我只能设法得到这个工作在8000赫兹采样的PCM-16文件。用于原始PCM-16文件的任何(更高)频率都会导致(欠采样)输出。 AmrInputStream.java文件中有一个SAMPLES_PER_FRAME变量,我尝试过,但它似乎没有影响任何东西。

欢迎任何建议或相关的讨论!

+0

你有没有找到任何解决方案将更高频率的wav转换为android中的amr? –

+0

@lan Low是否可以使用AmrInputStream转换为amr 16 khz? –

+0

你如何编写amr头文件? –

回答

3

SAMPLES_PER_FRAME是amrencoder一次性执行的数据块(映射到20毫秒的音频)。

从AMR编码器函数的签名(在 http://hi-android.info/src/android/media/AmrInputStream.java.html底部)

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); 

有似乎没有被传递采样率到编码器的一种方法。(GAE是本机句柄) 采样率是至少硬编码到8K这个api

+0

感谢您的帮助! –