android使用surfaceview+MediaPlayer播放视频
android中播放视频主要有两种方式:
- 使用其自带的播放器。指定action为action_view,data为uri,type为其mime类型
- 使用android自带的videoview,这种方法太简单就不介绍了
- 使用surfaceview+mediaplayer,这种方式效果比较好,这里也重点介绍
surfaceview从android 1.0就有了,十分好用。一般来说,ui对刷新都需要在ui线程中完成,但是,surfaceview可以在非ui线程中完成刷新。这样以来就很方便了,比如在线播放,就不需要自己去写handler来实现两个线程之间的通信了,直接可以在非ui线程中播放视频。
步骤:
1、调用player.setdatasource()方法设置要播放的资源,可以是文件、文件路径、或者url。
2、调用mediaplayer.setdisplay(holder)设置surfaceholder,surfaceholder可以通过surfaceview的getholder()方法获得。
3、调用mediaplayer.prepare()来准备。
4、调用mediaplayer.start()来播放视频。
这是大致步骤,但只有这些是不够的
在第二步之前需要确保surfaceholder已经准备好了。因此需要给surfaceholder设置一个callback,
调用addcallback()方法。callback 有三个回调函数,如下:
surfaceholder.callback { @override public void surfacecreated(surfaceholder holder) { } @override public void surfacechanged(surfaceholder holder, int format, int width, int height) { } @override public void surfacedestroyed(surfaceholder holder) { } }
surfacecreated()会在surfaceholder被创建的时候回调,在这里可以做一些初始化的操作,surfacedestroyed()会在surfaceholder被销毁的时候回调,在这里可以做一些释放资源的操作,防止内存泄漏。
一般,会在surfacecreated中给mediaplayer设置surfaceholder。
@override public void surfacecreated(surfaceholder holder) { player.setdisplay(holder); }
下面贴上具体代码:
public class videoactivity extends activity { private surfaceview surfaceview; private mediaplayer player; private surfaceholder holder; private progressbar progressbar; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.surfaceview_item); surfaceview = (surfaceview) findviewbyid(r.id.surfaceview); progressbar= (progressbar) findviewbyid(r.id.progressbar); //视频链接可能已失效 string uri="http://video.dispatch.tc.qq.com/77613075/x0021o8d3g3.mp4?sdtfrom=v1001&type=mp4&vkey=23289e4b8d0f4b6cf18703222dfd0038845d8f56a75eec20d5d4fde678093d9ab211efd7f4c99e5a612a96a04f46ceeb483628cffbea493d3aadbfcb81a540f7a92193874192fa0f70d1099df330b2b419d45736554cb9bb3435019c985f530c5960e4b20febd5faed17dc9f1fce1c73&platform=10902&fmt=auto&sp=350&guid=1175defd049d3301e047ce50d93e9c7a"; player=new mediaplayer(); try { player.setdatasource(this, uri.parse(uri)); holder=surfaceview.getholder(); holder.addcallback(new mycallback()); player.prepare(); player.setonpreparedlistener(new mediaplayer.onpreparedlistener() { @override public void onprepared(mediaplayer mp) { progressbar.setvisibility(view.invisible); player.start(); player.setlooping(true); } }); } catch (ioexception e) { e.printstacktrace(); } } private class mycallback implements surfaceholder.callback { @override public void surfacecreated(surfaceholder holder) { player.setdisplay(holder); } @override public void surfacechanged(surfaceholder holder, int format, int width, int height) { } @override public void surfacedestroyed(surfaceholder holder) { } } }
xml文件:
<?xml version="1.0" encoding="utf-8"?> <framelayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <surfaceview android:id="@+id/surfaceview" android:layout_width="match_parent" android:layout_height="400dp" /> <progressbar android:id="@+id/progressbar" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" /> <textview android:id="@+id/numtext" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="3dp" android:layout_gravity="bottom|left" android:text="1" android:textsize="30dp" android:textcolor="#f00"/> </framelayout>
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: 大蒜发黄能吃吗?你知道吗?
下一篇: 感冒鼻塞怎么办 11种方法巧治感冒鼻塞