在项目中使用surfaceView 或者使用 mediaplayer + surface 来进行网络或者本地视频播放,经常会遇到  error (1, -2147483648) Error (-38,0)这样的错误,error value (1, -2147483648) , 1 代表着MediaPlayer.MEDIA_ERROR_UNKNOWN,-2147483648 在frameworks/native/include/utils/Errors.h中被定义成为UNKNOWN_ERROR。一般来说Error (-38,0) 是由于error (1, -2147483648)导致的,当meidiaplayer 是一个无效的对象时,这个时候mediaplayer 调用getDuration()之类的方法是就会出现Error(-38,0)错误。如下是我当时遇到的bug信息:

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 mediaplayer07-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在播放视频的时候支持的编码格式是十分有限,具体支持格式如下:

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

假如你的视频格式不是这里面的一种就会报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的一些了解,希望能帮助大家!

更多相关文章

  1. Android webView 获取、设置 cookie的方法
  2. Android常用控件的使用方法
  3. MPAndroidChart的一些问题解决方法
  4. 解决IE apk变成zip:Android 手机应用程序文件下载服务器 配置解决
  5. Android EditText TextWatcher 回调方法参数说明
  6. Android生成界面的两种方法:setContentView和inflate的区别
  7. Android 使用Canvas在图片上绘制文字的方法
  8. Android 编译错误总结及收集

随机推荐

  1. Android:Handler,内部类导致的可能内存泄露
  2. RK3399 编译recovery
  3. Expected receiver of type com.xx.xxxAc
  4. SWIG and Android
  5. 使用Bitmap遍历Assets目录下图片
  6. android 8.0 兼容问题
  7. Android利用universal-image-loader异步
  8. android 实时监听网络连接状态
  9. android 为ExpandableListView中child设
  10. 20-45万 Android(安卓)Engineer 安卓工程