28、从头学Android之多媒体--使用MediaPlayer和SurfaceView播放视频

来源:互联网 发布:2017我国网络发展现状 编辑:程序博客网 时间:2024/06/11 17:00

应用场景:

使用VideoView播放视频简单、方便,但除此之外,我们还可以利用MediaPlayer用来播放视频。但是我们知道MediaPlayer主要用于播放音频,它是没有提供输出图像的输出界面,这时我们就用到了SurfaceView控件,将它与MediaPlayer结合起来,就能达到了视频的输出了。首先来了SurfaceView这个控件类

SurfaceView类


构造方法

方法名称

描述

public SurfaceView(Context context)

通过Context创建SurfaceView对象

public SurfaceView(Context context, AttributeSet attrs)

通过Context对象和AttributeSet创建SurfaceView对象

public SurfaceView(Context context, AttributeSet attrs, int defStyle)

通过Context对象和AttributeSet创建并可以指定样式,SurfaceView对象

 

常用方法

方法名称

描述

public SurfaceHolder getHolder ()

得到SurfaceHolder对象用于管理SurfaceView

public void setVisibility (int visibility)

设置是否可见,其值可以是VISIBLE, INVISIBLE, GONE.

 

SurfaceHolder


它是一个接口,用于管理SurfaceView。里面有两个常用的内部接口SurfaceHolder.Callback,SurfaceHolder.Callback2而Callback2是实现于Callback的

常用方法

方法名称

描述

public abstract void addCallback (SurfaceHolder.Callback callback)

添加一个Callback对象监听SurfaceView的变化

public abstract void removeCallback (SurfaceHolder.Callback callback)

移除Callback

public abstract void setType (int type)

设置SurfaceView的控制方式

public abstract Canvas lockCanvas ()

锁定整个SurfaceView对象,获取该Surface上的Canvas

public abstract Canvas lockCanvas (Rect dirty)

锁定SurfaceView上Rect划分的区域,获取该Surface上的Canvas

public abstract void unlockCanvasAndPost (Canvas canvas)

调用该方法,之前所绘制的图形还处于缓冲之中,下一次的lockCanvas()方法锁定的区域可能会“遮挡”它

 

SurfaceHolder.CallBack


在Callback里有三个抽象方法

方法名称

描述

public abstract void surfaceChanged (SurfaceHolder holder, int format, int width, int height)

SurfaceView改变时触发

public abstract void surfaceCreated (SurfaceHolder holder)

SurfaceView创建时触发

public abstract void surfaceDestroyed (SurfaceHolder holder)

SurfaceView销毁时触发

 

如何理解这几个类或者接口之间的关系?

这样理解:

SurfaceView它用于显示,SurfaceHolder就是用于用来管理这个显示的SurfaceView对象的,但在SurfaceHolder是怎么样去管理这个对象的呢?这就用到了SurfceHolder.addCallback()方法添加一个SurfaceHolder接口的内部接口的三个抽象方法用于管理或者说是用于监听SurfaceView。这样就达到了管理SurfaceView的目的。

 

实例:使用MediaPlayer与SurfaceView播放视频

实现效果:


实现步骤:

1)       创建MediaPlayer对象,并设置加载的视频文件(setDataSource())

2)       在界面布局文件中定义SurfaceView控件

3)       通过MediaPlayer.setDisplay(SurfaceHolder sh)来指定视频画面输出到SurfaceView之上

4)       通过MediaPlayer的其他一些方法用于播放视频

 

代码实现:

布局文件:main.xml

[html] view plaincopyprint?
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent"  
  5.     android:orientation="vertical" >  
  6.   
  7.     <SurfaceView  
  8.         android:id="@+id/surfaceView"  
  9.         android:layout_width="fill_parent"  
  10.         android:layout_height="360px" />  
  11.   
  12.     <LinearLayout  
  13.         android:layout_width="fill_parent"  
  14.         android:layout_height="wrap_content"  
  15.         android:gravity="center_horizontal"  
  16.         android:orientation="horizontal" >  
  17.   
  18.         <ImageButton  
  19.             android:id="@+id/btnplay"  
  20.             android:layout_width="wrap_content"  
  21.             android:layout_height="wrap_content"  
  22.             android:src="@drawable/play" />  
  23.   
  24.         <ImageButton  
  25.             android:id="@+id/btnpause"  
  26.             android:layout_width="wrap_content"  
  27.             android:layout_height="wrap_content"  
  28.             android:src="@drawable/pause" />  
  29.   
  30.         <ImageButton  
  31.             android:id="@+id/btnstop"  
  32.             android:layout_width="wrap_content"  
  33.             android:layout_height="wrap_content"  
  34.             android:src="@drawable/stop" />  
  35.     </LinearLayout>  
  36.   
  37. </LinearLayout>  

 

Activity代码

[java] view plaincopyprint?
  1. package com.jiahui.surfaceview;  
  2.   
  3. import android.app.Activity;  
  4. import android.media.AudioManager;  
  5. import android.media.MediaPlayer;  
  6. import android.os.Bundle;  
  7. import android.view.SurfaceHolder;  
  8. import android.view.SurfaceHolder.Callback;  
  9. import android.view.SurfaceView;  
  10. import android.view.View;  
  11. import android.view.View.OnClickListener;  
  12. import android.widget.Button;  
  13. import android.widget.ImageButton;  
  14.   
  15. public class SurfaceViewVideoDemoActivity extends Activity  implements OnClickListener{  
  16.   
  17.     ImageButton btnplay, btnstop, btnpause;  
  18.     SurfaceView surfaceView;  
  19.     MediaPlayer mediaPlayer;  
  20.     int position;  
  21.   
  22.     public void onCreate(Bundle savedInstanceState) {  
  23.         super.onCreate(savedInstanceState);  
  24.         setContentView(R.layout.main);    
  25.         btnplay=(ImageButton)this.findViewById(R.id.btnplay);  
  26.         btnstop=(ImageButton)this.findViewById(R.id.btnplay);  
  27.         btnpause=(ImageButton)this.findViewById(R.id.btnplay);  
  28.           
  29.         btnstop.setOnClickListener(this);  
  30.         btnplay.setOnClickListener(this);  
  31.         btnpause.setOnClickListener(this);  
  32.           
  33.         mediaPlayer=new MediaPlayer();  
  34.         surfaceView=(SurfaceView) this.findViewById(R.id.surfaceView);  
  35.       
  36.         //设置SurfaceView自己不管理的缓冲区  
  37.         surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);         
  38.         surfaceView.getHolder().addCallback(new Callback() {          
  39.             @Override  
  40.             public void surfaceDestroyed(SurfaceHolder holder) {  
  41.           
  42.             }  
  43.           
  44.             @Override  
  45.             public void surfaceCreated(SurfaceHolder holder) {  
  46.                 if (position>0) {  
  47.                     try {  
  48.                         //开始播放  
  49.                         play();  
  50.                         //并直接从指定位置开始播放  
  51.                         mediaPlayer.seekTo(position);  
  52.                         position=0;                       
  53.                     } catch (Exception e) {  
  54.                         // TODO: handle exception  
  55.                     }  
  56.                 }  
  57.             }             
  58.             @Override  
  59.             public void surfaceChanged(SurfaceHolder holder, int format, int width,  
  60.                     int height) {  
  61.   
  62.             }  
  63.         });       
  64.     }  
  65.     @Override  
  66.     public void onClick(View v) {     
  67.         switch (v.getId()) {  
  68.         case R.id.btnplay:  
  69.             play();  
  70.             break;  
  71.               
  72.         case R.id.btnpause:  
  73.             if (mediaPlayer.isPlaying()) {  
  74.                 mediaPlayer.pause();  
  75.             }else{  
  76.                 mediaPlayer.start();  
  77.             }  
  78.             break;  
  79.   
  80.         case R.id.btnstop:  
  81.             if (mediaPlayer.isPlaying()) {  
  82.                 mediaPlayer.stop();  
  83.             }  
  84.               
  85.             break;  
  86.         default:  
  87.             break;  
  88.         }  
  89.   
  90.     }  
  91.     @Override  
  92.     protected void onPause() {    
  93.         //先判断是否正在播放  
  94.         if (mediaPlayer.isPlaying()) {  
  95.             //如果正在播放我们就先保存这个播放位置  
  96.             position=mediaPlayer.getCurrentPosition()  
  97.                     ;  
  98.             mediaPlayer.stop();  
  99.         }  
  100.         super.onPause();  
  101.     }  
  102.   
  103.     private void play() {  
  104.         try {  
  105.             mediaPlayer.reset();  
  106.             mediaPlayer  
  107.             .setAudioStreamType(AudioManager.STREAM_MUSIC);  
  108.             //设置需要播放的视频  
  109.             mediaPlayer.setDataSource("/mnt/sdcard/movie.3gp");  
  110.             //把视频画面输出到SurfaceView  
  111.             mediaPlayer.setDisplay(surfaceView.getHolder());  
  112.             mediaPlayer.prepare();  
  113.             //播放  
  114.             mediaPlayer.start();          
  115.         } catch (Exception e) {  
  116.             // TODO: handle exception  
  117.         }  
  118.     }  
  119. }  

 如需转载引用请注明出处:http://blog.csdn.net/jiahui524

0 1
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 办信用卡没有单位电话怎么办 qq账号永久封停怎么办 qq号给冻结了怎么办 微信被官方封2天怎么办 天虹的卡丢了怎么办 顺丰快递到不了的地区怎么办 信用卡兑换东西超过积分怎么办 新买的冰箱坏了怎么办 买新洗衣机出现克坏怎么办 京东当日达没到达怎么办 兴隆卡不能用了怎么办 龙津时代烂尾了怎么办 三星s8电耗尽无法开机怎么办 杜鹃买回来蔫了怎么办 电视柜比背景墙小了怎么办 美图m8手机发热怎么办 美图t8手机很卡怎么办 美图m6手机发热怎么办 金立m6打电话声音小怎么办 美图m6突然黑屏怎么办 美图t8s死机了怎么办 美图手机音量小怎么办 美图手机突然音量小怎么办 苹果六手机反应慢怎么办 美图t8开机慢怎么办 美图m6s拍照模糊怎么办 8848m4密码忘了怎么办 美图手机m4自拍黑屏怎么办 美图m4相机黑屏怎么办 美图m4手机拍照黑屏怎么办 美图m4拍照黑屏怎么办 美图m4很卡怎么办 美图m8工厂模式怎么办 美图m6开不了机怎么办 美图m8开不开机怎么办 美图摄像头坏了怎么办 美图t8相机模糊怎么办 美图m4卡槽坏了怎么办 美图t8手机好卡怎么办 美图手机m6卡怎么办 美图t8屏幕不亮怎么办