任何人都有MediaRecorder使用ParcelFileDescriptor和createPipe()?

我正在试图制定一个录制audio的例子,数据存储由应用程序处理,而不是MediaRecorder 。 使用情况包括将logging存储在内部存储器上或encryptionlogging。

原则上,这应该使用由createPipe()ParcelFileDescriptor createPipe()创build的pipe道,但我得到格式不正确的输出。

首先, 这是一个使用MediaRecorder “自然”logging的示例项目 , MediaRecorder直接写入外部存储器上的输出文件。 这个应用程序工作得很好,输出可以通过Android设备logging它或VLC在我的Linux机器上播放。

这是我的这个项目的createPipe()变体 。 从一般MediaRecorderconfiguration(例如, setOutputFormat() )的angular度来看,它与第一个相同,所以代码大概是正确的。

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

  recorder.setOutputFile(getStreamFd()); 

其中getStreamFd()使用createPipe() ,产生后台线程从pipe道中读取,并返回供MediaRecorder使用的写入结束:

  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.iostream到stream复制例程,增加了智能来刷​​新和同步输出文件:

  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); } } } 

当我运行第二个应用程序,我得到一个输出文件,通过hex编辑器的粗略检查,似乎基本上确定。 IOW,它不像是一个零字节的文件,或者是无法辨认的乱码。 它充满了与第一个应用程序的输出类似的胡言乱语。 但是,Android和VLC都不能播放它。

如果我不得不猜测,我会假设我正在从pipe道中读取某些东西,但我不确定具体哪里出错。

有什么build议么?

提前致谢!

Solutions Collecting From Web of "任何人都有MediaRecorder使用ParcelFileDescriptor和createPipe()?"

我想这与我对你的其他问题的回答有关。 任何人有MediaPlayer使用ParcelFileDescriptor和createPipe()?

MediaRecorder可能试图写入Header信息时,pipe道closures。

如果你使用:

 recorder.setOutputFormat(MediaRecorder.OutputFormat.RAW_AMR); recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 

logging工作正常,因为它不会有头信息,只有原始audio。