上节课我们着重介绍了Android中的音频的处理,通过学习,我们已经熟悉并掌握了多媒体开发的几个操作,大致可以分为:a
- 播放和采集
- 编解码处理
- 算法处理,实现特殊功能
- 标准协议以及播放器工具类的开发
本节课我们来看一下Android的视频的相关操作。Android提供了常见的视频的编码、解码机制。使用Android自带的MediaPlayer、MediaController等类可以很方便的实现视频播放的功能。支持的视频格式有MP4和3GP等。这些多媒体数据可以来自于Android应用的资源文件,也可以来自于外部存储器上的文件,甚至可以是来自于网络上的文件流。
一、视频的播放
1.1 MediaController + VideoView
这种方式是最简单的实现方式。其中两个核心的API是:
- VideoView:继承了SurfaceView同时实现了MediaPlayerControl接口。
- MediaController:Android封装的辅助控制器,带有暂停,播放,停止,进度条等控件。
通过VideoView+MediaController可以很轻松的实现视频播放、停止、快进、快退等功能。
a、什么是SurfaceView
在之前的课程中,我们接触到的所有的UI控件或者布局都是View的子类,常用的View有布局组件 ConstraintLayout、RelativeLayout 与基本的显示组件ImageView、TextView 等。我们再来回顾下Android的视图渲染机制:View是通过刷新来重绘视图,系统通过发信号来进行屏幕的重绘,刷新的时间间隔是16ms,如果我们可以在16ms以内将绘制工作完成,则没有任何问题,如果我们绘制过程逻辑很复杂,并且我们的界面更新还非常频繁,这时候就会造成界面的卡顿。
在一些要求高效率的视图更新和绘制的场景中,该如何保证视图的流畅效果呢?Android为开发者提供了SurfaceView。我们可以对SurafceView和View做一个简单的对比说明:
- 1、View适用于主动更新的情况,而SurfaceView则适用于被动更新的情况,比如频繁刷新界面。
- 2、 View在主线程中对页面进行刷新,而SurfaceView则开启一个子线程来对页面进行刷新。
- 3、View在绘图时没有实现双缓冲机制,SurfaceView在底层机制中就实现了双缓冲机制。
要想使用SurfaceView需要经过创建、初始化、使用三个步骤。
Surface用来处理由屏幕合成器管理的原始缓冲区。Surface通常由图像缓冲区的使用者(例如SurfaceTexture、MediaRecorder 或 Allocation)创建或由其创建,并交给某种类型的生产者(例如OpenGL、MediaPlayer 或 CameraDevice)进行绘制。
结论:Android 平台上,无论开发者使用什么渲染 API,一切内容都会渲染到 Surface。Surface 表示缓冲队列中的生产方,在 Android 平台上创建的每个窗口都由 Surface 提供支持。SurfaceView 是对 Surface 的包装,用来向