4

AmrInputStreamを使用してPCM-16からAMRへの変換を行っています。AmrInputStreamの詳細については、http://hi-android.info/src/android/media/AmrInputStream.java.htmlを参照してください。

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変数がありますが、何にも影響を与えていないようです。

アドバイスや関連する議論は大歓迎です!

4

1 に答える 1

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 はネイティブハンドルです)。サンプルレートは、この API で少なくとも 8k にハードコーディングされています。

于 2011-08-31T09:17:09.673 に答える