VideoActivity.java 7.94 KB
package com.cnlive.demo.video.cache;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.SeekBar;
import android.widget.TextView;

import com.cnlive.demo.video.R;
import com.cnlive.demo.video.util.Strings;
import com.cnlive.libs.video.video.VideoView;
import com.cnlive.libs.video.video.base.IMediaPlayer;

/**
 * Created by gujun on 2017/10/23.
 */

public class VideoActivity extends AppCompatActivity implements View.OnClickListener {
    private static final String TAG = "VideoActivity";

    //更新controller相关
    private static final int UPDATE_CONTROLLER = 1;
    private static final int UPDATE_CONTROLLER_DELAYED = 1000;

    private VideoView videoView;

    private Button playBtn;
    private TextView timeText;
    private SeekBar seekBar;

    //记录当前视频播放状态
    private boolean isPlay = false;
    //当前播放进度,进度条使用
    private int mVideoProgress = 0;

    //播放地址
    protected String playerUrl;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_cache_video);

        initView();
    }

    private IMediaPlayer.OnBufferingUpdateListener mOnBufferingUpdateListener = new IMediaPlayer.OnBufferingUpdateListener() {

        @Override
        public void onBufferingUpdate(IMediaPlayer iMediaPlayer, int percent) {
        }
    };

    private IMediaPlayer.OnPreparedListener mOnPrepareListener = new IMediaPlayer.OnPreparedListener() {
        @Override
        public void onPrepared(IMediaPlayer iMediaPlayer) {
            if (!iMediaPlayer.getPlayState()) {
                setPlayState(true);
                isPlay = true;
                setVideoProgress(0);
            }

        }
    };

    private IMediaPlayer.OnCompletionListener mOnCompletionListener = new IMediaPlayer.OnCompletionListener() {
        @Override
        public void onCompletion(IMediaPlayer iMediaPlayer) {
            isPlay = false;
            if (playBtn != null) playBtn.setText("开始");
            finish();
        }
    };

    private IMediaPlayer.OnInfoListener mOnInfoListener = new IMediaPlayer.OnInfoListener() {
        @Override
        public boolean onInfo(IMediaPlayer iMediaPlayer, int what, int extra) {

            return false;
        }
    };

    private IMediaPlayer.OnErrorListener mOnErrorListener = new IMediaPlayer.OnErrorListener() {
        @Override
        public boolean onError(IMediaPlayer mp, int what, int extra) {
            Log.e(TAG, "onError: " + what + ",," + extra);
            finish();
            return false;
        }
    };

    private IMediaPlayer.OnSeekCompleteListener mOnSeekCompleteListener = new IMediaPlayer.OnSeekCompleteListener() {
        @Override
        public void onSeekComplete(IMediaPlayer iMediaPlayer) {

        }
    };

    private IMediaPlayer.OnVideoSizeChangedListener mOnVideoSizeChangedListener = new IMediaPlayer.OnVideoSizeChangedListener() {
        @Override
        public void onVideoSizeChanged(IMediaPlayer mp, int width, int height, int sarNum, int sarDen) {

        }
    };

    private IMediaPlayer.OnPlayStateListener mOnPlayStateListener = new IMediaPlayer.OnPlayStateListener() {
        @Override
        public void onPlayState(boolean isPlay) {
            if (isPlay) playBtn.setText("暂停");
            else playBtn.setText("开始");
        }
    };

    @Override
    protected void onPause() {
        super.onPause();
        if (videoView != null && videoView.isPlaying()) {
            setPlayState(false);
        }
    }

    @Override
    protected void onResume() {
        super.onResume();
        if (videoView != null && !videoView.isPlaying() && isPlay) {
            setPlayState(true);
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        videoView.release();
        cancelUpdateTimer();
    }

    private void initView() {
        playBtn = (Button) findViewById(R.id.playBtn);
        playBtn.setOnClickListener(this);

        timeText = (TextView) findViewById(R.id.time);

        seekBar = (SeekBar) findViewById(R.id.seekBar);
        seekBar.setOnSeekBarChangeListener(onSeekBarChangeListener);

        videoView = (VideoView) findViewById(R.id.videoview);
        videoView.setOnBufferingUpdateListener(mOnBufferingUpdateListener);
        videoView.setOnCompletionListener(mOnCompletionListener);
        videoView.setOnPreparedListener(mOnPrepareListener);
        videoView.setOnInfoListener(mOnInfoListener);
        videoView.setOnErrorListener(mOnErrorListener);
        videoView.setOnSeekCompleteListener(mOnSeekCompleteListener);
        videoView.setOnVideoSizeChangedListener(mOnVideoSizeChangedListener);
        videoView.setOnPlayStateListener(mOnPlayStateListener);

        videoView.setVideoScalingMode(IMediaPlayer.VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING);
        videoView.setKeepScreenOn(true);

    }

    private void setPlayState(boolean isPlay) {
        if (isPlay) videoView.start();
        else videoView.pause();
    }

    protected void startPlay() {
        videoView.setDataSource(playerUrl);
    }

    protected void setVideoSecondaryProgress(int secondaryProgress) {
        seekBar.setSecondaryProgress(secondaryProgress);
    }

    public int setVideoProgress(long currentProgress) {
        if (videoView == null)
            return -1;

        long time = currentProgress > 0 ? currentProgress : videoView.getCurrentPosition();
        long length = videoView.getDuration();

        int curProgress = length == 0 ? 0 : (int) (time * 100 / length);
        if (curProgress > 100)
            curProgress = 100;
        seekBar.setProgress(curProgress);

        if (time >= 0) {
            String progress = Strings.millisToString(time) + "/" + Strings.millisToString(length);
            timeText.setText(progress);
        }

        Message msg = new Message();
        msg.what = UPDATE_CONTROLLER;

        if (mHandler != null)
            mHandler.sendMessageDelayed(msg, UPDATE_CONTROLLER_DELAYED);
        return (int) time;
    }


    //开始更新controller 定时器
    public void startUpdateTimer(long startTime) {
        //只有点播才有更新进度条
        if (mHandler != null) {
            cancelUpdateTimer();
            mHandler.sendEmptyMessageDelayed(UPDATE_CONTROLLER, startTime);
        }
    }

    //取消更新controller定时器
    public void cancelUpdateTimer() {
        if (mHandler != null && mHandler.hasMessages(UPDATE_CONTROLLER))
            mHandler.removeMessages(UPDATE_CONTROLLER);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.playBtn:
                if (videoView != null) {
                    isPlay = !isPlay;
                    setPlayState(isPlay);
                }
                break;
        }
    }

    private Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
                case UPDATE_CONTROLLER:
                    setVideoProgress(0);
                    startUpdateTimer(UPDATE_CONTROLLER_DELAYED);
                    break;
            }

        }
    };

    private SeekBar.OnSeekBarChangeListener onSeekBarChangeListener = new SeekBar.OnSeekBarChangeListener() {
        @Override
        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
            if (fromUser) {
                mVideoProgress = progress;
            }
        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {

        }

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {
            videoView.seekTo(mVideoProgress * videoView.getDuration() / 100);
            setVideoProgress(mVideoProgress);
        }
    };
}