videoView播放视频,简易视频播放器自己写

为了满足公司需求,本文介绍了如何创建一个简单的本地视频播放器。主要利用VideoView和MediaPlayer组件,实现对本地录制视频的播放功能,无需处理视频格式和网络访问。

公司需要,需要播放本地自己录制的视频,所以对格式没有要求,也不需要访问网络视频,就写了一个简易的视频播放器。

超级简单,主要分三部分。

第一,activity,URL自己改了就行:

/**
 * 2017/5/5 9:00
 * Created by jiangchen
 * 作用:视频播放activity
 */
public class VideoPlayActivity extends Activity implements View.OnClickListener {
    private VideoView videoPlayer;              //视频播放控件
    private ImageView backBtn;                  //退出
    private ImageView playBtn;                  //播放暂停
    private ProgressBar progressPb;             //进度条
    private int currentProgress = 0;            //当前播放进度
    private boolean ifrunThread = true;         //线程开关,关了就无法开了
    private boolean ifRunTimer = true;          //线程内方法开关,可关可开

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //去掉标题栏
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        //去掉状态栏
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(R.layout.activity_video_play);
        initView();
        //设置视频源路径
        videoPlayer.setVideoPath(Environment.getExternalStorageDirectory().getAbsolutePath() +
                File.separator + "VisitInsData" + File.separator + BaseApplication.currentPath + File.separator + "video.mp4");
        //判断视频是否存在
        if (new File(Environment.getExternalStorageDirectory().getAbsolutePath() +
                File.separator + "VisitInsData" + File.separator + BaseApplication.currentPath +
                File.separator + "video.mp4").exists()) {
            //存在则播放
            videoPlayer.requestFocus();
            videoPlayer.start();

            //启动计时器
            initTimerThread();
        } else {
            //不存在则给出提示并退出
            Toast.makeText(this, "视频未录制", Toast.LENGTH_SHORT).show();
            finish();
        }
        //监听视频播放完成
        videoPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                //可能读条差一点点未读满,给他补齐
                ifRunTimer=false;
                playBtn.setImageResource(R.drawable.video_play);
                progressPb.setProgress(100);
            }
        });

    }

    private void initTimerThread() {
        new Thread() {
            @Override
            public void run() {
                super.run();
                while (ifrunThread) {
                    if (ifRunTimer) {
                        progressPb.setProgress((videoPlayer.getCurrentPosition() * 100) / videoPlayer.getDuration());
                    }
                    try {
                        sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }.start();
    }

    /**
     * 2017/5/5 8:50
     * Created by jiangchen
     * 作用:初始化控件,监听事件
     */
    private void initView() {
        videoPlayer = (VideoView) findViewById(R.id.video_player);
        backBtn = (ImageView) findViewById(R.id.back_btn);
        playBtn = (ImageView) findViewById(R.id.play_btn);
        progressPb = (ProgressBar) findViewById(R.id.progress_pb);
        progressPb.setMax(100);
        backBtn.setOnClickListener(this);
        playBtn.setOnClickListener(this);
    }

    @Override
    protected void onResume() {
        super.onResume();
        stopPlayVideo();
    }

    @Override
    protected void onStop() {
        super.onStop();
        if (videoPlayer.isPlaying()) {
            stopPlayVideo();
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        ifrunThread = false;
    }

    /**
     * 2017/5/5 8:51
     * Created by jiangchen
     * 作用:暂停视频
     */
    private void stopPlayVideo() {
        videoPlayer.pause();
        playBtn.setImageResource(R.drawable.video_play);
        currentProgress = videoPlayer.getCurrentPosition();
        ifRunTimer = false;
    }

    /**
     * 2017/5/5 8:51
     * Created by jiangchen
     * 作用:按照原来暂停时进度播放视频
     */
    private void restartPlayVideo() {
        videoPlayer.start();
        videoPlayer.seekTo(currentProgress);
        playBtn.setImageResource(R.drawable.video_pause);
        currentProgress = 0;
        ifRunTimer = true;
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            //返回
            case R.id.back_btn:
                finish();
                break;
            //播放,暂停
            case R.id.play_btn:
                if (videoPlayer.isPlaying()) {
                    stopPlayVideo();
                } else {
                    restartPlayVideo();
                }
                break;
        }
    }
}
第二部分,布局,需要自己改掉小图标:


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

    <VideoView
        android:id="@+id/video_player"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="center_horizontal" />

    <ImageView
        android:id="@+id/back_btn"
        android:layout_width="30dp"
        android:layout_height="30dp"
        android:layout_margin="10dp"
        android:src="@mipmap/return_video" />

    <ImageView
        android:id="@+id/play_btn"
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:layout_gravity="bottom"
        android:layout_margin="10dp"
        android:src="@drawable/video_play" />

    <ProgressBar
        android:id="@+id/progress_pb"
        style="@style/Base.Widget.AppCompat.ProgressBar.Horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"
        android:layout_marginBottom="20dp"
        android:layout_marginLeft="60dp"
        android:layout_marginRight="60dp"
        android:scrollbarStyle="insideInset" />


</FrameLayout>
第三部分,manifest,注册,锁死横屏:

<activity
    android:name=".visitinspection.VideoPlayActivity"
    android:configChanges="layoutDirection|screenSize|screenLayout|keyboard|keyboardHidden"
    android:screenOrientation="landscape" />
好啦,简单的就这样完成了,还有一些小BUG,或者说是灵异事件有待你们自己发掘,哈哈~~~


评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值