我正在开发一种低数据速率VoIP项目。我需要以低数据速率捕获音频并将其存储在内部缓冲区或FIFO(不在文件中)中。

我想使用低数据速率的.AMR编码器,这意味着AudioRecord已用完。 MediaRecorder看起来确实可以满足我的要求,只是它似乎可以写入文件。

MediaRecorder使用FileDescriptor ...有什么方法可以编写实现FileDescriptor接口(interface)的类...充当字节的同步...但不是将它们发送到文件中,而是将它们存储在缓冲区中? FileDescriptor上的文档特别指出,Applications不应该编写自己的应用程序,但是为什么不编写自己的应用程序呢?

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

简而言之,我想开发自己的流,并欺骗MediaRecorder向其发送数据。也许在同一APK中打开套接字的两端并向套接字写入MediaRecorder做一些棘手的事情?使用套接字作为我的FIFO?我对此有些陌生,因此非常感谢您的帮助/建议。

我在RX端有一个相关的问题。我希望有一个可以为MediaPlayer供电的缓冲区/ FIFO。我可以欺骗MediaPlayer接受我自己的专有流提供的缓冲区中的数据吗?

最佳答案

我现在回答这个问题有点晚了...
...但是,如果有帮助,这就是解决方案。

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数组。第一个对象引用管道的读取通道(源通道),第二个对象引用管道的写入通道(接收器通道)。使用MediaRecorder对象将记录的数据写入写通道...

就MediaPlayer而言,可以通过将与创建的管道的读取通道相关的FileDescriptor对象传递给setDataSource()方法来使用相同的技术...

08-06 09:50