MediaRecorder записывает плохой аудиофайл на Droid X2

Я пытаюсь записать звук с помощью MediaRecorder на Droid X2, и у меня возникают проблемы. MediaRecorder, кажется, отлично подготавливается и начинает запись, но когда я останавливаю запись и пытаюсь прослушать созданный файл, воспроизведение немедленно останавливается. Даже если я пытаюсь открыть аудиофайл в стандартном приложении медиаплеера, он сразу останавливается.

Вот код, который я использую для записи:

mCurrentRecordingFilePath = mContext.getExternalFilesDir(null).getAbsolutePath() + File.separator + fileName;

mRecorder = new MediaRecorder();
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
mRecorder.setOutputFile(mCurrentRecordingFilePath);
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
// mRecorder.setAudioEncodingBitRate(16);
// mRecorder.setAudioSamplingRate(44100);

try {
    mRecorder.prepare();
    mIsPrepared = true;
} catch (IOException e) {
    Log.e("Test", "MediaRecorder prepare() failed");
    e.printStackTrace();
}
if (mRecorder != null && mIsPrepared) {
    mRecorder.start();
    mIsRecording = true;
    Log.i("Test", "Started audio capture: " + mCurrentRecordingFilePath);
}

Я закомментировал вызов setAudioEncodingBitRate(), потому что он приводил к сбою prepare(), и на всякий случай я также закомментировал setAudioSamplingRate(). Я перепробовал все доступные комбинации выходного формата и аудиокодировщика, и результат всегда один и тот же. Я не получаю исключений, и создается непустой файл, но он не воспроизводится должным образом.

Не уверен, что это поможет диагностике, но вот код, который я использую для остановки записи:

if (mRecorder != null && mIsRecording) {
    mRecorder.stop();
    mRecorder.release();
    mRecorder = null;
    mIsPrepared = false;
    mIsRecording = false;
    Log.i("Test", "Stopped audio capture");
}

Код записи отлично работает на Galaxy Nexus, Nexus S, EVO 4G и Galaxy SII. Есть идеи, почему мой аудиофайл будет плохим на Droid X2?


person BigFwoosh    schedule 14.08.2012    source источник
comment
Что если указать OutputFormat.THREE_GPP, AudioEncoder.AMR_NB, один канал, 8000 Гц? Это все еще не удается? Можете ли вы воспроизвести полученный файл (записанный Droid X2) на любом из других упомянутых вами телефонов?   -  person Michael    schedule 14.08.2012
comment
Я смог воспроизвести файл на своем Mac, используя OutputFormat.THREE_GPP и AudioEncoder.AMR_NB. Я также обнаружил, что могу воспроизвести файл на X2, если укажу путь к корню SD-карты, а не к каталогу внешних файлов. Я действительно хочу избегать записи вне каталога файлов, поскольку я хочу, чтобы аудиофайлы удалялись при удалении приложения.   -  person BigFwoosh    schedule 14.08.2012
comment
Нашел ответ здесь: stackoverflow.com/questions/3773262/ Проблема была не в записи, а в том, как я устанавливал источник данных MediaPlayer. Хотя я понятия не имею, почему приложение стандартного медиаплеера не воспроизводит файл ... может быть, это связано с разрешением. Спасибо за помощь!   -  person BigFwoosh    schedule 14.08.2012


Ответы (1)


Нашел ответ здесь: MediaPlayer не может воспроизводить аудиофайлы из папки данных программы ?

Проблема была не в записи, а в том, как я устанавливал источник данных MediaPlayer. Хотя я понятия не имею, почему приложение стандартного медиаплеера не воспроизводит файл ... может быть, это связано с разрешением. Вот код, который я использовал для воспроизведения файла:

mPlayer = new MediaPlayer();
mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mPlayer.setDataSource(fileName);
mPlayer.prepare();
mPlayer.start();

Вот код, который будет работать, если файл хранится в каталоге внешних файлов:

mPlayer = new MediaPlayer();
mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mPlayer.setDataSource((new FileInputStream(fileName)).getFD());
mPlayer.prepare();
mPlayer.start();
person BigFwoosh    schedule 14.08.2012