当前位置: 移动技术网 > IT编程>移动开发>Android > android使用surfaceview+MediaPlayer播放视频

android使用surfaceview+MediaPlayer播放视频

2020年03月09日  | 移动技术网IT编程  | 我要评论

中国近现代史纲要论文,让爱自由落地林笛儿,盛大文学招聘

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>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网