前面介绍了使用VideoView播放视频的方法,使用VideoView播放视频方法简单、方便,这个类其实也是继承了SurfaceView类,并且实现了MediaController。
在VideoView上有一个用于对媒体播放进行控制的面板,即MediaPlayer,其中包括快进、快退、播放、暂停按钮以及一个进度条。MediaPlayer具有如下:
优点:比较简单,可以直接进行使用;
缺点:灵活性不高;
第二种方式是使用MediaPlayer和SurfaceView来播放视频,通过MediaPlayer来控制视频的播放、暂停、进度等。但是MediaPlayer主要用于播放音频,没有提供输出图像的输出界面,这时就要用到SurfaceView控件,将它与MediaPlayer结合起来,就能实现视频的输出。
通过SurfaceView显示视频内容的特点如下。
优点:灵活性高,可以进行自定义。
缺点:难度比较大。
MediaPlayer类是Android的SDK中实现多媒体支持的非常重要的一部分,内嵌了支持的格式。MediaPlayer类包含了7种设定数据源的方法,具体如下。
(1)void setDataSource(Stringpath):设定使用的数据源(文件路径或http/rtsp地址)。
(2)void setDataSource(FileDescriptorfd,longoffset,longlength):设定使用的数据源(filedescriptor)。
(3)void setDataSource(FileDescriptorfd):设定使用的数据源(filedescriptor)。
(4)void setDataSource(Context context,Uriuri):设定一个如URI内容的数据源。
(5)static MediaPlayercreate(Context context,Uriuri):根据给定的URI方便地创建Me-diaPlayer对象的方法。
(6)static MediaPlayercreate(Context context,intresid):根据给定的资源id方便地创建MediaPlayer对象的方法。
(7)static MediaPlayercreate(Context context,Uri uri,SurfaceHolder holder):根据给定的URI方便地创建MediaPlayer对象的方法。
SurfaceView类的主要方法如表8-1所示。
表8-1 SurfaceView类主要方法
SurfaceView是视图类View的子类,其中内嵌了一个专门用于绘制的Surface,Surface-View可以控制这个Surface的格式和尺寸,以及Surface的绘制位置。可以这样理解,Surface就是管理数据的地方,SurfaceView就是展示数据的地方。
SurfaceHolder是一个接口,类似于一个Surface的监听器。通过三个回调方法监听Sur-face的创建、销毁或者改变。
使用MediaPlayer+SurfaceView播放视频的步骤如下。
(1)创建MediaPlayer对象,并设置加载的视频文件。(www.xing528.com)
(2)在界面布局文件中定义SurfaceView控件。
(3)通过MediaPlayer.setDisplay(SurfaceHoldersh)指定视频画面输出到SurfaceView之上,SurfaceHolder可以通过Surfaceview的getHolder()方法获得。
(4)将MediaPlayer的其他一些方法用于播放视频。例如,调用MediaPlayer.prepare()进行准备,调用MediaPlayer.start()播放视频。
视频播放时,先确定视频的格式,这和解码相关,不同的格式视频编码不同,通过编码格式进行解码,最后得到一帧一帧的图像,并把这些图像快速显示在界面上,即为播放一段视频。SurfaceView在Android中正是完成这个功能的。SurfaceView是配合MediaPlayer使用的,MediaPlayer提供了相应的方法设置SurfaceView显示图片,只需要为MediaPlayer指定SurfaceView显示图像即可。它的完整签名为voidsetDisplay(SurfaceHoldersh)。它需要传递一个SurfaceHolder对象,SurfaceHolder可以理解为SurfaceView装载需要显示的一帧帧图像的容器,它可以通过SurfaceHolder.getHolder()方法获得。使用MediaPlayer配合SurfaceView播放视频的步骤与使用MediaPlayer播放MP3大体一致,只需要额外设置显示的SurfaceView即可。
准备完成SurfaceHolder后需要给SurfaceHolder设置一个Callback,调用addCallback()方法。Callback有如下三个回调函数。
surfaceCreated()会在SurfaceHolder被创建的时候回调,在这里可以进行一些初始化的操作,surfaceDestroyed()会在SurfaceHolder被销毁的时候回调,在这里可以进行一些释放资源的操作,防止内存泄漏。
一般会在surfaceCreated中为MediaPlayer设置surfaceHolder,例如:
下面是MediaPlayer+SurfaceView播放视频的实例。在Android2.3中创建应用项目:SurfaceView_Player。
(1)在主布局文件activity_main.xml中放置一个SurfaceView控件和3个Button,如图8-2所示。
图8-2 项目布局
(2)主Activity文件MainActivity.java的代码如下。
(3)在配置文件AndroidManifest.xml中增加访问权限代码如下。
(4)项目运行结果如图8-3所示。
图8-3 项目运行结果
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。