欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

android使用surfaceview+MediaPlayer播放视频

程序员文章站 2023-10-31 08:29:40
android中播放视频主要有两种方式: 使用其自带的播放器。指定action为action_view,data为uri,type为其mime类型 使用android自...

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>

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