您的位置:首页 > 移动开发 > Android开发

Android多媒体—视频技术

2015-10-28 22:14 459 查看

一、概述

视频的播放有两种方法:

VideoView 安卓封装好的,直接用

SurfaceView 这个比较灵活,是VideoView的父类,当中可以放视频,也可以放图片,最最重要的是,它可以在子线程中更新UI(还有一个是ProgressBar,Android中只有这两个控件比较刁)

继承关系如下:



二、SurfaceView

surfaceView是一个比较厉害的控件,可以在子线程里面更新UI ,并且它可以在单位时间大量渲染各种各样的画面。并且,其内部是双缓冲的机制:

线程0 : 显示界面 — 后台计算 —-显示UI

线程1 : 后台计算 —显示UI — 后台计算

但是,使用中一定要注意:SurfaceView容易产生空指针异常,放在Activity的onCreate()中。原因是 surfaceView这个 控件非常的消耗资源, 所以android并不是以上来就渲染这个控件,而是当界面可见的时候才去渲染这个控件, 如果当界面还不可见,就直接去拿surfaceView的画布,就会抛出空指针的异常。为了避免上面的问题,可以用SurfaceView的方法回调来解决这个问题

/*
* 这里用接口的回调,把surfaceview的加载写到了onCreate方法中,避免了在onCreate方法中空指针异常的发生
* */
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

SurfaceView sv =(SurfaceView) findViewById(R.id.sv);

//得到一个sharedpreferences

final SharedPreferences sp = getSharedPreferences("oppo", 0);

//1.得到控制器
SurfaceHolder holder = sv.getHolder();
//2.注册回调监听
holder.addCallback(new Callback() {

private MediaPlayer mediaPlayer;

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
int position = mediaPlayer.getCurrentPosition();
sp.edit().putInt("position", position).commit();

mediaPlayer.stop();
mediaPlayer.release();
}

@Override
public void surfaceCreated(SurfaceHolder holder) {
try {
mediaPlayer = new MediaPlayer();
//2.设置路径
mediaPlayer.setDataSource("/mnt/sdcard/oppo.3gp");
//3.准备
mediaPlayer.prepare();
//4.指定显示画面的surfaceview
mediaPlayer.setDisplay(holder);
//5.开始搞
mediaPlayer.seekTo(sp.getInt("position", 0));
mediaPlayer.start();
} catch (Exception e) {
e.printStackTrace();
}
}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {

}
});
}


三、VideoView

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//1.先拿到控件
VideoView vv = (VideoView) findViewById(R.id.vv);
//2.拿到控制器
MediaController controller = new MediaController(this);
//3.设置播放的数据源
vv.setVideoPath("/mnt/sdcard/oppo.3gp");

//4.互相绑定
vv.setMediaController(controller);
controller.setAnchorView(vv);
vv.start();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android 多媒体 视频