播放视频文件其实并不比播放音频文件复杂,主要是使用 VideoView类来实现的。

这个类将视频的显示和控制集于一身,使得我们仅仅借助它就可以完成一个简易的视频播放器。

VideoView的用法和 MediaPlayer 也比较类似(不同点在于播放视频需要UI控件,播放音乐只需要借助MediaPlayer对象)

VideoView其实就是SurfaceView的子类,内部做了封装,使用起来比较方便,但是灵活性没有SufraceView高

这里有一篇关于SurfaceView实现Android视频播放,具体见:SufraceView的用法


今天要讲的是利用Android自带的视频控件VideoView来实现视频的播放:

主XML文件如下:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
>

    <VideoView
        android:layout_width="match_parent"
        android:layout_height="300dp"
        android:id="@+id/videoView"
        />
    <Button
        android:id="@+id/button1"
        android:layout_below="@id/videoView"
        android:layout_marginTop="10dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="播放"
        />
    <Button
        android:id="@+id/button2"
        android:layout_below="@id/button1"
        android:layout_marginTop="10dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="暂停"
        />
    <Button
        android:id="@+id/button3"
        android:layout_below="@id/button2"
        android:layout_marginTop="10dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="重播"
        />
</RelativeLayout>



主Activity文件如下:

package com.dsl.androiddemo_videoview01;

import android.media.MediaPlayer;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.VideoView;

/**
 * 作者:单胜凌
 * 时间:2016.10.11
 * 功能:利用安卓自带控件VideoView实现本地视频的播放
 *
 * Android靠自学!
 */
public class MainActivity extends AppCompatActivity implements View.OnClickListener{

    private String TAG=MainActivity.class.getSimpleName();

    private VideoView videoView;
    private Button play,pause,repaly;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //初始化控件
        initView();
        videoView.setMediaController(new android.widget.MediaController(this));
        //设置视频播放路径为工程raw下的hello.mp4文件
        videoView.setVideoURI(Uri.parse("android.resource://" + getPackageName() + "/" +R.raw.hello));
        //---------------------播放状态的监听--------------------------
        videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mp) {
                Log.i(TAG,"准备完毕、可以播放");
            }
        });
        videoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                Log.i(TAG,"播放完毕!");
            }
        });
        videoView.setOnErrorListener(new MediaPlayer.OnErrorListener() {
            @Override
            public boolean onError(MediaPlayer mp, int what, int extra) {
                Log.i(TAG,"播放失败!");
                return false;
            }
        });

    }

    /**
     * 初始化控件
     */
    private void initView()
    {
        videoView=(VideoView)findViewById(R.id.videoView);
        play = (Button)findViewById(R.id.button1);
        pause = (Button)findViewById(R.id.button2);
        repaly = (Button)findViewById(R.id.button3);

        play.setOnClickListener(this);
        pause.setOnClickListener(this);
        repaly.setOnClickListener(this);
    }

    /**
     * 按钮监听
     * @param v
     */
    @Override
    public void onClick(View v) {
        switch (v.getId())
        {
            case R.id.button1:
                if(!videoView.isPlaying())
                {
                    videoView.start();//开始播放
                }
                break;

            case R.id.button2:
                if(videoView.isPlaying())
                {
                    videoView.pause();//暂停播放
                }
                break;

            case R.id.button3:
                if(videoView.isPlaying())
                {
                    videoView.pause();//先暂停
                    videoView.stopPlayback();//停止播放、释放资源
                    videoView.setVideoURI(Uri.parse("android.resource://" + getPackageName() + "/" +R.raw.hello));//重新设置资源
                    videoView.start();//开始播放、
                }
                break;
        }
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        if(videoView!=null)
            videoView.suspend();
    }
}


对于VideoView主要有一下常用用法:

VideoView,用于播放一段视频媒体,它继承了SurfaceView,位于"android.widget.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):监听视频装载完成的事件。



另外需要注意,VideoView 并不是一个万能的视频播放工具类,它在视频格式的支持以及播放效率方面都存在着较大的不足。

所以,如果想要仅仅使用 VideoView就编写出一个功能非常强大的视频播放器是不太现实的。

但是如果只是用于播放一些游戏的片头动画,或者某个应用的视频宣传,使用 VideoView 还是绰绰有余的。


以上就是本Demo全部代码。


作者:单胜凌


IT靠自学!!!



源码下载地址:https://github.com/DSLAndroid/AndroidDemo_VideoView01点击打开链接 

下载请注意:该Demo采用Android Studio开发