VideoStatusActivity.java 10.9 KB
package com.cnlive.demo.videoqn;

import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import com.cnlive.demo.videoqn.model.ProgramLive;
import com.cnlive.demo.videoqn.widget.MediaController;
import com.cnlive.libs.lib_cnvideo.base.IAVOptions;
import com.cnlive.libs.lib_cnvideo.base.IMediaPlayer;
import com.cnlive.libs.lib_cnvideo.base.IVideoStatus;
import com.cnlive.libs.lib_cnvideo.base.IVideoView;
import com.cnlive.libs.lib_cnvideo.player.AVOptions;
import com.cnlive.libs.lib_cnvideo.player.VideoStatusUtil;
import com.cnlive.libs.lib_cnvideo.player.widget.CNVideoView;

/**
 * Created by Lynn on 4/7/2017.
 */

public class VideoStatusActivity extends VideoPlayerBaseActivity implements View.OnClickListener {

    private static final String TAG = "VideoStatusActivity";

    private static final int MESSAGE_ID_RECONNECTING = 0x01;

    private MediaController mMediaController;
    private CNVideoView mVideoView;
    private Button playBtn;
    private View statusView;
    private TextView statusViewText;
    private Toast mToast = null;
    private String mVideoPath = null;
    private int mDisplayAspectRatio = CNVideoView.ASPECT_RATIO_FIT_PARENT;
    private boolean mIsActivityPaused = true;

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

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_videoview_status);
        mVideoView = (CNVideoView) findViewById(R.id.videoview);
        playBtn = (Button) findViewById(R.id.playerPlayPause);
        playBtn.setOnClickListener(this);

        statusView = findViewById(R.id.statusView);
        statusViewText = (TextView) findViewById(R.id.statusViewText);
        mVideoPath = getIntent().getStringExtra("videoPath");

        AVOptions options = new AVOptions();

        int isLiveStreaming = getIntent().getIntExtra("liveStreaming", 1);
        // 准备超时时间,包括创建资源、建立连接、请求码流等,单位是 ms
        // 默认值是:无
        options.setInteger(IAVOptions.KEY_PREPARE_TIMEOUT, 10 * 1000);
        // 读取视频流超时时间,单位是 ms
        // 默认值是:10 * 1000
        options.setInteger(IAVOptions.KEY_GET_AV_FRAME_TIMEOUT, 10 * 1000);
        // 当前播放的是否为在线直播,如果是,则底层会有一些播放优化
        // 默认值是:0
        options.setInteger(IAVOptions.KEY_LIVE_STREAMING, isLiveStreaming);
        if (isLiveStreaming == 1) {
            // 是否开启"延时优化",只在在线直播流中有效
            // 默认值是:0
            options.setInteger(IAVOptions.KEY_DELAY_OPTIMIZATION, 1);
        }
        int codec = getIntent().getIntExtra("mediaCodec", 0);
        // 解码方式,codec=1,硬解; codec=0, 软解
        // 默认值是:0
        options.setInteger(IAVOptions.KEY_MEDIACODEC, codec);
        // 是否自动启动播放,如果设置为 1,则在调用 `prepareAsync` 或者 `setVideoPath` 之后自动启动播放,无需调用 `start()`
        // 默认值是:1
        options.setInteger(IAVOptions.KEY_START_ON_PREPARED, 0);
        mVideoView.setAVOptions(options);

        // Set some listeners
        mVideoView.setOnPreparedListener(onPreparedListener);
        mVideoView.setOnInfoListener(mOnInfoListener);
        mVideoView.setOnVideoSizeChangedListener(mOnVideoSizeChangedListener);
        mVideoView.setOnBufferingUpdateListener(mOnBufferingUpdateListener);
        mVideoView.setOnCompletionListener(mOnCompletionListener);
        mVideoView.setOnSeekCompleteListener(mOnSeekCompleteListener);
        mVideoView.setOnErrorListener(mOnErrorListener);
        VideoStatusUtil.setOnVideoPlayStatusCallback(mOnVideoStatusCallback);

        //播放普通视频
//        mVideoView.setVideoPath(mVideoPath);

        // You can also use a custom `MediaController` widget
        mMediaController = new MediaController(this, false, isLiveStreaming == 1);
        mVideoView.setMediaController(mMediaController);

        mVideoView.setKeepScreenOn(true);

        startPlay();
    }

    private void startPlay() {
        VideoStatusUtil.init("androidtest");
        mVideoView.setDataSource(new ProgramLive(), false);
    }

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

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

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mVideoView.stopPlayback();
        VideoStatusUtil.quit();
    }

    public void onClickSwitchScreen(View v) {
        mDisplayAspectRatio = (mDisplayAspectRatio + 1) % 5;
        mVideoView.setDisplayAspectRatio(mDisplayAspectRatio);
        switch (mVideoView.getDisplayAspectRatio()) {
            case IVideoView.ASPECT_RATIO_ORIGIN:
                showToastTips("Origin mode");
                break;
            case IVideoView.ASPECT_RATIO_FIT_PARENT:
                showToastTips("Fit parent !");
                break;
            case IVideoView.ASPECT_RATIO_PAVED_PARENT:
                showToastTips("Paved parent !");
                break;
            case IVideoView.ASPECT_RATIO_16_9:
                showToastTips("16 : 9 !");
                break;
            case IVideoView.ASPECT_RATIO_4_3:
                showToastTips("4 : 3 !");
                break;
            default:
                break;
        }
    }

    private IMediaPlayer.OnPreparedListener onPreparedListener = new IMediaPlayer.OnPreparedListener() {
        @Override
        public void onPrepared(IMediaPlayer mp) {
            Log.e("DemoView", "prepared");
            if (canPlay) {
                setPlayState(true);
                isPlay = true;
            }
        }
    };

    private IMediaPlayer.OnInfoListener mOnInfoListener = new IMediaPlayer.OnInfoListener() {
        @Override
        public boolean onInfo(IMediaPlayer plMediaPlayer, int what, int extra) {
            Log.d(TAG, "onInfo: " + what + ", " + extra);
            return false;
        }
    };

    private IMediaPlayer.OnErrorListener mOnErrorListener = new IMediaPlayer.OnErrorListener() {
        @Override
        public boolean onError(IMediaPlayer plMediaPlayer, int errorCode) {
            Log.e(TAG, "Error happened, errorCode = " + errorCode);
            // Return true means the error has been handled
            // If return false, then `onCompletion` will be called
            return false;
        }
    };

    private IMediaPlayer.OnCompletionListener mOnCompletionListener = new IMediaPlayer.OnCompletionListener() {
        @Override
        public void onCompletion(IMediaPlayer plMediaPlayer) {
            Log.d(TAG, "Play Completed !");
            showToastTips("Play Completed !");
//            finish();
            isPlay = false;

        }
    };

    private IMediaPlayer.OnBufferingUpdateListener mOnBufferingUpdateListener = new IMediaPlayer.OnBufferingUpdateListener() {
        @Override
        public void onBufferingUpdate(IMediaPlayer plMediaPlayer, int precent) {
            Log.d(TAG, "onBufferingUpdate: " + precent);
        }
    };

    private IMediaPlayer.OnSeekCompleteListener mOnSeekCompleteListener = new IMediaPlayer.OnSeekCompleteListener() {
        @Override
        public void onSeekComplete(IMediaPlayer plMediaPlayer) {
            Log.d(TAG, "onSeekComplete !");
        }
    };

    private IMediaPlayer.OnVideoSizeChangedListener mOnVideoSizeChangedListener = new IMediaPlayer.OnVideoSizeChangedListener() {
        @Override
        public void onVideoSizeChanged(IMediaPlayer iMediaPlayer, int i, int i1, int i2, int i3) {
            Log.d(TAG, "onVideoSizeChanged: " + i + "," + i1 + "," + i2 + "," + i3);
        }
    };

    private void showToastTips(final String tips) {
        if (mIsActivityPaused) {
            return;
        }
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                if (mToast != null) {
                    mToast.cancel();
                }
                mToast = Toast.makeText(VideoStatusActivity.this, tips, Toast.LENGTH_SHORT);
                mToast.show();
            }
        });
    }

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

        }

        @Override
        public void onError(int what, String extra) {
            Log.e(TAG, "onError: " + what + "_" + extra);
//            Toast.makeText(VideoStatusActivity.this, "onError: " + what + "_" + extra, Toast.LENGTH_LONG).show();
        }
    };

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

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

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

    }
}