Android setDataSourceFD失败:在三星手机上播放aac文件时状态=0x8000000

Android setDataSourceFD失败:在三星手机上播放aac文件时状态=0x8000000,android,android-mediaplayer,mediarecorder,aac,Android,Android Mediaplayer,Mediarecorder,Aac,我需要录制和播放音频文件,我使用以下两段代码: 用于录制: private void initRecorder() { try { mRecorder = new MediaRecorder(); mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); mRecorder.setOutputFormat(MediaRecorder.OutputFormat.AAC_ADTS);

我需要录制和播放音频文件,我使用以下两段代码:

用于录制:

private void initRecorder() {
    try {
        mRecorder = new MediaRecorder();
        mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        mRecorder.setOutputFormat(MediaRecorder.OutputFormat.AAC_ADTS);
        mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
        mRecorder.setOutputFile(RECORD_FILE_NAME);
        mRecorder.prepare();
        mRecorder.start();
    } catch (IllegalStateException | IOException e) {
        Utility.e("initRecorder: " + e.getMessage());
    }
}
    try {
        FileDescriptor fd = null;
        FileInputStream fis = new FileInputStream(RECORD_FILE_NAME);
        fd = fis.getFD();

        if (fd != null) {
            mMediaPlayer = new MediaPlayer();
            mMediaPlayer.setDataSource(fd);
            mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
            mMediaPlayer.prepare();

            mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mp) {
                    if (mPlayTime > 0) {
                        mMediaPlayer.seekTo(mPlayTime);
                    }
                    mMediaPlayer.start();
                    setStatus(STATUS_PLAYING);
                }
            });

            mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                @Override
                public void onCompletion(MediaPlayer mp) {
                    mMediaPlayer.release();
                    RecordMomentActivity.this.mPlayTime = 0;
                    setStatus(STATUS_NOT_PLAYING);
                }
            });
        }
    } catch (Exception e) {
        Utility.e("Exception: " + e.getMessage());
        setStatus(STATUS_NOT_PLAYING);
    }
}
用于播放:

private void initRecorder() {
    try {
        mRecorder = new MediaRecorder();
        mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        mRecorder.setOutputFormat(MediaRecorder.OutputFormat.AAC_ADTS);
        mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
        mRecorder.setOutputFile(RECORD_FILE_NAME);
        mRecorder.prepare();
        mRecorder.start();
    } catch (IllegalStateException | IOException e) {
        Utility.e("initRecorder: " + e.getMessage());
    }
}
    try {
        FileDescriptor fd = null;
        FileInputStream fis = new FileInputStream(RECORD_FILE_NAME);
        fd = fis.getFD();

        if (fd != null) {
            mMediaPlayer = new MediaPlayer();
            mMediaPlayer.setDataSource(fd);
            mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
            mMediaPlayer.prepare();

            mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mp) {
                    if (mPlayTime > 0) {
                        mMediaPlayer.seekTo(mPlayTime);
                    }
                    mMediaPlayer.start();
                    setStatus(STATUS_PLAYING);
                }
            });

            mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                @Override
                public void onCompletion(MediaPlayer mp) {
                    mMediaPlayer.release();
                    RecordMomentActivity.this.mPlayTime = 0;
                    setStatus(STATUS_NOT_PLAYING);
                }
            });
        }
    } catch (Exception e) {
        Utility.e("Exception: " + e.getMessage());
        setStatus(STATUS_NOT_PLAYING);
    }
}
这段代码非常有效,可以在Nexus5(安卓6.0)和LG G3(安卓5.0)上录制和播放音频。但当我使用三星手机时,我得到了一个例外:

setDataSourceFD失败:状态=0x8000000


有人遇到过这个问题吗?知道我该怎么处理吗?如果没有,我是否可以使用其他方法来录制和播放音频文件?

如果文件已损坏或处理该文件的MediaPlayer服务未正确处理该文件,则可能会发生这种情况

参见一些示例:


此外,可能是录制后文件未正确关闭,播放机出现故障。

尝试使用mpeg4 outputFormat

private void initRecorder() {
    try {
        mRecorder = new MediaRecorder();
        mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        mRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
        mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
        mRecorder.setOutputFile(RECORD_FILE_NAME);
        mRecorder.prepare();
        mRecorder.start();
    } catch (IllegalStateException | IOException e) {
        Utility.e("initRecorder: " + e.getMessage());
    }
}

正如我在问题中提到的,同样的功能也适用于Android 6.0的Nexus5。因此,这不是损坏文件的情况。但三星的设备存在某种问题。同时,将此文件放在其他设备上播放。考虑到一些设备在使用API时比其他设备对小错误更具“弹性”,这在媒体API上是非常正确的。这就是我的观点。由于这种情况,MediaPlayer服务很容易失败。您是否在完成录制后、打开媒体录制器进行播放之前停止并释放媒体录制器?你能分享这个代码吗?