在项目中使用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 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;