首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有谁让MediaRecorder使用ParcelFileDescriptor和createPipe()?

有谁让MediaRecorder使用ParcelFileDescriptor和createPipe()?
EN

Stack Overflow用户
提问于 2012-10-15 19:46:20
回答 1查看 6.4K关注 0票数 25

我正在尝试制作一个录制音频的示例,数据存储由应用程序处理,而不是MediaRecorder。使用案例包括在内部存储器上存储记录或对记录进行加密。

原则上,这应该可以在ParcelFileDescriptor上使用createPipe()创建的管道工作,但是我得到了格式错误的输出。

首先,使用MediaRecorder“自然”记录的here is a sample project,使用MediaRecorder直接写入外部存储上的输出文件。这个应用程序运行得很好,输出既可以通过Android设备播放,也可以通过我的Linux机器上的VLC播放。

Here is my createPipe() variation of this project。从一般MediaRecorder配置(例如,setOutputFormat())的角度来看,它与第一个相同,因此代码可能是正确的。

但是,我通过以下方式提供输出:

代码语言:javascript
复制
  recorder.setOutputFile(getStreamFd());

其中,getStreamFd()使用createPipe(),派生后台线程以从管道读取数据,并返回写入端以供MediaRecorder使用

代码语言:javascript
复制
  private FileDescriptor getStreamFd() {
    ParcelFileDescriptor[] pipe=null;

    try {
      pipe=ParcelFileDescriptor.createPipe();

      new TransferThread(new AutoCloseInputStream(pipe[0]),
                       new FileOutputStream(getOutputFile())).start();
    }
    catch (IOException e) {
      Log.e(getClass().getSimpleName(), "Exception opening pipe", e);
    }

    return(pipe[1].getFileDescriptor());
  }

TransferThread是一个经典的java.io流到流拷贝例程,并增加了smarts以刷新和同步输出文件:

代码语言:javascript
复制
  static class TransferThread extends Thread {
    InputStream in;
    FileOutputStream out;

    TransferThread(InputStream in, FileOutputStream out) {
      this.in=in;
      this.out=out;
    }

    @Override
    public void run() {
      byte[] buf=new byte[8192];
      int len;

      try {
        while ((len=in.read(buf)) > 0) {
          out.write(buf, 0, len);
        }

        in.close();

        out.flush();
        out.getFD().sync();
        out.close();
      }
      catch (IOException e) {
        Log.e(getClass().getSimpleName(),
              "Exception transferring file", e);
      }
    }
  }

当我运行第二个应用程序时,我得到了一个输出文件,通过十六进制编辑器进行粗略检查,它看起来基本正常。它不像是一个零字节的文件,也不是充满了无法辨认的废话。与第一个应用程序的输出一样,它充满了类似的胡言乱语。然而,Android和VLC都不能播放它。

如果让我猜测,我会假设我在从管道中读取数据时搞砸了什么,但我不确定我具体在哪里出错。

有什么建议吗?

提前感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-17 21:51:11

我猜这与我对你的另一个问题的回答有关。Anyone Have MediaPlayer Working with ParcelFileDescriptor and createPipe()?

可能当MediaRecorder试图写入报头信息时,管道就关闭了。

如果您使用:

代码语言:javascript
复制
recorder.setOutputFormat(MediaRecorder.OutputFormat.RAW_AMR);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

录制效果很好,因为它没有标题信息,只有原始音频。

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

https://stackoverflow.com/questions/12894976

复制
相关文章

相似问题

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