首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用MediaRecorder向缓冲区或FIFO写入

使用MediaRecorder向缓冲区或FIFO写入
EN

Stack Overflow用户
提问于 2013-01-21 22:11:22
回答 1查看 4.7K关注 0票数 3

我正在开发一个低数据率的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接受由我自己的专有流提供的缓冲区中的数据吗?

EN

回答 1

Stack Overflow用户

发布于 2013-03-05 12:57:51

我知道现在回答这个问题有点晚了....But,如果它有帮助的话,这里是解决方案。

Android MediaRecorder的方法setOutputFile()接受FileDescriptor作为参数。根据您的需要,可以创建一个unix数据管道,它的FD可以以下列方式作为参数传递。

代码语言:javascript
复制
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()方法来使用相同的技术.

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14448166

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档