Android之SurfaceView实现视频播放
1.案例一
布局文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent" android:weightSum="1">
<SurfaceView android:layout_height="220dip" android:layout_gravity="center" android:id="@+id/surface" android:layout_weight="0.25" android:layout_width="320dip"></SurfaceView>
<LinearLayout android:id="@+id/linearLayout1" android:layout_height="wrap_content" android:layout_width="fill_parent">
<Button android:text="播放" android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
<Button android:text="暂停" android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
<Button android:text="停止" android:id="@+id/button3" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
</LinearLayout>
</LinearLayout>
主程序:
public class SurfaceActivity extends Activity implements SurfaceHolder.Callback {
/** Called when the activity is first created. */
MediaPlayer player;
SurfaceView surface;
SurfaceHolder surfaceHolder;
Button play,pause,stop;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
play=(Button)findViewById(R.id.button1);
pause=(Button)findViewById(R.id.button2);
stop=(Button)findViewById(R.id.button3);
surface=(SurfaceView)findViewById(R.id.surface); surfaceHolder=surface.getHolder(); //SurfaceHolder是SurfaceView的控制接口
surfaceHolder.addCallback(this); //因为这个类实现了SurfaceHolder.Callback接口,所以回调参数直接this
surfaceHolder.setFixedSize(320, 220); //显示的分辨率,不设置为视频默认
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); //Surface类型 play.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
player.start();
}});
pause.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
player.pause();
}});
stop.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
player.stop();
}});
} @Override
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
} @Override
public void surfaceCreated(SurfaceHolder arg0) {
//必须在surface创建后才能初始化MediaPlayer,否则不会显示图像
player=new MediaPlayer();
player.setAudioStreamType(AudioManager.STREAM_MUSIC);
player.setDisplay(surfaceHolder);
//设置显示视频显示在SurfaceView上
try {
player.setDataSource("/sdcard/3.mp4");
player.prepare();
} catch (Exception e) {
e.printStackTrace();
}
} @Override
public void surfaceDestroyed(SurfaceHolder arg0) {
// TODO Auto-generated method stub } @Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
if(player.isPlaying()){
player.stop();
}
player.release();
//Activity销毁时停止播放,释放资源。不做这个操作,即使退出还是能听到视频播放的声音
}
}
2.案例二
布局文件main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#ffffff"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/filename"
/>
<EditText android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="oppo.mp4"
android:id="@+id/filename"
/>
<LinearLayout
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
>
<ImageButton android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:src="@drawable/play"
android:id="@+id/play"
/>
<ImageButton android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:src="@drawable/pause"
android:id="@+id/pause"
/>
<ImageButton android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:src="@drawable/stop"
android:id="@+id/stop"
/>
<ImageButton android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:src="@drawable/reset"
android:id="@+id/reset"
/>
</LinearLayout>
<SurfaceView android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/surfaceview"
/>
</LinearLayout>
主程序VodeoPlayActivity.java
public class VodeoPlayActivity extends Activity {
/** Called when the activity is first created. */
private EditText filenamEditText;
private MediaPlayer mediaPlayer;
private String filename;
private SurfaceView surfaceView;
private final static String TAG="VodeoPlayActivity";
private int prosition=0; @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
filenamEditText=(EditText) this.findViewById(R.id.filename);
surfaceView=(SurfaceView)this.findViewById(R.id.surfaceview);
surfaceView.getHolder().setFixedSize(176, 144);//设置分辨率
surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);//设置surfaceview不维护自己的缓冲区,而是等待屏幕的渲染引擎将内容推送到用户面前
surfaceView.getHolder().addCallback(new SurceCallBack());//对surface对象的状态进行监听
mediaPlayer=new MediaPlayer(); ButtonOnClikListiner buttonOnClikListinero=new ButtonOnClikListiner();
ImageButton start=(ImageButton) this.findViewById(R.id.play);
ImageButton pause=(ImageButton) this.findViewById(R.id.pause);
ImageButton stop=(ImageButton) this.findViewById(R.id.stop);
ImageButton replay=(ImageButton) this.findViewById(R.id.reset);
start.setOnClickListener(buttonOnClikListinero);
pause.setOnClickListener(buttonOnClikListinero);
stop.setOnClickListener(buttonOnClikListinero);
replay.setOnClickListener(buttonOnClikListinero);
} private final class ButtonOnClikListiner implements View.OnClickListener{
@Override
public void onClick(View v) {
if(Environment.getExternalStorageState()==Environment.MEDIA_UNMOUNTED){
Toast.makeText(VodeoPlayActivity.this, "sd卡不存在", Toast.LENGTH_SHORT).show();
return;
}
filename=filenamEditText.getText().toString();
switch (v.getId()) {
case R.id.play:
play();
break;
case R.id.pause:
if(mediaPlayer.isPlaying()){
mediaPlayer.pause();
}else{
mediaPlayer.start();
}
break;
case R.id.reset:
if(mediaPlayer.isPlaying()){
mediaPlayer.seekTo(0);
}else{
play();
}
break;
case R.id.stop:
if(mediaPlayer.isPlaying()){
mediaPlayer.stop();
}
break;
}
}
} private void play() {
try {
File file=new File(Environment.getExternalStorageDirectory(),filename);
mediaPlayer.reset();//重置为初始状态
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);//设置音乐流的类型
mediaPlayer.setDisplay(surfaceView.getHolder());//设置video影片以surfaceviewholder播放
mediaPlayer.setDataSource(file.getAbsolutePath());//设置路径
mediaPlayer.prepare();//缓冲
mediaPlayer.start();//播放
} catch (Exception e) {
Log.e(TAG, e.toString());
e.printStackTrace();
}
} private final class SurceCallBack implements SurfaceHolder.Callback{
/**
* 画面修改
*/
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub } /**
* 画面创建
*/
@Override
public void surfaceCreated(SurfaceHolder holder) {
if(prosition>0&&filename!=null){
play();
mediaPlayer.seekTo(prosition);
prosition=0;
} } /**
* 画面销毁
*/
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
if(mediaPlayer.isPlaying()){
prosition=mediaPlayer.getCurrentPosition();
mediaPlayer.stop();
}
}
}
}
Android之SurfaceView实现视频播放的更多相关文章
- Android开发之MediaPlayer和SurfaceView组成视频播放器
SurfaceView 使用双缓冲技术 是个重量级的组件 只要不可见,就不会创建,可见时,才会创建 只要不可见,就会销毁 SurfaceView一旦不可见,就会被销毁,一旦可见,就会被创建,销毁时停止 ...
- Android视图SurfaceView的实现原理分析(示例,出错代码)
在Android系统中,有一种特殊的视图,称为SurfaceView,它拥有独立的绘图表面,即它不与其宿主窗口共享同一个绘图表面.由于拥有独立的绘图表面,因此SurfaceView的UI就可以在一个独 ...
- android之VideoView和视频播放View的扩展
1.概念及扩展 VideoView 是android 系统提供的一个媒体播放显示和控制的控件.其结构层次如下: 原型:VideoView extends SurfaceView implements ...
- android: View, SurfaceView, GLSurfaceView, TextureView 区别与联系
区别与联系 View: 显示视图,内置画布,提供了图形绘制函数.触屏事件.按键事件函数等,必须在UI主线程内更新画面,速度较慢: SurfaceView: 基于view视图进行拓展的视图类,更适合2D ...
- Android开发 海康威视 多路视频播放(同时播放视频)
原文地址:Android开发 海康视频 多路视频播放 | Stars-One的杂货小窝 最近公司有个项目需要对接到海康监控摄像头来实现对应的实时播放和回放,但这两个不是我们今天要讨论的重点,APP首页 ...
- Android 之surfaceView (画动态圆圈)
通过之前介绍的如何自定义View, 我们知道使用它可以做一些简单的动画效果.它通过不断循环的执行View.onDraw方法,每次执行都对内部显示的图形做一些调整,我们假设 onDraw方法每秒执行 ...
- Android 利用SurfaceView进行图形绘制
SurfaceView使用介绍 SurfaceView是View的一个特殊子类,它的目的是另外提供一个线程进行绘制操作. 要使用SurfaceView进行绘制,步骤如下: 1.用SurfaceView ...
- Android使用SurfaceView实现墨迹天气的风车效果
SurfaceView也是继承自View,它和我们以前接触到的View(Button.TextView等)最大的不同是,SurfaceView可以有一个单独的线程进行绘制,这个线程区别于UI线程(主线 ...
- Android之SurfaceView
SurfaceView也是继承了View,但是我们并不需要去实现它的draw方法来绘制自己,为什么呢? 因为它和View有一个很大的区别,View在UI线程去更新自己:而SurfaceView则在一个 ...
随机推荐
- 一个Lumen多层拆分手记
这个项目除了最基本的MVC,routes和之前讲过的ServiceProvider(服务商)依赖注入,还有Action (动作) .Repositories(仓储)等... 先讲一下仓储吧, 一般JA ...
- Codeforces Round #FF (Div. 2) A. DZY Loves Hash
DZY has a hash table with p buckets, numbered from 0 to p - 1. He wants to insert n numbers, in the ...
- 体验DNN演示平台《A Neural Network Playground》(一)
0 本次博客内容简介 本次博客标(一),是因为我自知有些地方还是不理解.本篇博客仅暂时记录第一次玩 A Neural Network Playground的体验,如果后面有了进一步体会,会更新新的内容 ...
- EasyNVR流媒体直播之:零基础实现摄像头的全平台直播 (二)公网直播的实现
接上回(https://blog.csdn.net/xiejiashu/article/details/81276870),我们实现内网直播,可以实现直播的web观看,该篇博文我们将实现公网的直播. ...
- Mybatis中的关联映射和查询
一.商品订单数据模型 1.数据表 这里定义了四个表,分别表示用户,商品,订单,和订单详情. 用户表user CREATE TABLE `user` ( `id` int(11) NOT NULL AU ...
- 解决iOS11 UIScrollView下移问题
iOS11 系统为UIScrollView增加一个contentInsetAdjustmentBehavior属性,默认为UIScrollViewContentInsetAdjustmentAutom ...
- iOS系统层次架构
本文转自:http://blog.csdn.net/lxl_815520/article/details/51172917 一,概述 iOS的系统架构分为四个层次:核心操作系统层(Core OS la ...
- apache .htaccess实现301重定向
<IfModule mod_rewrite.c> Options +FollowSymlinks RewriteEngine On #301定向 RewriteCond %{HTTP_HO ...
- bug_1——oracle listagg():列转行
select listagg(字段名 ,',') within group (order by 字段名) from表 where 条件 listagg():列转行 WM_CONCAT():和并列 ...
- window 上创建 .gitignore文件
由于 git默认不上传空文件夹,如果需要上传空文件夹,那么需要这样上传空文件,官方给出这样的做法~~ (需要创建.gitignore文件) 在linux 上比较好操作了,这里说下在window 上 创 ...