gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 23:00:46 26 4
gpt4 key购买 nike

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

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

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

Here is my createPipe() variation of this project .从一般的MediaRecorder配置(如setOutputFormat())来看,和第一个一样,所以代码大概是正确的。

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

  recorder.setOutputFile(getStreamFd());

其中getStreamFd()使用createPipe(),产生一个后台线程从管道读取,并返回写入端供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.io 流到流复制例程,增强了刷新和同步输出文件的智能:

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

当我运行第二个应用程序时,我得到一个输出文件,通过十六进制编辑器的粗略检查,它看起来基本没问题。 IOW,它不像是一个零字节文件,或者充满了无法识别的乱码。它充满了与第一个应用程序的输出类似的乱码。但是,Android 和 VLC 都无法播放。

如果我不得不猜测,我会假设我在从管道读取时搞砸了一些东西,但我不确定我到底哪里出错了。

有什么建议吗?

提前致谢!

最佳答案

我猜这与我对您其他问题的回答有关。 Anyone Have MediaPlayer Working with ParcelFileDescriptor and createPipe()?

可能当 MediaRecorder 将寻求写入 Header 信息时,管道已关闭。

如果你使用:

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

记录工作正常,因为它没有标题信息,只有原始音频。

关于android - 任何人都有 MediaRecorder 使用 ParcelFileDescriptor 和 createPipe()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12894976/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com