我正在开发一个低数据率的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方面有一个相关的问题。我想要一个缓冲区/fifo,它为MediaPlayer提供信息。我可以欺骗MediaPlayer接受由我自己的专有流提供的缓冲区中的数据吗?
发布于 2013-03-05 12:57:51
我知道现在回答这个问题有点晚了....But,如果它有帮助的话,这里是解决方案。
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通道)。使用MediaRecorder对象将记录的数据写入写入通道.
就MediaPlayer而言,可以通过将与创建的管道的读取通道相关的FileDescriptor对象传递给setDataSource()方法来使用相同的技术.
https://stackoverflow.com/questions/14448166
复制相似问题