我正在开发一个低数据速率 VoIP 类型的项目。我需要以低数据速率捕获音频并将其存储在内部缓冲区或 FIFO 中(而不是文件中)。
我想使用低数据速率 .AMR 编码器,这意味着 AudioRecord 已经过时了。 MediaRecorder 看起来完全符合我的要求,只是它似乎写入文件。
MediaRecorder 采用 FileDescriptor...有什么方法可以编写一个实现 FileDescriptor 接口的类...充当字节同步...但不是将它们发送到文件,而是将它们存储在缓冲区中? FileDescriptor 上的文档明确指出应用程序不应该编写自己的应用程序,但为什么不呢?无论如何都可能吗?
http://docs.oracle.com/javase/1.4.2/docs/api/java/io/FileDescriptor.html http://docs.oracle.com/javase/1.4.2/docs/api/java/io/FileDescriptor.html
简而言之,我想开发自己的流,并欺骗 MediaRecorder 向其发送数据。也许会做一些棘手的事情,在同一个 APK 中打开套接字的两端并为 MediaRecorder 提供要写入的套接字?使用套接字作为我的 FIFO?我对此有点陌生,因此非常感谢任何帮助/建议。
我有一个关于 RX 方面的相关问题。我想要一个为 MediaPlayer 提供数据的缓冲区/fifo。我可以欺骗 MediaPlayer 接受来自我自己的专有流提供的缓冲区的数据吗?
我知道现在回答这个问题有点晚了......
...但如果它有帮助的话,这就是解决方案。
Android 媒体记录器的方法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;
}
The ParcelFileDescriptor.createPipe()
创建一个 Unix 数据管道并返回 ParcelFileDescriptors 数组。第一个对象指管道的读通道(Source Channel),第二个对象指管道的写通道(Sink Channel)。使用MediaRecorder
对象将记录的数据写入写入通道...
就 MediaPlayer 而言,可以使用相同的技术,将与创建的管道的读取通道相关的 FileDescriptor 对象传递给setDataSource()
方法...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)