使用 VideoView播放视频
前言
之前有讲过如何使用SurfaceView配合MediaPlayer播放视频,其实Android还为开发人员提供了另外一种更简单的播放视频媒体的方式,那就是VideoView,本篇博客就来讲讲VideoView如何播放视频,最后将以一个简单的Demo演示。
本篇博客的主要内容如下:
VideoView,用于播放一段视频媒体,它继承了SurfaceView,位于"android.widget.VideoView",是一个视频控件。
既然是播放一段视频,那么不可避免的要涉及到一些开始、暂停、停止等操作,VideoView也为开发人员提供了对应的方法,这里简单介绍一些常用的:
- int getCurrentPosition():获取当前播放的位置。
- int getDuration():获取当前播放视频的总长度。
- isPlaying():当前VideoView是否在播放视频。
- void pause():暂停
- void seekTo(int msec):从第几毫秒开始播放。
- void resume():重新播放。
- void setVideoPath(String path):以文件路径的方式设置VideoView播放的视频源。
- void setVideoURI(Uri uri):以Uri的方式设置VideoView播放的视频源,可以是网络Uri或本地Uri。
- void start():开始播放。
- void stopPlayback():停止播放。
- setMediaController(MediaController controller):设置MediaController控制器。
- setOnCompletionListener(MediaPlayer.onCompletionListener l):监听播放完成的事件。
- setOnErrorListener(MediaPlayer.OnErrorListener l):监听播放发生错误时候的事件。
- setOnPreparedListener(MediaPlayer.OnPreparedListener l)::监听视频装载完成的事件。
上面的一些方法通过方法名就可以了解用途。和MediaPlayer配合SurfaceView播放视频不同,VideoView播放之前无需编码装载视频,它会在start()开始播放的时候自动装载视频。并且VideoView在使用完之后,无需编码回收资源。
VideoView其实没有什么难点,通过它自带的API方法,即可完成一段视频的播放,无非就是注意它方法的调用时机即可。下面通过一个简单的Demo,演示VideoView如何播放一段SD卡上的视频文件。在Demo中提供了四个Button,分别表示播放、暂停、重播、停止,并配合进度条显示。代码注释比较完整,细节部分这里不再累述。
布局代码:activity_videoview.xml
1 <?xml version="1.0" encoding="utf-8"?>
2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 android:layout_width="match_parent"
4 android:layout_height="match_parent"
5 android:orientation="vertical" >
6
7 <EditText
8 android:id="@+id/et_path"
9 android:layout_width="match_parent"
10 android:layout_height="wrap_content"
11 android:text="/sdcard/ykzzldx.mp4" />
12
13 <SeekBar
14 android:id="@+id/seekBar"
15 android:layout_width="match_parent"
16 android:layout_height="wrap_content" />
17
18 <LinearLayout
19 android:layout_width="wrap_content"
20 android:layout_height="wrap_content"
21 android:orientation="horizontal" >
22
23 <Button
24 android:id="@+id/btn_play"
25 android:layout_width="0dip"
26 android:layout_height="wrap_content"
27 android:layout_weight="1"
28 android:text="播放" />
29
30 <Button
31 android:id="@+id/btn_pause"
32 android:layout_width="0dip"
33 android:layout_height="wrap_content"
34 android:layout_weight="1"
35 android:text="暂停" />
36
37 <Button
38 android:id="@+id/btn_replay"
39 android:layout_width="0dip"
40 android:layout_height="wrap_content"
41 android:layout_weight="1"
42 android:text="重播" />
43
44 <Button
45 android:id="@+id/btn_stop"
46 android:layout_width="0dip"
47 android:layout_height="wrap_content"
48 android:layout_weight="1"
49 android:text="停止" />
50 </LinearLayout>
51
52 <VideoView
53 android:id="@+id/vv_videoview"
54 android:layout_width="fill_parent"
55 android:layout_height="fill_parent" />
56
57 </LinearLayout>
实现代码:VideoViewActivity.java
1 package cn.bgxt.videoviewdemo;
2
3 import java.io.File;
4
5 import android.app.Activity;
6 import android.media.MediaPlayer;
7 import android.media.MediaPlayer.OnCompletionListener;
8 import android.media.MediaPlayer.OnErrorListener;
9 import android.os.Bundle;
10 import android.util.Log;
11 import android.view.View;
12 import android.widget.Button;
13 import android.widget.EditText;
14 import android.widget.SeekBar;
15 import android.widget.Toast;
16 import android.widget.VideoView;
17 import android.widget.SeekBar.OnSeekBarChangeListener;
18
19 public class VideoViewActivity extends Activity {
20 private final String TAG = "main";
21 private EditText et_path;
22 private Button btn_play, btn_pause, btn_replay, btn_stop;
23 private SeekBar seekBar;
24 private VideoView vv_video;
25 private boolean isPlaying;
26
27 @Override
28 protected void onCreate(Bundle savedInstanceState) {
29 // TODO Auto-generated method stub
30 super.onCreate(savedInstanceState);
31 setContentView(R.layout.activity_videoview);
32
33 seekBar = (SeekBar) findViewById(R.id.seekBar);
34 et_path = (EditText) findViewById(R.id.et_path);
35 vv_video = (VideoView) findViewById(R.id.vv_videoview);
36
37 btn_play = (Button) findViewById(R.id.btn_play);
38 btn_pause = (Button) findViewById(R.id.btn_pause);
39 btn_replay = (Button) findViewById(R.id.btn_replay);
40 btn_stop = (Button) findViewById(R.id.btn_stop);
41
42 btn_play.setOnClickListener(click);
43 btn_pause.setOnClickListener(click);
44 btn_replay.setOnClickListener(click);
45 btn_stop.setOnClickListener(click);
46
47 // 为进度条添加进度更改事件
48 seekBar.setOnSeekBarChangeListener(change);
49 }
50
51 private OnSeekBarChangeListener change = new OnSeekBarChangeListener() {
52
53 @Override
54 public void onStopTrackingTouch(SeekBar seekBar) {
55 // 当进度条停止修改的时候触发
56 // 取得当前进度条的刻度
57 int progress = seekBar.getProgress();
58 if (vv_video != null && vv_video.isPlaying()) {
59 // 设置当前播放的位置
60 vv_video.seekTo(progress);
61 }
62 }
63
64 @Override
65 public void onStartTrackingTouch(SeekBar seekBar) {
66
67 }
68
69 @Override
70 public void onProgressChanged(SeekBar seekBar, int progress,
71 boolean fromUser) {
72
73 }
74 };
75 private View.OnClickListener click = new View.OnClickListener() {
76
77 @Override
78 public void onClick(View v) {
79
80 switch (v.getId()) {
81 case R.id.btn_play:
82 play(0);
83 break;
84 case R.id.btn_pause:
85 pause();
86 break;
87 case R.id.btn_replay:
88 replay();
89 break;
90 case R.id.btn_stop:
91 stop();
92 break;
93 default:
94 break;
95 }
96 }
97 };
98
99 protected
