应用场景:
使用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
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<SurfaceView
android:id="@+id/surfaceView"
android:layout_width="fill_parent"
android:layout_height="360px" />
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:orientation="horizontal" >
<ImageButton
android:id="@+id/btnplay"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/play" />
<ImageButton
android:id="@+id/btnpause"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/pause" />
<ImageButton
android:id="@+id/btnstop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/stop" />
</LinearLayout>
</LinearLayout>
Activity代码
package com.jiahui.surfaceview;
import android.app.Activity;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageButton;
public class SurfaceViewVideoDemoActivity extends Activity implements OnClickListener{
ImageButton btnplay, btnstop, btnpause;
SurfaceView surfaceView;
MediaPlayer mediaPlayer;
int position;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btnplay=(ImageButton)this.findViewById(R.id.btnplay);
btnstop=(ImageButton)this.findViewById(R.id.btnplay);
btnpause=(ImageButton)this.findViewById(R.id.btnplay);
btnstop.setOnClickListener(this);
btnplay.setOnClickListener(this);
btnpause.setOnClickListener(this);
mediaPlayer=new MediaPlayer();
surfaceView=(SurfaceView) this.findViewById(R.id.surfaceView);
//设置SurfaceView自己不管理的缓冲区
surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
surfaceView.getHolder().addCallback(new Callback() {
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
if (position>0) {
try {
//开始播放
play();
//并直接从指定位置开始播放
mediaPlayer.seekTo(position);
position=0;
} catch (Exception e) {
// TODO: handle exception
}
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
}
});
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btnplay:
play();
break;
case R.id.btnpause:
if (mediaPlayer.isPlaying()) {
mediaPlayer.pause();
}else{
mediaPlayer.start();
}
break;
case R.id.btnstop:
if (mediaPlayer.isPlaying()) {
mediaPlayer.stop();
}
break;
default:
break;
}
}
@Override
protected void onPause() {
//先判断是否正在播放
if (mediaPlayer.isPlaying()) {
//如果正在播放我们就先保存这个播放位置
position=mediaPlayer.getCurrentPosition()
;
mediaPlayer.stop();
}
super.onPause();
}
private void play() {
try {
mediaPlayer.reset();
mediaPlayer
.setAudioStreamType(AudioManager.STREAM_MUSIC);
//设置需要播放的视频
mediaPlayer.setDataSource("/mnt/sdcard/movie.3gp");
//把视频画面输出到SurfaceView
mediaPlayer.setDisplay(surfaceView.getHolder());
mediaPlayer.prepare();
//播放
mediaPlayer.start();
} catch (Exception e) {
// TODO: handle exception
}
}
}
如需转载引用请注明出处:http://blog.csdn.net/jiahui524
分享到:
相关推荐
从头学Android之多媒体--使用MediaPlayer播放音频示例代码
使用VideoView播放视频简单、方便,但有些早期的开发者还是更喜欢使用MediaPlayer来播放视频,但由于MediaPlayer主要用于播放音频,因此它没有提供图像输出界面,此时就需要借助于SurfaceView来显示MediaPlayer播放...
介绍了使用MediaPlayer播放音频,实际上,MediaPlayer还可以用来播放视频文件,只不过使用MediaPlayer播放视频时,没有提供图像输出界面。这时,可以使用SurfaceView组件来...使用MediaPlayer和SurfaceView播放视频....
用MediaPlayer和SurfaceView写的视频播放器,利用系统自带的编解码功能,具备播放、暂停、停止功能,支持旋转屏幕,在发生屏幕旋转、Activity切换等事件之后,能记住之前的播放状态和播放进度,界面比较简单,仅供...
Android 中级教程之------Android MediaPlayer播放mp3的实例 是提示性代码!
例子中使用SurfaceView控件显示视频,使用MediaPlayer控制视频播放。
android 利用MediaPlayer+SurfaceView播放视频,与我的文章对应http://blog.csdn.net/shenxiaolei507/article/details/41349295,而且其中还有很多高级功能的实现,还包括ViedioView播放视频!!
Android下使用SurfaceView播放视频文件,详细参见博客:http://www.cnblogs.com/plokmju/p/android_SurfaceView.html
MediaPlayer,SurfaceView,使用audioView,和Mediaplay
android 系统播放器+SurfaceView实现播放,XML文件定义SurfaceView实现播放,并监听播放器准备,错误,完成,以及进度等函数
本示例使用 SurfaceView 播放视频,它可以使播放的位置和大小受我们的控制,使用MediaPlayer 配合 SurfaceView 来播放视频
SurfaceView+MediaPlayer视频播放,包含小窗口和全屏播放
Android MediaPlayer和SurfaceView的简单应用
android 网络视频播放 MediaPlayer SurfaceView
主要是介绍MediaPlayer和SurfaceView的结合使用,可以多个状态的加载本地视频。
一个播放本地视频的播放器,可供使用和学习。 实现功能: 1、搜索制定目录下的本地视频,并显示缩略图及视频名称在列表上;2、点击播放指定视频或按顺序播放全部视频;3、包括进度条,播放和暂停键,时间显示等控件...
传智播客_Andorid_20天精通Android开发视频_第14天视频_视频_16_MediaPlayer_surfaceView播放网络视频.avi
Android视频播放:SurfaceView+MediaPlayer播放视频http://blog.csdn.net/bing054/article/details/51195175
Android 入门视频播放器一般采用封装好的VideoView或MediaPlayer+SurfaceView两种类型,其中VideoView高度封装并不适合深入了解其中原理,下面利用SurfaceView+MediaPlay实现一个简单的视频播放器