Android Mediaplayer error (1, -2147483648) Error (-38,0)解决方案(网络记载和本地加载两种情况)

</pre>在项目中使用surfaceView 或者使用 mediaplayer + surface 来进行网络或者本地视频播放,经常会遇到  error (1, -2147483648) Error (-38,0)这样的错误,error value (1, -2147483648) , 1 代表着<a target=_blank target="_blank" href="https://developer.android.com/reference/android/media/MediaPlayer.html#MEDIA_ERROR_UNKNOWN">MediaPlayer.MEDIA_ERROR_UNKNOWN</a>,-2147483648 在frameworks/native/include/utils/Errors.h中被定义成为UNKNOWN_ERROR。一般来说Error (-38,0) 是由于error (1, -2147483648)导致的,当meidiaplayer 是一个无效的对象时,这个时候mediaplayer 调用getDuration()之类的方法是就会出现Error(-38,0)错误。如下是我当时遇到的bug信息:<p></p><p></p><pre name="code" class="java">07-03 08:08:18.421  12853-13275/com.suomistudent E/MediaPlayer﹕ error (1, -2147483648)
07-03 08:08:18.451  12853-12853/com.suomistudent E/MediaPlayer﹕ Attempt to call getDuration without a valid mediaplayer
07-03 08:08:18.451  12853-12853/com.suomistudent E/MediaPlayer﹕ error (-38, 0)
07-03 08:08:18.461  12853-12853/com.suomistudent E/MediaPlayer﹕ Error (1,-2147483648)

那么如何解决这个问题:

1.网络加载出现error (1, -2147483648) 也就是mediaplayer 初始化失败 出现这个情况一般应考虑一下几点:

首先需要确保文件路径,如目录,或者是URL及URI正确的。

1.1在初始化MediaPlayer时,通过create方法设置数据源。则不能写MediaPlayer.prepare()方法,这是会报错。查看Mediaplayer.create()的源代码如下:

public static MediaPlayer create(Context context, int resid,
        AudioAttributes audioAttributes, int audioSessionId) {
    try {
        AssetFileDescriptor afd = context.getResources().openRawResourceFd(resid);
        if (afd == null) return null;

        MediaPlayer mp = new MediaPlayer();

        final AudioAttributes aa = audioAttributes != null ? audioAttributes :
            new AudioAttributes.Builder().build();
        mp.setAudioAttributes(aa);
        mp.setAudioSessionId(audioSessionId);

        mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
        afd.close();
        mp.prepare();
        return mp;
    } catch (IOException ex) {
        Log.d(TAG, "create failed:", ex);
        // fall through
    } catch (IllegalArgumentException ex) {
        Log.d(TAG, "create failed:", ex);
       // fall through
    } catch (SecurityException ex) {
        Log.d(TAG, "create failed:", ex);
        // fall through
    }
    return null;
}
create()方法里面其实已经包括创建对象 设置资源 prepare()操作。

1.2.如果是使用MediaPlayer构造函数初始化MediaPlayer,然后通过setDataSource方法设置数据源时,就需要在start()之前,使用MediaPlayer.prepare()方法,对数据源进行一次编译。能够避免出现(-38,0)这种错误。

1.3.考虑编码问题,android自带的mediaplayer在播放视频的时候支持的编码格式是十分有限,具体支持格式如下:


假如你的视频格式不是这里面的一种就会报error (1, -2147483648),这种错误,这个时候你需要考虑将视频转换成为支持的格式才行。在这里我只是粘贴了视频的编码格式,如需查看音频编码请查看https://developer.android.com/guide/appendix/media-formats.html(ps:我使用的是 格式工厂  查看的详细信息)

1.4.在退出Activity的时候一定要先将Mediaplayer 对象释放掉然后再关闭activity。需要执行如下代码:

mMediaPlayer.reset();
mMediaPlayer.release();
mMediaPlayer = null;

假如你不先释放掉mediaplayer的话就将activity关闭,mediaplyer是不会释放掉的,这时候如果你反复的创建mMediaplayer 同样也会出现(1, -2147483648),这种情况,所以务必先释放Mediaplyer. 这是我在做项目中发现的一个bug,起初我也是以为是视频格式编码上出现了错误,所以就仔仔细细的看了一下视频的编码格式,但是发现并没有问题。最后排除了很多种情况才发现自己在activity关闭之前没有释放掉mediaplayer。


2.假如是本地加载视频:

除了考虑上面那四种情况同时也需要考虑视频的权限问题,毕竟是本地加载视频,有可能某个目录先你没有读写权限之类的东西
ps:可能还需要“"chmod 777 ”修复一下权限。

以上就是目前我对mediaplyer的一些了解,希望能帮助大家!


  • 10
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值