使用MediaPlayer和SurfaceView播放视频
使用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播放视频的更多相关文章
- Android MediaPlayer和SurfaceView播放视频
昨天介绍了VideoView播放视频,今天再介绍一种播放视频的方法MediaPlayer和SurfaceView,MediaPlayer播放音频,SurfaceView来显示图像,具体步骤如下: 1. ...
- android中使用MediaPlayer和SurfaceView播放视频
package com.test.video; import java.io.IOException; import android.media.AudioManager; import androi ...
- android 98 MediaPlayer+SurfaceView播放视频
package com.itheima.videoplayer; import java.io.IOException; import android.media.MediaPlayer; impor ...
- Android SurfaceView播放视频时横竖屏的调整
对于横屏录制的视频就横屏播放,对于竖屏录制的视频就竖屏播放. 在mainifest文件里对负责播放的Activity添加以下属性“ android:configChanges="orient ...
- 183使用 MediaPlayer Framework 框架播放视频
效果如下: ViewController.h #import <UIKit/UIKit.h> #import <MediaPlayer/MediaPlayer.h> @inte ...
- 使用MediaPlayer类和SurfaceView来播放视频
MediaPlayer可以播放视频,只需需要SurfaceView的配合,SurfaceView主要用于显示MediaPlayer播放的视频流媒体的画面渲染. SurfaceView是配合MediaP ...
- Android实现播放视频
转载:http://www.bdqn.cn/news/201311/12100.shtml 使用VideoView播放视频 VideoView,用于播放一段视频媒体,它继承了SurfaceView,位 ...
- Android--使用VideoView播放视频
承香墨影 Android--使用VideoView播放视频 前言 之前有讲过如何使用SurfaceView配合MediaPlayer播放视频,其实Android还为开发人员提供了另外一种更简单 ...
- Android--SurfaceView播放视频
前言 本篇博客讲解一下如何在Android下,使用SurfaceView播放一个视频流媒体.之前有讲到如何使用MediaPlayer播放音频流媒体,其实MediaPlayer还可以播放视频,只需需要S ...
随机推荐
- 超实用压力测试工具-ab工具
在学习ab工具之前,我们需了解几个关于压力测试的概念 吞吐率(Requests per second)概念:服务器并发处理能力的量化描述,单位是reqs/s,指的是某个并发用户数下单位时间内处理的请求 ...
- [转载] 每周推荐阅读 BFQ:实现IO的隔离共享与高吞吐访问
磁盘IO和网络IO隔离与共享是混部应用中基本需求,从早些年的BVC到现在的Matrix,以及Galaxy,或者未来的BS/Mint混部都遇到类似的问题:由于无法有效实现IO级的隔离(包括吞吐隔离.延时 ...
- poj2002Squares(点集组成正方形数)
链接 可以枚举两个点,因为是正方形两外两点可以由已知求出,据说可以根据三角形全等求出下列式子,数学渣不会证... 已知: (x1,y1) (x2,y2) 则: x3=x1+(y1-y2) y ...
- mysql 性能问题的解决
场景:模拟一天的数据,每个10秒,遍历1000个设备,每个设备模拟一个实时数据,总的数据量为:24*60*60/10*1000 = 864万条记录.-------------------------- ...
- DDL之操作表
DDL之操作表 DDL是数据定义语言,用来定义数据库对象:数据库.表.列等.其中定义数据库我们已经在DDL之操作数据库中详细讲解了,今天我们来学习使用DDL操作表. 1.创建表 使用数据定义语言创建表 ...
- linux的ulimit命令
ulimit命令用来限制系统用户对shell资源的访问. 语法: ulimit [-acdfHlmnpsStv] [size] 选项介绍: -a 显示当前所有的资源限制; -c size: ...
- 转:C语言字符串操作函数 - strcpy、strcmp、strcat、反转、回文
转自:C语言字符串操作函数 - strcpy.strcmp.strcat.反转.回文 C++常用库函数atoi,itoa,strcpy,strcmp的实现 作者:jcsu C语言字符串操作函数 1. ...
- 转:Eric Lippert:阅读代码真的很难
转自:http://blog.jobbole.com/438/ 相关文章 微软资深软件工程师:阅读代码真的很难(第2篇) 阅读优秀代码是提高开发人员修为的一种捷径 学会阅读源代码 如何阅读大型代码库? ...
- easyui 删除数据表格
1 最直接的方法: 返回的数据格式 Object rows:Array[3] 0:Object 1:Object 2:Object length:3 __proto__:A ...
- Java / JVM CPU 利用率高 - 诊断方法 1 - Thread Dump 结合 OS 诊断
IBM AIX Java 1. topas 命令定位 CPU 使用高的进程,比如下面 PID 614852 Name PID CPU% java 614852 ...