首页 理论教育 MediaPlayer+SurfaceView打造高效视频播放器

MediaPlayer+SurfaceView打造高效视频播放器

时间:2023-06-27 理论教育 版权反馈
【摘要】:但是MediaPlayer主要用于播放音频,没有提供输出图像的输出界面,这时就要用到SurfaceView控件,将它与MediaPlayer结合起来,就能实现视频的输出。通过SurfaceView显示视频内容的特点如下。static MediaPlayercreate:根据给定的URI方便地创建MediaPlayer对象的方法。使用MediaPlayer+SurfaceView播放视频的步骤如下。在界面布局文件中定义SurfaceView控件。使用MediaPlayer配合SurfaceView播放视频的步骤与使用MediaPlayer播放MP3大体一致,只需要额外设置显示的SurfaceView即可。一般会在surfaceCreated中为MediaPlayer设置surfaceHolder,例如:下面是MediaPlayer+SurfaceView播放视频的实例。在Android2.3中创建应用项目:SurfaceView_Player。

MediaPlayer+SurfaceView打造高效视频播放器

前面介绍了使用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类主要方法

978-7-111-58810-8-Chapter08-24.jpg

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有如下三个回调函数。

978-7-111-58810-8-Chapter08-25.jpg

surfaceCreated()会在SurfaceHolder被创建的时候回调,在这里可以进行一些初始化的操作,surfaceDestroyed()会在SurfaceHolder被销毁的时候回调,在这里可以进行一些释放资源的操作,防止内存泄漏。

一般会在surfaceCreated中为MediaPlayer设置surfaceHolder,例如:

978-7-111-58810-8-Chapter08-26.jpg

下面是MediaPlayer+SurfaceView播放视频的实例。在Android2.3中创建应用项目:SurfaceView_Player。

(1)在主布局文件activity_main.xml中放置一个SurfaceView控件和3个Button,如图8-2所示。

978-7-111-58810-8-Chapter08-27.jpg

图8-2 项目布局

(2)主Activity文件MainActivity.java的代码如下。

978-7-111-58810-8-Chapter08-28.jpg

978-7-111-58810-8-Chapter08-29.jpg

978-7-111-58810-8-Chapter08-30.jpg

(3)在配置文件AndroidManifest.xml中增加访问权限代码如下。

978-7-111-58810-8-Chapter08-31.jpg

(4)项目运行结果如图8-3所示。

978-7-111-58810-8-Chapter08-32.jpg

图8-3 项目运行结果

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈