【问题标题】:setDataSourceFD failed.: status=0x80000000 on playing aac file on Samsung phonessetDataSourceFD failed.: status=0x80000000 在三星手机上播放 aac 文件
【发布时间】:2015-10-22 15:37:22
【问题描述】:

我需要录制和播放一个音频文件,我使用这两条代码:

录制:

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

这段代码运行良好,可以在 Nexus 5 (Android 6.0) 和 LG G3 上使用 Android 5.0 录制和播放音频。但是当我使用三星手机时,我得到了例外:

setDataSourceFD 失败。:status=0x80000000

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

【问题讨论】:

    标签: android android-mediaplayer mediarecorder aac


    【解决方案1】:

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

    看一些例子:

    MediaPlayer.setDataSource causes IOException for valid file

    Exception when calling setDataSource(FileDescriptor) method (failed.: status=0x80000000)

    另外,可能是录制后文件没有正确关闭,播放器失败。

    【讨论】:

    • 就像我在问题中提到的那样,相同的功能适用于装有 Android 6.0 的 Nexus 5。所以这不是文件损坏的情况。但是三星设备存在某种问题。
    • 以及获取此文件并在其他设备上播放。
    • 考虑到某些设备在使用 API 时比其他设备更能“适应”小错误,媒体 API 尤其如此。那是我的观点。 MediaPlayer 服务很容易因为这种事情而失败。您是否在完成录制后以及在打开它进行播放之前停止并释放媒体录制器?你能分享这段代码吗?
    【解决方案2】:

    尝试使用 mpeg4 输出格式

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-08
      • 1970-01-01
      • 2017-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多