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则在一个 ...
随机推荐
- 滑动窗口计数java实现
滑动窗口计数有很多使用场景,比如说限流防止系统雪崩.相比计数实现,滑动窗口实现会更加平滑,能自动消除毛刺. 概念上可以参考TCP的滑窗算法,可以看一下这篇文章(http://go12345.iteye ...
- git 常用使用命令
http://www.ruanyifeng.com/blog/2015/12/git-cheat-sheet.html http://www.open-open.com/lib/view/open14 ...
- 线程池 Future 带返回结果
package com.aibi.cmdc.bigscreen.action; import java.util.ArrayList; import java.util.HashMap; import ...
- 如何使CSS--better(系列一)
我们想一下以下问题: 1.什么样子的css代码才是高效的? 2.什么样子的css代码才是便于维护的? 3.什么样子的css才是可扩展的? 带着以下问题咱们简单的说一下css的“性能”问题 虽然我技术不 ...
- 粗体EditorGUI
GUILayout.Label ("Shading", EditorStyles.boldLabel); EditorGUILayout.Space (); InspectorSu ...
- ios8 一些运行问题
iOS10相册相机闪退bughttp://www.jianshu.com/p/5085430b029fiOS 10 因苹果健康导致闪退 crashhttp://www.jianshu.com/p/5 ...
- stm32DMA通道 ADC通道
DMA: 1.使用DAC的时候.将转化后得到的模拟信号通过IO口输出的时候.为什么还将IO口配置能输入模式 PS:stm32手冊上定义PA4和PA5分别和DAC1通道和DAC2通道相连 : DMA1 ...
- 使用MYCAT轻松实现MYSQL水平分片
完整文章下载地址:http://download.csdn.net/detail/dreamcode/9383516 简单来说,我们能够将数据的水平切分理解为是依照数据行的切分.就是将表中的某些行切分 ...
- share(发包方面)
share(发包方面) 接收所有map发过来的包,这个是GS线程驱动的 { for (;;) { //... if(!itMap.second->RecvData(Pkt)) break; if ...
- Android代码绘制虚线、圆角、渐变效果图
drawable文件夹放置动画/形状/选择器等属性文件,唯一的drawable文件名,不允许写错和拼错,否则运行报错.drawable文件夹底下的xml文件可以包括的标签共18个:animation- ...