使用VideoView播放视频简单、方便,丹有些早期的开发者更喜欢使用MediaPlayer来播放视频,但由于MediaPlayer主要用于播放音频,因此它没有提供图像输出界面,此时

需要借助于SurfaceView来显示MediaPlayer播放的图像输出。

使用MediaPlayer播放视频的步骤如下:

1、创建MediaPlayer对象,并让它加载指定的视频文件。

2、在界面布局文件中定义SurfaceView组件,或在程序中创建SurfaceView组件,并为SurfaceView的SurfaceHolder天剑Callback监听器。

3、调用MediaPlayer对象的setDisplay(SurfaceHolder  sh)将所播放的视频图像输出到指定的SurfaceView组件,

4、调用MediaPlayer对象的start()、stop()和pause()方法控制视频的播放。

import java.io.IOException;

import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageButton;

public class SurfaceviewPlayVideo extends Activity implements OnClickListener{
  SurfaceView surfaceView;
  ImageButton play;
  ImageButton pause;
  ImageButton stop;
  MediaPlayer mPlayer;
  //记录当前视频的播放位置
  int position;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_surfaceview_play_video);
    //获取界面中的三个按钮
    play = (ImageButton) findViewById(R.id.play);
    pause = (ImageButton) findViewById(R.id.pause);
    stop = (ImageButton) findViewById(R.id.stop);
    //为三个按钮的单击事件绑定事件监听器
    play.setOnClickListener(this);
    pause.setOnClickListener(this);
    stop.setOnClickListener(this);
    //创建MediaPlayer对象
    mPlayer = new MediaPlayer();
    surfaceView = (SurfaceView) this.findViewById(R.id.surfaceView);
    //设置SurfaceView自己不管理的缓冲区
    surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    //设置播放时打开屏幕
    surfaceView.getHolder().setKeepScreenOn(true);
    surfaceView.getHolder().addCallback(new SurfaceListener());
  }

  @Override
  public void onClick(View source) {
    try {
      switch (source.getId()) {
        //播放按钮被单击
        case R.id.play:
          play();
          break;
        //暂停按钮被单击
        case R.id.pause:
          if(mPlayer.isPlaying()){
            mPlayer.pause();
          }else{
            mPlayer.start();
          }
          break;
        //停止按钮被单击
        case R.id.stop:
          if(mPlayer.isPlaying()){
            mPlayer.stop();
          }
          break;

      }
    } catch (Exception e) {
      e.printStackTrace();
    }

  }

  private void play() throws IllegalArgumentException, SecurityException, IllegalStateException, IOException{
    mPlayer.reset();
    mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
    //设置需要播放的视频
    mPlayer.setDataSource("/mnt/sdcard/movie.3gp");
    //把视频画面输出到SurfaceView
    mPlayer.setDisplay(surfaceView.getHolder());
    mPlayer.prepare();
    mPlayer.start();
  }

  private class SurfaceListener implements SurfaceHolder.Callback{

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
      if(position > 0){
        try {
          //开始播放
          play();
          //并直接从指定位置开始播放
          mPlayer.seekTo(position);
          position = 0;
        } catch (Exception e) {
          e.printStackTrace();
        }
      }

    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width,
                                  int height) {
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
    }

  }
  //当其他Activity被打开时,暂停播放
  @Override
  protected void onPause() {
    if(mPlayer.isPlaying()){
      //保存当前的播放位置
      position = mPlayer.getCurrentPosition();
      mPlayer.stop();
    }
    super.onPause();
  }

  @Override
  protected void onDestroy() {
    // 停止播放
    if(mPlayer.isPlaying()){
      mPlayer.stop();
    }
    //释放资源
    mPlayer.release();
    super.onDestroy();
  }
}

从上面的代码不难看出,使用MediaPlayer播放视频与播放音频的步骤大同小于,关键要设置使用SurfaceView来显示MediaPlayer播放时的图像输出。当然,由于程序需要使用SurfaceView来显示MediaPlayer的图像暑促,因此程序需要一些代码来维护SurfaceView、SurfaceHolder对象。

使用MediaPlayer播放视频要复杂一些,而且需要自己开发控制按钮来控制视频播放,因此一般推荐使用VideoView来播放视频。

使用MediaPlayer和SurfaceView播放视频的更多相关文章

  1. Android MediaPlayer和SurfaceView播放视频

    昨天介绍了VideoView播放视频,今天再介绍一种播放视频的方法MediaPlayer和SurfaceView,MediaPlayer播放音频,SurfaceView来显示图像,具体步骤如下: 1. ...

  2. android中使用MediaPlayer和SurfaceView播放视频

    package com.test.video; import java.io.IOException; import android.media.AudioManager; import androi ...

  3. android 98 MediaPlayer+SurfaceView播放视频

    package com.itheima.videoplayer; import java.io.IOException; import android.media.MediaPlayer; impor ...

  4. Android SurfaceView播放视频时横竖屏的调整

    对于横屏录制的视频就横屏播放,对于竖屏录制的视频就竖屏播放. 在mainifest文件里对负责播放的Activity添加以下属性“ android:configChanges="orient ...

  5. 183使用 MediaPlayer Framework 框架播放视频

    效果如下: ViewController.h #import <UIKit/UIKit.h> #import <MediaPlayer/MediaPlayer.h> @inte ...

  6. 使用MediaPlayer类和SurfaceView来播放视频

    MediaPlayer可以播放视频,只需需要SurfaceView的配合,SurfaceView主要用于显示MediaPlayer播放的视频流媒体的画面渲染. SurfaceView是配合MediaP ...

  7. Android实现播放视频

    转载:http://www.bdqn.cn/news/201311/12100.shtml 使用VideoView播放视频 VideoView,用于播放一段视频媒体,它继承了SurfaceView,位 ...

  8. Android--使用VideoView播放视频

    承香墨影 Android--使用VideoView播放视频   前言   之前有讲过如何使用SurfaceView配合MediaPlayer播放视频,其实Android还为开发人员提供了另外一种更简单 ...

  9. Android--SurfaceView播放视频

    前言 本篇博客讲解一下如何在Android下,使用SurfaceView播放一个视频流媒体.之前有讲到如何使用MediaPlayer播放音频流媒体,其实MediaPlayer还可以播放视频,只需需要S ...

随机推荐

  1. iOS - Swift NSValue 值

    前言 public class NSValue : NSObject, NSCopying, NSSecureCoding 将任意数据类型包装成对象. 1.比较两个 NSValue 类型数据的大小 l ...

  2. Generator 函数的含义与用法

    Generator 函数是协程在 ES6 的实现,最大特点就是可以交出函数的执行权(即暂停执行). function* gen(x){ var y = yield x + 2; return y; } ...

  3. nodejs学习笔记<六>文件处理

    nodejs处理文件模块:fs  —>  var fs = require(‘fs’); 读取文件:readFileSync & readFile 读取文件路径为绝对: 读取结果需要to ...

  4. ORA-32004 参数设置过时的解决办法

    启动时报错: 查看日志: view /opt/oracle11g/app/db/diag/rdbms/yldev/yldev/trace/alert_yldev.log 原来是plsql_debug ...

  5. Java源码初学_HashSet&LinkedHashSet

    一.概述 HashSet是建立在HashMap的基础上的,其内部存在指向一个HashMap对象的引用,操作HashSet实际上就是操作HashMap,而HashMap中所有键的值都指向一个叫做Dumm ...

  6. 使用fragment兼容低版本的写法

      [1]定义fragment继承V4包中的Fragment    [2]定义的activity要继承v4包中的FragmentActivity   [3]通过这个方法getSupportFragme ...

  7. hdu 1573 X问题

    数论题,本想用中国剩余定理,可是取模的数之间不一定互质,用不了,看到网上有篇文章写得很好的:数论——中国剩余定理(互质与非互质),主要是采用合并方程的思想: 大致理解并参考他的代码后便去试试hdu上这 ...

  8. Javascript模块化编程(一):模块的写法 (转载 学习中。。。。)

    转载地址:http://www.ruanyifeng.com/blog/2012/10/javascript_module.html 阮一峰 大神:http://www.ruanyifeng.com/ ...

  9. nginx系统真正有效的图片防盗链完整设置详解

    原文:http://www.wufangbo.com/nginx-fang-dao-lian/ 关于nginx防盗链的方法网上有很多教程,都可以用,但是我发现很多教程并不完整,所做的防盗链并不是真正的 ...

  10. Windows 上远程访问 Unix 的 XWindow / XManager / X

    准备 下载 putty  - http://www.putty.org/ 安装 cygwin - http://cygwin.com/, 并添加 e.g. c:/cygwin/bin 到 Window ...