2011-08-31 82 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

感謝您的幫助! –