Android Mediaplayer error (1, -2147483648) Error (-38,0)解决方案(网络记载和本地加载两种情况)
2016-07-05 09:05
801 查看
</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的一些了解,希望能帮助大家!
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories