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(); }
相关文章推荐
- 使用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