2

我正在开发一种低数据速率的VoIP类项目。我需要以低数据速率捕捉音频并将其存储在内部缓冲区或FIFO(不在文件中)。使用MediaRecorder写入缓冲区或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方面有一个相关的问题。我想有一个缓冲区/ FIFO提供MediaPlayer。我可以欺骗MediaPlayer接受来自由我自己的专有流提供的缓冲区中的数据吗?

回答

3

我知道它现在有点迟,现在要回答这个问题... ...但如果这有助于解决方案。

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

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

+1

试过了。它不起作用。至少不适用于MediaRecorder。 – binW