VideoStatusActivity.java 8.39 KB
package com.cnlive.demo.video;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import com.cnlive.libs.video.video.VideoStatusUtil;
import com.cnlive.libs.video.video.VideoView;
import com.cnlive.libs.video.video.base.IDataSource;
import com.cnlive.libs.video.video.base.IMediaPlayer;
import com.cnlive.libs.video.video.base.IVideoStatus;

/**
 * Created by gujun on 2017/3/1.
 */

public class VideoStatusActivity extends Activity implements View.OnClickListener {
    private VideoView videoView;

    private Button playBtn;
    private View statusView;
    private TextView statusViewText;
    private Button statusRetry;

    //记录当前视频播放状态
    private boolean isPlay = false;
    //记录当前视频是否能播
    private boolean canPlay = true;

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

        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 (canPlay) {
                setPlayState(true);
                isPlay = true;
            } else {
                setPlayState(false);
                isPlay = false;
            }

        }
    };

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

    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) {

            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("开始");
        }
    };

    private IVideoStatus.VideoStatusCallback mOnVideoStatusCallback = new IVideoStatus.VideoStatusCallback() {
        @Override
        public void onSuccess(int status) {
            switch (status) {
                case IVideoStatus.MEDIA_STATUS_LIVING:
                    //直播中'
                    canPlay = true;
                    if (videoView != null)
                        videoView.reload();
                    setStatusViewVisible(false, "", false);
                    Toast.makeText(VideoStatusActivity.this, "直播中", Toast.LENGTH_LONG).show();
                    break;
                case IVideoStatus.MEDIA_STATUS_LEAVE:
                    //主播暂时离开
                    canPlay = false;
                    if (videoView != null)
                        videoView.stop();
                    setStatusViewVisible(true, "主播暂时离开", false);
                    Toast.makeText(VideoStatusActivity.this, "主播暂时离开", Toast.LENGTH_LONG).show();
                    break;
                case IVideoStatus.MEDIA_STATUS_END:
                    //直播结束
                    canPlay = false;
                    if (videoView != null)
                        videoView.stop();
                    setStatusViewVisible(true, "直播已经结束", false);
                    Toast.makeText(VideoStatusActivity.this, "直播结束", Toast.LENGTH_LONG).show();
                    break;
            }

        }

        @Override
        public void onError() {
            //需求1.连接直播状态异常时,用户可以重连
            // 此时停止播放器
            canPlay = false;
            if (videoView != null)
                videoView.stop();
            setStatusViewVisible(true, "获取直播状态异常,请点击重试", true);
            Toast.makeText(VideoStatusActivity.this, "获取直播状态异常", Toast.LENGTH_LONG).show();
            //此时展示错误提示页,添加重试功能 重试按钮点击时可调用
            //VideoStatusUtil.retryObtainVideoStatus()

            //需求2.连接直播状态异常时,用户不操作重连,交给播放器自己处理能否播放
            //如果不能播放会执行播放器的OnErrorListener
        }
    };

    private void setStatusViewVisible(boolean show, String warnText, boolean showRetry) {
        statusView.setVisibility(show ? View.VISIBLE : View.GONE);
        statusRetry.setVisibility(showRetry ? View.VISIBLE : View.GONE);
        statusViewText.setText(warnText);
    }

    @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();
        VideoStatusUtil.quit();
    }

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

        statusView = findViewById(R.id.statusView);
        statusViewText = (TextView) findViewById(R.id.statusViewText);
        statusRetry = (Button) findViewById(R.id.retry);
        statusRetry.setOnClickListener(this);

        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);
        VideoStatusUtil.setOnVideoPlayStatusCallback(mOnVideoStatusCallback);

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

        startPlay();
    }

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

    private void startPlay() {
        VideoStatusUtil.init("androidtest");
        videoView.setDataSource(new IDataSource() {
            @Override
            public String getDataSourceId() {
                return "androidtest";
            }

            @Override
            public String getDataSourceType() {
                return "live";
            }

            @Override
            public String getDataSourceRate() {
                return "2";
            }
        });
    }

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