观看点播准备

  1. 注册微吼开发者账号

  2. 创建应用 获取AppID

  3. 设置应用包名、签名

  4. 获取 点播ID recordId

    可以通过 【控制台上传】 或 【测试工具】或【API】获得

  5. 获取包含点播权限的access_token

    可以通过 【测试工具】 或 【API】 获得

工程配置

在开始使用sdk之前,我们要配置好IDE和创建基础的工程代码。相关内容在【工程配置】中有详细说明。

时序图

注:已知点播ID的情况下虚线框部分无需请求。

播放器渲染View--VodPlayerView

1 构造方法

/**
 * 获取View的布局方式,需要现在XML中定义
 */
mSurfaceView = this.findViewById(R.id.surfaceview);
/**
 * XML中定义,代码展示
 */
<com.vhall.player.vod.VodPlayerView
	android:id="@+id/surfaceview"
	android:layout_width="match_parent"
	android:layout_height="match_parent"/>

2 方法说明

    /**
     * 设置水印
     *
     * @param drawable
     */
    public void setWaterMark(Drawable drawable){}
    /**
     * 设置水印的相对位置
     *
     * @param gravity Gravity.LEFT
     */
	 public void setWaterMarkGravity(int gravity) {}
    /**
     * 获取截图
     * @return
     */
    public Bitmap getBitmap() {}
	/**
	* 设置清晰度
	* Constants.VideoMode.DRAW_MODE_NONE  默认,铺满全屏
	* Constants.VideoMode.DRAW_MODE_ASPECTFIT    等比缩放居中;
	* Constants.VideoMode.DRAW_MODE_ASPECTFILL   等比拉伸居中;
	*/
	public void setDrawMode(int mode){}

对接流程

1.1 创建 VHVodPlayer

VHVodPlayer 是SDK中负责点播的模块,需要传入上下文,和视频渲染的View,也就是播放画面的View,SDK使用的是系统自带的SurfaceView或者VodPlayerView,将创建的Surface的实例传入VHVodPlayer即可创建。

/**
 * 获取View的布局方式,需要现在XML中定义
 * @Param Context 上下文
 * @Param SurfaceView surfaceView的实例
 */
VHVodPlayer mPlayer = new VHVodPlayer(this);
mPlayer.setDisplay(mSurfaceView);

/**
 * 添加监听事件
 * 具体参考本文 事件监听
 */
mPlayer.setListener(new MyPlayer());

2 创建 VHDocument (如果没有文档可以忽略)

如果需要文档服务,请参考文档 【OPS-SDK集成

3 开始观看

 /**
 * 观看录播,传递在观看点播时配置的recordId (点播ID)和AccessToken;
 * @param String recordId ; // 点播ID   通过 API 调用获取
 * @param String accessToken; // 发起的Token  通过 API 调用获取
 */
public void start(String recordId  , String accessToken);

4 设置观看清晰度

从 IVHLivePlayer.EVENT_DPI_LIST 获取当前地址可用的分辨率,确定可用的情况下在切换

清晰度 描述
IVHLivePlayer.DPI_SD 低清
IVHLivePlayer.DPI_HD 高清
IVHLivePlayer.DPI_XHD 超清
IVHLivePlayer.DPI_AUDIO 纯音频
IVHLivePlayer.DPI_SAME 原画
/**
 * 在设置清晰度时,需要先获取当前的视频可用的分辨率,确认可用的时在调用。
 * @param int dpi 定义的清晰度
 */
public void.setDPI(dpi);

5 暂停观看/ 恢复观看

停止拉流,而云端的视频源还在不断地更新着 , 当重新恢复时,会从最新的时间点播放

/**
 * 暂停观看/ 恢复观看
 */
public void pause();
public void resume();

6 控制播放相关API

/**
 * 获取观看时长 (毫秒)
 */
public long getDuration();
/**
 * 获取当前进度 (毫秒)
 */
public long getPosition();
/**
 * Seek操作,通常配合SeekBai进行操作,
 * @param position 跳转到position的位置播放
 */
public void seek(long position); 

7 结束观看

/**
 * 结束观看
 */
public void stop();

8 销毁

销毁播放器的实例

/**
 * 销毁播放器并释放相关的资源。
 */
public void release();

事件处理

事件监听 描述
VHVodPlayer.EVENT_STATUS_STARTING 正在运行
VHVodPlayer.EVENT_STATUS_STARTED 开始播放
VHVodPlayer.EVENT_STATUS_STOPED 停止播放
VHVodPlayer.EVENT_STATUS_END 播放结束
VHVodPlayer.EVENT_VIDEO_SIZE_CHANGED 视频的宽高发生改变
IVHLivePlayer.EVENT_DPI_LIST 可以的清晰度
IVHLivePlayer.EVENT_DPI_CHANGED 清晰度发生改变
class MyPlayer implements VHPlayerListener {
        @Override
        public void onEvent(int event, String msg) {
            switch (event) {
                case VHVodPlayer.EVENT_STATUS_STARTING:
                    break;
                case VHVodPlayer.EVENT_STATUS_STARTED:
                    break;
                case VHVodPlayer.EVENT_STATUS_STOPED:
                    break;
                case VHVodPlayer.EVENT_STATUS_END:
                    break;
                case VHVodPlayer.EVENT_STATUS_WH:
                    break;
            }
        }

        @Override
        public void onError(int errorCode, String msg) {
        }
    }

示例代码:

public class VodPlayerActivity extends Activity {
    private static final String TAG = "LivePlayerActivity";
    private String roomId = "7a97e8c7";
    private String accessToken = "vhall";
    private SurfaceView mSurfaceView;
    private VHVodPlayer mPlayer;
    private boolean mPlaying = false;
    ImageView mPlayBtn;
    ProgressBar mLoadingPB;
    SeekBar mSeekbar;
    TextView mPosView, mMaxView;

    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if (mPlaying) {
                int pos = (int) mPlayer.getPosition();
                mSeekbar.setProgress(pos);
                mPosView.setText(String.valueOf(pos));
            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        roomId = getIntent().getStringExtra("roomid");
        accessToken = getIntent().getStringExtra("token");
        setContentView(R.layout.vod_layout);
        mPlayBtn = (ImageView) this.findViewById(R.id.btn_play);
        mLoadingPB = (ProgressBar) this.findViewById(R.id.pb_loading);
        mSeekbar = (SeekBar) this.findViewById(R.id.seekbar);
        mSurfaceView = (SurfaceView) this.findViewById(R.id.surfaceview);
        mPosView = (TextView) this.findViewById(R.id.tv_pos);
        mMaxView = (TextView) this.findViewById(R.id.tv_max);
        mPlayer = new VHVodPlayer(this, mSurfaceView);
        mPlayer.addListener(new MyPlayer());
        mSeekbar.setOnSeekBarChangeListener(new MySeekbarListener());
        handlePosition();
    }

    @Override
    protected void onPause() {
        super.onPause();
        if (mPlayer != null && mPlaying)
            mPlayer.pause();
    }

    @Override
    protected void onResume() {
        super.onResume();
        if (mPlayer != null && mPlayer.resumeAble()) {
            mPlayer.resume();
        }
    }


    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (mPlayer != null)
            mPlayer.release();
        if (timer != null) {
            timer.cancel();
            timer = null;
        }
    }

    public void play(View view) {
        if (mPlaying) {
            mPlayer.pause();
        } else {
            if (mPlayer.resumeAble())
                mPlayer.resume();
            else
                mPlayer.start(roomId, accessToken);
        }
    }

    class MyPlayer implements VHPlayerListener {

        @Override
        public void onEvent(int event, String msg) {
            switch (event) {
                case VHVodPlayer.EVENT_STATUS_STARTING:
                    mLoadingPB.setVisibility(View.VISIBLE);
                    break;
                case VHVodPlayer.EVENT_STATUS_STARTED:
                    int max = (int) mPlayer.getDuration();
                    mSeekbar.setMax(max);
                    mMaxView.setText(String.valueOf(max));
                    mLoadingPB.setVisibility(View.GONE);
                    mPlaying = true;
                    mPlayBtn.setImageResource(R.mipmap.icon_pause_bro);
                    break;
                case VHVodPlayer.EVENT_STATUS_STOPED:
                    mPlaying = false;
                    mPlayBtn.setImageResource(R.mipmap.icon_start_bro);
                    mLoadingPB.setVisibility(View.GONE);
                    break;
                case VHVodPlayer.EVENT_STATUS_END:
                    mPlaying = false;
                    mPlayBtn.setImageResource(R.mipmap.icon_start_bro);
                    mLoadingPB.setVisibility(View.GONE);
                    break;
                case VHVodPlayer.EVENT_STATUS_WH:
                    break;
            }
        }

        @Override
        public void onError(int errorCode, String msg) {
            mPlaying = false;
            mPlayBtn.setImageResource(R.mipmap.icon_start_bro);
            mLoadingPB.setVisibility(View.GONE);
            Toast.makeText(VodPlayerActivity.this, msg, Toast.LENGTH_SHORT).show();
        }
    }

    class MySeekbarListener implements SeekBar.OnSeekBarChangeListener {

        @Override
        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
            mPosView.setText(String.valueOf(seekBar.getProgress()));
        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {

        }

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {
            mPlayer.seek(seekBar.getProgress());
        }
    }
    //每秒获取一下进度
    Timer timer;

    private void handlePosition() {
        if (timer != null)
            return;
        timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                handler.sendEmptyMessage(0);
            }
        }, 1000, 1000);
    }
}

其他相关文档

  1. 快速开始
  2. 观看点播参考手册