MediaPlayer error(-38, 0) 异常处理

1、参考资料

Media Player called in state 0, error (-38,0)
MediaPlayer的使用

2、业务背景

  • 对时长超过 5s 的音频提供裁剪、试听功能,裁剪、试听最大时长均为 5s。当音频长度在 5s ~ 6s 之间,试听暂停时,可能整个音频播放完成了,此时会回调 onCompletion 方法,试听封装类会在播放完成后调用 reset 方法。此时,再次点击播放试听,调用 start 方法时,播放无声音。
  • new MediaPlayer() 或者 任何状态调用了 reset 方法之后, 进入 Idle (闲置) 状态
private fun playPrepare(audioPath: String?) {
    audioPath ?: return
    MLog.d(TAG, "playAudio: audioPath = $audioPath")
    if (mediaPlayer == null) {
        mediaPlayer = ListenKit.instance
        mediaPlayer?.play(audioPath, startNow = false, listener = object : ListenKit.Listener {
            override fun onPrepared() {
                MLog.d(TAG, "playAudio: onPrepared currentCutStartTime = $currentCutStartTime")
            }

            override fun onCompletion() {
                MLog.d(TAG, "playAudio: onCompletion")
            }
        })
    }
}

private fun playAudio(audioPath: String?) {
    ...
    mediaPlayer?.start()
    ...
}

private fun stopAudioIfNeed() {
    MLog.d(TAG, "stopAudioIfNeed: isPlaying = $isPlaying")
    if (isPlaying) {
        ...
        mediaPlayer?.pause()
        ...
    }
}

3、解决方案

  • 在试听结束后添加 seekTo 代码,避免播放完成,即可避免在 reset 之后调用 start 导致播放异常
private fun stopAudioIfNeed() {
    MLog.d(TAG, "stopAudioIfNeed: isPlaying = $isPlaying")
    if (isPlaying) {
        ...
        mediaPlayer?.pause()
        // 针对时长在 5s~6s 之间的音频,若播放完成,会回调 onCompletion 方法,此时再调用 start,播放无声音,出现下面的信息:
        // Attempt to perform seekTo in wrong state: mPlayer=0x0, mCurrentState=1
        // error (-38, 0)
        mediaPlayer?.seekToPosition(0) // 注意!!!
        ...
    }
}

PlaybackCompleted 状态转移 : 如果设置了循环模式SetLooping(), 那么播放完毕之后会重新进入Started状态;若没设置循环,则调用 OnCompletion.onCompletion() 回调方法, MediaPlayer 会进入 PlaybackCompleted 状态;
也可以在该状态直接调用start()进入Started状态
image

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
mediaplayer-viral.zip 是一个文件压缩包,其中包含了一个名为 "mediaplayer-viral" 的媒体播放器应用程序。 这个应用程序可能是一个用于播放音乐和视频的多媒体播放器。通过解压mediaplayer-viral.zip文件,可以将应用程序文件提取出来,并安装到适当的设备上进行使用。 该应用程序可能具有一些特殊的功能,使其能够迅速在社交媒体平台上传播开来。这可能意味着其具有与社交媒体平台的集成,可以方便地分享当前播放的音乐或视频到用户的社交媒体账户上。它可能还具有一些社交化的功能,比如用户之间可以相互关注、分享播放列表等等。这些功能对于即时分享和互动非常有用,可以帮助应用程序在社交媒体上迅速传播。 除了社交媒体功能,mediaplayer-viral.zip 中提供的媒体播放器应用程序可能还具有标准的播放控制功能,比如暂停、播放、切换曲目或视频等。它可能还支持设置播放列表、创建个人收藏夹、调整音量和亮度等常见的媒体播放器功能。此外,还可能具有一些额外的特性,比如可自定义的界面、歌曲识别功能或双重音频输出等等。这些功能将提供更好的用户体验和更多个性化的选项。 总的来说,mediaplayer-viral.zip 是一个包含了一个名为 "mediaplayer-viral" 的媒体播放器应用程序的文件压缩包。这个应用程序具有社交媒体集成和一系列常见的媒体播放器功能,旨在提供良好的用户体验和便捷的分享功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值