0

我的任务是长时间录制音频并将三秒钟的文件发送到服务器以识别文本(我使用谷歌)。如果我直接写入文件,那么我需要重新初始化我的记录器以启动新文件,这需要大量时间来启动和停止 mediarecorder。这就是为什么我决定使用 ParcelFileDescriptor.createPipe() 这就是我创建和初始化我的记录器的方式:

ParcelFileDescriptor[] fdPair = new ParcelFileDescriptor[0];
fdPair = ParcelFileDescriptor.createPipe();


ParcelFileDescriptor readFD = fdPair[0];
ParcelFileDescriptor writeFD = fdPair[1];
mediaRecorder = new MediaRecorder();
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.AMR_NB);
mediaRecorder.setAudioSamplingRate(8000);
mediaRecorder.setOutputFile(writeFD.getFileDescriptor());
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

然后,我创建输入流来读取记录数据:

final ParcelFileDescriptor.AutoCloseInputStream reader = new ParcelFileDescriptor.AutoCloseInputStream(readFD);

从这个阅读器读取的数据我写入 FileOutputStream。

每 3 秒我创建一个新文件和新的 FileOutputStream,并将数据从以前的文件发送到服务器。

我正在根据 ARM 格式读取字节(文件头,而不是读取每个帧的头位,然后读取整个帧)。

在带有 android 2.3.3 的 Nexus One 上,它运行良好,但在 Galaxy S III、Galaxy Nexus 和 LG p990 上,它会写入设备播放器无法读取且谷歌无法识别的内容。谷歌识别器返回类似“ok ok”或“######”的东西(看起来文件包含某种噪音)。

有谁知道,为什么这对于不同的手机/平台不能以相同的方式工作?

谢谢,

PS 我不能使用 AudioRecord – 谷歌需要 AMR(或 speex,或 flac)

4

0 回答 0