这里为了节约性能:
如果视频分辨率低于SurfaceView分辨率,则降低解码分辨率到视频分辨率;
如果视频分辨率高于SurfaceView分辨率,则降低解码分辨率到SurfaceView分辨率。
在屏幕熄灭或者挂入后台的情况下,是没必要让MediaCodec继续解码的,因此,参考其他SDK,我们可以让它共享Activity的生命周期,以此来达到省电的效果:
public void onDestroy() {
if (mediaCodec != null) {
//释放内存
mediaCodec.release();
}
}
public void onPause() {
//通过这个boolean变量来决定要不要处理后台发来的数据流
isTaskInForeground = false;
stop();
}
public void stop() {
if (mediaCodec != null) {
//这里catch掉IllegalStateException,以防在未被start前调用
try {
//停止解码,此时可以调用configure()方法
mediaCodec.stop();
}catch (IllegalStateException e){
e.printStackTrace();
}
}
}
public void onResume() {
isTaskInForeground = true;
if (mediaCodec != null) {
configureDecoder(tempMediaFormat, tempSurface);
}
}
public void configureDecoder(MediaFormat mediaFormat, Surface surface) {
if (mediaCodec != null) {
tempSurface = surface;
//在SurfaceView加载完成前,调用以下方法会报错,此处TryCatch用以应付在OnCreate中执行初始化导致的崩溃
try {
mediaCodec.stop();
tempMediaFormat = mediaFormat;
mediaCodec.configure(mediaFormat, surface, null, 0);
mediaCodec.start();
//此方法必须在configure和start之后执行才有效
// mediaCodec.setVideoScalingMode(MediaCodec.VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
}
}
}
最后,如果觉得有帮助的话,就给博主发个红包吧~
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/bofangqi/article-114728-3.html
我是信了
当老师的说的都是美好的