Skip to content

Latest commit

 

History

History
198 lines (175 loc) · 8.56 KB

29.视频播放器埋点监听.md

File metadata and controls

198 lines (175 loc) · 8.56 KB

29.视频播放器埋点监听

目录介绍

  • 01.传统一点的做法
  • 02.如何实现统一埋点
  • 03.具体实现代码案例
  • 04.如何配置使用

01.传统一点的做法

  • 传统一点的做法
    • 比如用友盟或者百度统计,或者用其他的统计。之前的做法是,在每个有视频的页面比如说Activity,Fragment等开启时视频播放时埋点一次,页面退出时埋点一次。
    • 如果app中有多个activity或者fragment页面,那么就每个页面都要进行埋点。比如如果你的app是付费视频,你想知道有多少人试看了,该怎么操作。那么你需要在每一个有视频的activity页面挨个添加埋点,那还有没有更好的办法?

02.如何实现统一埋点

  • 解决方案
    • 举个例子:例如,你需要来让外部开发者手动去埋点,可是在类中怎么埋点又是由其他人来设计的,你只是需要对外暴露监听的方法。那么该如何做呢?采用接口 + 实现类方式即可实现。
  • 该案例中怎么操作
    • 定义一个接口,规定其他人设计类,必须继承这个接口。在这个接口中,定义进入视频播放,退出视频播放器,记录播放进度,视频播放完成,播放异常,点击广告,点击试看等操作的抽象方法。具体可以看BuriedPointEvent类代码……
  • 外部开发者如何使用
    • 定义一个类实现该视频埋点接口,重写里面方法。然后需要在初始化配置视频播放器的时候,将这个实现类的对象传递进来即可。通过这个配置类传进来的对象,播放器就可以处理监听设置逻辑呢。
    • 这种操作最大的好处就是:在这个类中统一处理视频的埋点,修改快捷,而不用在每一个有视频播放器的页面埋点,方便维护。

03.具体实现代码案例

  • 如何监听进入视频播放,刚开始想着在play方法中监听,后来发现不太好。改为在设置视频url时监听,即代表进入视频播放开始
    //在VideoPlayer类中
    /**
     * 设置包含请求头信息的视频地址
     *
     * @param url     视频地址
     * @param headers 请求头
     */
    public void setUrl(String url, Map<String, String> headers) {
        VideoPlayerConfig config = VideoViewManager.getConfig();
        if (config!=null && config.mBuriedPointEvent!=null){
            //相当于进入了视频页面
            config.mBuriedPointEvent.playerIn(url);
        }
    }
  • 如何监听视频退出播放,以及退出播发时候的播放进度百分比,这个方便统计用户看视频情况
    /**
     * 释放播放器
     */
    public void release() {
        if (!isInIdleState()) {
            VideoPlayerConfig config = VideoViewManager.getConfig();
            if (config!=null && config.mBuriedPointEvent!=null){
                //退出视频播放
                config.mBuriedPointEvent.playerDestroy(mUrl);
    
                //计算退出视频时候的进度
                long duration = getDuration();
                long currentPosition = getCurrentPosition();
                float progress = (currentPosition*1.0f) / (duration*1.0f) ;
                config.mBuriedPointEvent.playerOutProgress(mUrl,progress);
            }
        }
    }
  • 如何监听视频播放完了,这样做主要是查看用户的播放完成率,方便分析
    /**
     * 视频播放完成回调
     */
    @Override
    public void onCompletion() {
        VideoPlayerConfig config = VideoViewManager.getConfig();
        if (config!=null && config.mBuriedPointEvent!=null){
            //视频播放完成
            config.mBuriedPointEvent.playerCompletion(mUrl);
        }
    }
  • 然后测试一下,打印日志如下所示
    2020-10-16 11:07:04.398 5534-5534/org.yczbj.ycvideoplayer I/YCVideoPlayer: BuriedPointEvent---进入视频播放--http://vfx.mtime.cn/Video/2019/02/04/mp4/190204084208765161.mp4
    2020-10-16 11:07:16.006 5534-5534/org.yczbj.ycvideoplayer I/YCVideoPlayer: BuriedPointEvent---视频播放完成--http://vfx.mtime.cn/Video/2019/02/04/mp4/190204084208765161.mp4
    2020-10-16 11:07:30.566 5534-5534/org.yczbj.ycvideoplayer I/YCVideoPlayer: BuriedPointEvent---视频播放异常--http://vfx.mtime.cn/Video/2019/02/04/mp4/190204084208765161.mp4
    2020-10-16 11:07:41.107 5534-5534/org.yczbj.ycvideoplayer I/YCVideoPlayer: BuriedPointEvent---退出视频播放--http://vfx.mtime.cn/Video/2019/02/04/mp4/190204084208765161.mp4
    2020-10-16 11:07:41.107 5534-5534/org.yczbj.ycvideoplayer I/YCVideoPlayer: BuriedPointEvent---退出视频播放时候的播放进度百度分--http://vfx.mtime.cn/Video/2019/02/04/mp4/190204084208765161.mp4

04.如何配置使用

  • 只需要在初始化配置的时候,创建埋点监听类,代码如下所示,具体代码可以看BuriedPointEventImpl类。
    //播放器配置,注意:此为全局配置,按需开启
    PlayerFactory player = PlayerFactoryUtils.getPlayer(PlayerConstant.PlayerType.TYPE_IJK);
    VideoViewManager.setConfig(VideoPlayerConfig.newBuilder()
            //设置上下文
            .setContext(this)
            //设置视频全局埋点事件
            .setBuriedPointEvent(new BuriedPointEventImpl())
            //调试的时候请打开日志,方便排错
            .setLogEnabled(true)
            //设置ijk
            .setPlayerFactory(player)
            .build());
  • 关于BuriedPointEventImpl类代码说明,必须继承BuriedPointEvent约定的接口。这样操作就特别方面视频埋点操作,方便统一处理……
    public class BuriedPointEventImpl implements BuriedPointEvent {
    
        /**
         * 进入视频播放
         * @param url                       视频url
         */
        @Override
        public void playerIn(String url) {
            VideoLogUtils.i("BuriedPointEvent---进入视频播放--"+url);
        }
    
        /**
         * 退出视频播放
         * @param url                       视频url
         */
        @Override
        public void playerDestroy(String url) {
            VideoLogUtils.i("BuriedPointEvent---退出视频播放--"+url);
        }
    
        /**
         * 视频播放完成
         * @param url                       视频url
         */
        @Override
        public void playerCompletion(String url) {
            VideoLogUtils.i("BuriedPointEvent---视频播放完成--"+url);
        }
    
        /**
         * 视频播放异常
         * @param url                       视频url
         * @param isNetError                是否是网络异常
         */
        @Override
        public void onError(String url, boolean isNetError) {
            VideoLogUtils.i("BuriedPointEvent---视频播放异常--"+url);
        }
    
        /**
         * 点击了视频广告
         * @param url                       视频url
         */
        @Override
        public void clickAd(String url) {
            VideoLogUtils.i("BuriedPointEvent---点击了视频广告--"+url);
        }
    
        /**
         * 视频试看点击
         * @param url                       视频url
         */
        @Override
        public void playerAndProved(String url) {
            VideoLogUtils.i("BuriedPointEvent---视频试看点击--"+url);
        }
    
        /**
         * 退出视频播放时候的播放进度百度比
         * @param url                       视频url
         * @param progress                  视频进度,计算百分比【退出时候进度 / 总进度】
         */
        @Override
        public void playerOutProgress(String url, float progress) {
            VideoLogUtils.i("BuriedPointEvent---退出视频播放时候的播放进度百度比--"+url+"-----"+progress);
        }
    
        /**
         * 退出视频播放时候的播放进度
         * @param url                       视频url
         * @param duration                  总时长
         * @param currentPosition           当前进度时长
         */
        @Override
        public void playerOutProgress(String url, long duration, long currentPosition) {
            VideoLogUtils.i("BuriedPointEvent---退出视频播放时候的播放进度百度比--"+url+"-----"+duration+"----"+currentPosition);
        }
    
        /**
         * 视频切换音频
         * @param url                       视频url
         */
        @Override
        public void videoToMedia(String url) {
            VideoLogUtils.i("BuriedPointEvent---视频切换音频--"+url);
        }
    }