视频播放-SurfaceView

1、视图

 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     xmlns:tools="http://schemas.android.com/tools"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent"
 5     android:orientation="vertical"
 6     tools:context=".MainActivity" >
 7
 8     <EditText
 9         android:id="@+id/et_path"
10         android:hint="请输入视频文件"
11         android:layout_width="fill_parent"
12         android:layout_height="wrap_content"
13         android:text="/sdcard/mm.mp4"
14         />
15
16     <SeekBar
17         android:id="@+id/sb"
18         android:layout_width="fill_parent"
19         android:layout_height="wrap_content" />
20
21     <LinearLayout
22         android:layout_width="fill_parent"
23         android:layout_height="wrap_content"
24         android:orientation="horizontal"
25         >
26         <Button
27              android:id="@+id/bt_play"
28              android:layout_weight="1"
29              android:layout_width="0dip"
30              android:layout_height="wrap_content"
31              android:text="播放"
32             />
33          <Button
34               android:id="@+id/bt_pause"
35              android:layout_weight="1"
36              android:layout_width="0dip"
37              android:layout_height="wrap_content"
38              android:text="暂停"
39             />
40           <Button
41               android:id="@+id/bt_replay"
42              android:layout_weight="1"
43              android:layout_width="0dip"
44              android:layout_height="wrap_content"
45              android:text="重播"
46             />
47            <Button
48               android:id="@+id/bt_stop"
49              android:layout_weight="1"
50              android:layout_width="0dip"
51              android:layout_height="wrap_content"
52              android:text="停止"
53             />
54
55     </LinearLayout>
56
57     <SurfaceView
58         android:id="@+id/sv"
59         android:layout_width="fill_parent"
60         android:layout_height="wrap_content"
61         />
62
63 </LinearLayout>

2、android代码

  1 package com.example.videoplay;
  2
  3 import java.io.File;
  4
  5 import android.media.AudioManager;
  6 import android.media.MediaPlayer;
  7 import android.media.MediaPlayer.OnCompletionListener;
  8 import android.os.Bundle;
  9 import android.app.Activity;
 10 import android.view.Menu;
 11 import android.view.SurfaceHolder;
 12 import android.view.SurfaceHolder.Callback;
 13 import android.view.SurfaceView;
 14 import android.view.View;
 15 import android.view.View.OnClickListener;
 16 import android.widget.Button;
 17 import android.widget.EditText;
 18 import android.widget.SeekBar;
 19 import android.widget.SeekBar.OnSeekBarChangeListener;
 20 import android.widget.Toast;
 21
 22 public class MainActivity extends Activity implements OnClickListener{
 23     private EditText et_path;
 24     private Button bt_play,bt_pause,bt_replay,bt_stop;
 25     private MediaPlayer mediaPlayer;
 26     private SurfaceView sv;
 27     private int currentPosition;
 28     private SeekBar sb;
 29     private boolean isplaying;
 30     @Override
 31     protected void onCreate(Bundle savedInstanceState) {
 32         super.onCreate(savedInstanceState);
 33         setContentView(R.layout.activity_main);
 34
 35         et_path = (EditText) findViewById(R.id.et_path);
 36         bt_play = (Button) findViewById(R.id.bt_play);
 37         bt_pause = (Button) findViewById(R.id.bt_pause);
 38         bt_replay = (Button) findViewById(R.id.bt_replay);
 39         bt_stop = (Button) findViewById(R.id.bt_stop);
 40
 41         sb = (SeekBar) findViewById(R.id.sb);
 42
 43         //监听进度条拖动改变状态
 44         sb.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
 45             //当拖动停止时的调用的方法
 46             @Override
 47             public void onStopTrackingTouch(SeekBar seekBar) {
 48                 int process = sb.getProgress();
 49                 if(mediaPlayer != null && mediaPlayer.isPlaying()){
 50                     mediaPlayer.seekTo(process);
 51                 }
 52
 53             }
 54
 55             @Override
 56             public void onStartTrackingTouch(SeekBar seekBar) {
 57                 // TODO Auto-generated method stub
 58
 59             }
 60
 61             @Override
 62             public void onProgressChanged(SeekBar seekBar, int progress,
 63                     boolean fromUser) {
 64                 // TODO Auto-generated method stub
 65
 66             }
 67         });
 68
 69         sv = (SurfaceView) findViewById(R.id.sv);
 70
 71         //为什么要增加这个回调?主要是监控holder的变化的;因为如果你按一下小房子,声音仍在,而holder容易被销毁,再次打开时,看不到画面
 72         sv.getHolder().addCallback(new Callback(){
 73
 74             @Override
 75             public void surfaceChanged(SurfaceHolder holder, int format,
 76                     int width, int height) {
 77                 // TODO Auto-generated method stub
 78                 System.out.println("holder被改变了!");
 79
 80             }
 81
 82             @Override
 83             public void surfaceCreated(SurfaceHolder holder) {
 84                 // TODO Auto-generated method stub
 85                 System.out.println("holder被创建了!");
 86                 if(currentPosition > 0){
 87                     play(currentPosition);
 88                 }
 89
 90             }
 91
 92             @Override
 93             public void surfaceDestroyed(SurfaceHolder holder) {
 94                 // TODO Auto-generated method stub
 95                 System.out.println("holder被销毁了!");
 96
 97                 if(mediaPlayer != null && mediaPlayer.isPlaying()){
 98                     currentPosition = mediaPlayer.getCurrentPosition();//获取当前所播放的位置
 99                     stop();//holder被销毁时,就stop媒体
100                 }
101
102             }
103
104         });
105
106         bt_play.setOnClickListener(this);
107         bt_pause.setOnClickListener(this);
108         bt_replay.setOnClickListener(this);
109         bt_stop.setOnClickListener(this);
110     }
111
112
113     @Override
114     public void onClick(View v) {
115         switch(v.getId()){
116         case R.id.bt_play:
117             play(0);
118             break;
119         case R.id.bt_pause:
120             pause();
121             break;
122         case R.id.bt_replay:
123             replay();
124             break;
125         case R.id.bt_stop:
126             stop();
127             break;
128         }
129
130     }
131
132     private void pause() {
133         if("继续".equals(bt_pause.getText().toString().trim())){
134             mediaPlayer.start();
135             bt_pause.setText("暂停");
136             return;
137         }
138         if(mediaPlayer != null && mediaPlayer.isPlaying()){
139             mediaPlayer.pause();
140             bt_pause.setText("继续");
141             return;
142         }
143
144     }
145
146
147     private void replay() {
148         if(mediaPlayer != null && mediaPlayer.isPlaying()){
149             mediaPlayer.seekTo(0);
150             return;
151         }
152         play(0);
153
154     }
155
156
157     private void stop() {
158         // TODO Auto-generated method stub
159         if(mediaPlayer != null && mediaPlayer.isPlaying()){
160             mediaPlayer.stop();
161             mediaPlayer.release();
162             mediaPlayer = null;
163             bt_play.setEnabled(true);
164             isplaying = false;
165         }
166     }
167
168
169     private void play(int currentPosition2){
170         String path = et_path.getText().toString().trim();
171         //File file = new File(path);
172         //if(file.exists() && file.length() > 0){
173             try {
174                 mediaPlayer = new MediaPlayer();
175                 mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
176                 mediaPlayer.setDisplay(sv.getHolder());//设置video以SurfaceHolder播放
177                 mediaPlayer.setDataSource(path);
178                 //mediaPlayer.seekTo(currentPosition2);//不能把这定位放在此,否则播放不了
179                 mediaPlayer.prepare();
180                 mediaPlayer.seekTo(currentPosition2);
181                 mediaPlayer.start();
182                 //获取视频总长度
183                 int max = mediaPlayer.getDuration();
184                 sb.setMax(max);
185                 new Thread(){
186                     public void run(){
187                         isplaying = true;
188                         while(isplaying){
189                             int position = mediaPlayer.getCurrentPosition();
190                             sb.setProgress(position);
191                             try {
192                                 Thread.sleep(500);
193                             } catch (InterruptedException e) {
194                                 // TODO Auto-generated catch block
195                                 e.printStackTrace();
196                             }
197                         }
198                     }
199                 }.start();
200                 mediaPlayer.setOnCompletionListener(new OnCompletionListener() {
201
202                     @Override
203                     public void onCompletion(MediaPlayer mp) {
204                         // TODO Auto-generated method stub
205                         bt_play.setEnabled(true);
206                         isplaying = false;
207
208                     }
209                 });
210                 bt_play.setEnabled(false);
211             } catch (Exception e) {
212                 // TODO Auto-generated catch block
213                 Toast.makeText(this, "播放失败!", 0).show();
214                 e.printStackTrace();
215             }
216         //}else{
217             //Toast.makeText(this, "音频文件不存在!", 0).show();
218         //}
219     }
220
221 }

注意:

1)如果要播放互联网文件,则要加入网络权限: <uses-permission android:name="android.permission.INTERNET"/>

2)要注意和音频文件的播放代码进行比较,音频代码为:http://www.cnblogs.com/zhongyinghe/p/5354040.html

时间: 2024-10-07 08:31:31

视频播放-SurfaceView的相关文章

Android视频播放-SurfaceView和Mediaplayer

好几天没写博客了,处理了一点个人私事加上平时加班,基本上时间不充裕,上篇文章讲了一下用Mediaplayer来播放音乐,这次就讲讲使用Mediaplayer来和SurfaceView配合播放一个视频流媒体.MediaPlayer不仅可以播放视频,还可以与SurfaceView的配合,SurfaceView主要用于显示MediaPlayer播放的视频流媒体的画面渲染,两者可以一起协同播放视频. 基础维护 先来看下要实现的界面: 如果你看过上篇文章,就发现其实很简单的就是多了一个进度条,还有一个就是

Android基础笔记(十七)- 多媒体编程

MediaPlayer播放音频的基本使用 音乐播放器的完善 视频播放SurfaceView 视频播放VideoView vitamio框架 如何调用照相机和录像机 MediaPlayer播放音频的基本使用 MediaPlayer播放音频的基本使用步骤: ①创建一个MediaPlayer实例 ②设置播放的数据格式 ③设置数据源 ④准备播放 ⑤开始播放 整体的示例代码很简单: // 1. 创建一个音频播放器实例 final MediaPlayer player = new MediaPlayer()

我的Android学习之旅

去年大概在七月份的时候误打误撞接触了一阵子Android,之后由于工作时间比较忙,无暇顾及,九月份的时候自己空闲的时间比较多,公司相对来说加班情况没以前严重.开启了个人的Android学习之旅,初衷是想将Android的博客做个索引文章的,不过想想还可以分享一些学习中的历程,算是对自己的Android学习 有个交代吧.由于在公司有工作,学习的时间通常就是周一到周五晚上的时间和周末时间,周一到周五晚上的时间不确定,因此牺牲了大量的周末时间来学习Android,有点像苦行僧,时间段持续了三个多月.如

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" androi

Android 学习笔记之SurfaceView的使用+如何实现视频播放...

学习内容: 1.掌握Surface的使用... 2.Android中如何实现视频播放... 1.SurfaceView类的使用   在Android中,一般播放音频时我们可以去使用Android提供的MediaPlayer类,但是想要播放视频仅仅依靠MediaPlayer类是远远不够的...这里还需要使用到一个SurfaceView这个组件来完成..为什么?因为像视频和SD图形等都需要迅速的更新...如果这个更新实在主线程内去完成,那么显然是不合理的,因为一个视频的播放,系统会首先确定视频的格式

MediaPlayer+surfaceView实现视频播放器

最近项目中要用到视频播放器,就先写了个Demo,在写的过程中遇到些问题,来和大家分享一下: 1.Demo是基于Android电视的,因此与Android手机有点区别,但问题不大 2.MediaPlayer有个Bug,当视频播放完后getDuration(获取视频总时间)和getCurrentPosition(获取视频当前播放时间)方法获取到的数字不一样,相差300ms左右,如果单纯的播放不受影响,但是如果需要显示播放进度或播放时间就会有点小麻烦,暂时还没找到好的方法,只能在视频播放结束时处理时间

MediaPlayer SurfaceView 视频播放

AndroidManifest.xml <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.pengdl.video_mediaplayer" > <uses-sdk android:minSd

视频播放-VideoVIew,Vitamio

播放视频文件其实并不比播放音频文件复杂,主要是使用 VideoView类来实现的.这个类将视频的显示和控制集于一身,使得我们仅仅借助它就可以完成一个简易的视频播放器.VideoView的用法和 MediaPlayer 也比较类似(不同点在于播放视频需要UI控件,播放音乐只需要借助MediaPlayer对象) VideoView,用于播放一段视频媒体,它继承了SurfaceView,位于"android.widget.VideoView",是一个视频控件. 常用监听: setOnComp

Android视图SurfaceView的实现原理分析

附:Android控件TextView的实现原理分析 来源:http://blog.csdn.net/luoshengyang/article/details/8661317 在Android系统中,有一种特殊的视图,称为SurfaceView,它拥有独立的绘图表面,即它不与其宿主窗口共享同一个绘图表面.由于拥有独立的绘图表面,因此SurfaceView的UI就可以在一个独立的线程中进行绘制.又由于不会占用主线程资源,SurfaceView一方面可以实现复杂而高效的UI,另一方面又不会导致用户输