4

私は低データレートのVoIPのようなプロジェクトを開発しています。低データレートでオーディオをキャプチャし、それを内部バッファまたはFIFO(ファイルではなく)に保存する必要があります。

低データレートの.AMRエンコーダーを使用したいのですが、これはAudioRecordが出力されていることを意味します。MediaRecorderは、ファイルに書き込んでいるように見えることを除けば、私が望んでいることを正確に実行しているように見えます。

MediaRecorderはFileDescriptorを受け取ります...FileDescriptorインターフェイスを実装するクラスを作成する方法はありますか...バイトの同期として機能します...しかし、ファイルに送信する代わりに、それらはバッファーに格納されますか?FileDescriptorのドキュメントには、アプリケーションが独自に作成するべきではないと具体的に記載されていますが、なぜ作成しないのでしょうか。

http://docs.oracle.com/javase/1.4.2/docs/api/java/io/FileDescriptor.html

つまり、独自のストリームを開発し、MediaRecorderをだましてデータを送信したいと思います。おそらく、同じAPK内でソケットの両端を開き、MediaRecorderに書き込み用のソケットを与えるというトリッキーなことをしていますか?ソケットをFIFOとして使用しますか?私はこれに少し慣れていないので、どんな助け/提案も大いに感謝します。

RX側に関連する質問があります。MediaPlayerにフィードするバッファ/FIFOが欲しいのですが。MediaPlayerをだまして、独自のストリームによって供給されるバッファーからデータを受け入れることはできますか?

4

1 に答える 1

4

今この質問に答えるのが少し遅いことはわかっています... ...しかし、それが解決策である場合.

Android MediaRecorderのメソッドsetOutputFile()は、 FileDescriptor をパラメーターとして受け入れます。必要に応じて、UNIXデータパイプを作成し、そのFDを次の方法で引数として渡すことができます...

mediaRecorder.setOutputFile(getPipeFD());

FileDescriptor getPipeFD()
{
    final String FUNCTION = "getPipeFD";
    FileDescriptor outputPipe = null;

    try
    {
        ParcelFileDescriptor[] pipe = ParcelFileDescriptor.createPipe();
        outputPipe = pipe[1].getFileDescriptor();
    }
    catch(Exception e)
    {
        Log.e(TAG, FUNCTION + " : " + e.getMessage());
    }

    return outputPipe;
}

ParcelFileDescriptor.createPipe()Unix データ パイプを作成し、ParcelFileDescriptors の配列を返します。最初のオブジェクトはパイプの読み取りチャネル (ソース チャネル) を参照し、2 番目のオブジェクトはパイプの書き込みチャネル (シンク チャネル) を参照します。オブジェクトを使用MediaRecorderして、記録されたデータを書き込みチャネルに書き込みます...

MediaPlayer に関する限り、作成されたパイプの読み取りチャネルに関連する FileDescriptor オブジェクトをsetDataSource()メソッドに渡すことで、同じ手法を使用できます...

于 2013-03-05T12:57:51.243 に答える