android开发分享android使用surfaceview+MediaPlayer播放视频

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="https://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="https://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开发分享android使用surfaceview+MediaPlayer播放视频的全部内容,希望对大家的学习有所帮助,也希望大家多多支持<计算机技术网(www.ctvol.com)!!>。

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/addevelopment/899599.html

(0)
上一篇 2021年10月23日
下一篇 2021年10月23日

精彩推荐