【问题标题】:Using MediaRecorder to write to a buffer or FIFO使用 MediaRecorder 写入缓冲区或 FIFO
【发布时间】:2013-01-05 01:40:54
【问题描述】:

我正在开发一种低数据速率的 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 方面有一个相关问题。我想要一个为 MediaPlayer 提供数据的缓冲区/fifo。我可以欺骗 MediaPlayer 接受来自我自己的专有流馈送的缓冲区的数据吗?

【问题讨论】:

    标签: android audio media-player mediarecorder android-mediarecorder


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-22
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多