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 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>
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。
总结以上是内存溢出为你收集整理的android使用surfaceview+MediaPlayer播放视频全部内容,希望文章能够帮你解决android使用surfaceview+MediaPlayer播放视频所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)