我正在使用MediaRecorder录制音频并将其保存为带有AAC音频的.mp4。除了使用Android 4.1的Nexus S之外,我尝试过的所有设备都能正常运行。在那些设备上,我在start()(我认为)上得到一个错误(1,-2147483648)或者它继续正常,但输出文件总是为空。我有必要的权限,因为该应用程序适用于其他设备。
mRecorder.reset();
mRecorder.setOnErrorListener(new MediaRecorder.OnErrorListener() {
@Override
public void onError(MediaRecorder mr, int what, int extra) {
Log.e("sagasg", what + " " + extra);
}
});
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
mRecorder.setAudioSamplingRate(SAMPLING_RATE);
mRecorder.setAudioEncodingBitRate(BIT_RATE);
mFileName = "unnamed-" + mTimeStarted.year + "-" + mTimeStarted.month + "-" + mTimeStarted.monthDay
+ "-" + mTimeStarted.hour + "-" + mTimeStarted.minute + "-" + mTimeStarted.second;
mRecorder.setOutputFile(mFilePath + mFileName + mExtension);
try {
mRecorder.prepare();
} catch (IOException e) {
Log.e(LOG_TAG, "prepare() failed");
}
mRecorder.start();
答案 0 :(得分:3)
我通过随机更改设置解决了这个问题。它在我删除时开始工作
mRecorder.setAudioSamplingRate(SAMPLING_RATE);
采样率
public static final int SAMPLING_RATE = 48000;
根据文档,AAC支持8-48 kHz,但由于某种原因,它不支持。现在我只需修复另一个只出现在Nexus S上的错误。现在我明白为什么开发人员更喜欢iOS。
编辑:现在它不会因为这个选项而崩溃,只是录制是一个空文件。尝试了其他值,如24000.相同的结果。我必须坚持使用默认的采样率。
答案 1 :(得分:2)
这些错误很难调试,但我认为这样做会有所帮助。
这是我建议你改变的一句话:
mRecorder.setOutputFile(mFilePath + mFileName + mExtension);
您应该使用FileInputStream
:
FileInputStream inputStream = new FileInputStream(mFilePath + mFileName + mExtension);
mRecorder.setDataSource(inputStream.getFD());
或者您也可以尝试FileOutputStream
:
FileOutputStream outputStream = new FileOutputStream(mFilePath + mFileName + mExtension);
mRecorder.setOutputFile(outputStream.getFD());
请注意,对于这些解决方案中的任何一个,您可能必须抓住IllegalArgumentException
,SecurityException
,IllegalStateException
和IOException
中的一个或多个。