保利威文档中心

幫助中心

7_4-核心common-播放器

更新時間:2023-04-17 15:27:57

1 功能概述

播放器模組位於polyvLiveCommonModul模組的player包下,包含直播以及回放播放器。該模組採用mvp模式設計,將view層對sdk層的播放器videoView的直接呼叫隔離開,並將多個場景中對videoView的共用程式碼抽離封裝起來,使view層的邏輯變得更簡潔,封裝的presenter層負責videoView的控制以及通知view層更新ui。

2 MVP模式

直播播放器的mvp模式是用IPLVLivePlayerContract作為契約類別,內部定義了直播播放器mvp-view介面ILivePlayerView,以及直播播放器mvp-presenter介面ILivePlayerPresenter

public interface IPLVLivePlayerContract {

    // <editor-fold defaultstate="collapsed" desc="1、mvp-直播播放器view层接口">

    /**
     * mvp-直播播放器view层接口
     */
    interface ILivePlayerView {
        /**
         * 设置presenter后的回调
         */
        void setPresenter(@NonNull ILivePlayerPresenter presenter);

        /**
         * 获取主播放器view
         */
        PolyvLiveVideoView getLiveVideoView();

        /**
         * 获取暖场播放器view
         */
        PolyvAuxiliaryVideoview getSubVideoView();

        /**
         * 获取播放器缓冲视图
         */
        View getBufferingIndicator();

        /**
         * 获取暂无直播显示的视图
         */
        View getNoStreamIndicator();

        /**
         * 子播放器开始播放回调
         *
         * @param isFirst 每次加载完成后是否是第一次start播放
         */
        void onSubVideoViewPlay(boolean isFirst);

        /**
         * 子播放器点击事件
         *
         * @param mainPlayerIsPlaying 主播放器是否在播放中
         */
        void onSubVideoViewClick(boolean mainPlayerIsPlaying);

        /**
         * 主播放器播放失败回调
         *
         * @param error 失败数据
         * @param tips  错误提示
         */
        void onPlayError(PolyvPlayError error, String tips);

        /**
         * 暂无直播回调
         */
        void onNoLiveAtPresent();

        /**
         * 直播推流暂停回调
         */
        void onLiveStop();

        /**
         * 直播结束回调
         */
        void onLiveEnd();

        /**
         * 准备完成回调
         *
         * @param mediaPlayMode 音视频播放模式
         */
        void onPrepared(@PolyvMediaPlayMode.Mode int mediaPlayMode);

        /**
         * 线路切换回调
         *
         * @param linesPos 线路索引
         */
        void onLinesChanged(int linesPos);

        /**
         * 获取跑马灯回调
         *
         * @param marqueeVo  跑马灯数据
         * @param viewerName 观看用户名
         */
        void onGetMarqueeVo(PolyvLiveMarqueeVO marqueeVo, String viewerName);

        /**
         * 重新开始播放回调
         */
        void onRestartPlay();

        /**
         * 手势触发的亮度改变事件
         *
         * @param changeValue 亮度值,范围:[0,100]
         * @param isEnd       手势是否结束
         * @return 是否要改变亮度
         */
        boolean onLightChanged(int changeValue, boolean isEnd);

        /**
         * 手势触发的音量改变事件,changeValue:,return:是否要改变音量
         *
         * @param changeValue 音量值,范围:[0,100]
         * @param isEnd       手势是否结束
         * @return 是否要改变音量
         */
        boolean onVolumeChanged(int changeValue, boolean isEnd);

        /**
         * 该频道直播的服务端弹幕开关
         *
         * @param isServerDanmuOpen true:开启了弹幕,false:关闭了弹幕
         */
        void onServerDanmuOpen(boolean isServerDanmuOpen);

        /**
         * 根据频道的类型,决定是否要显示ppt
         *
         * @param visible {@link View#VISIBLE}
         */
        void onShowPPTView(int visible);

        /**
         * 断网重连
         *
         * @return true表示不使用播放器内部重连逻辑,false表示使用。
         */
        boolean onNetworkRecover();
    }
    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="2、mvp-直播播放器presenter层接口">

    /**
     * mvp-直播播放器presenter层接口
     */
    interface ILivePlayerPresenter {
        /**
         * 注册view
         */
        void registerView(@NonNull ILivePlayerView v);

        /**
         * 解除注册的view
         */
        void unregisterView();

        /**
         * 初始化播放器配置
         */
        void init();

        /**
         * 开始播放
         */
        void startPlay();

        /**
         * 重新开始播放
         */
        void restartPlay();

        /**
         * 暂停播放
         */
        void pause();

        /**
         * 恢复播放
         */
        void resume();

        /**
         * 停止播放
         */
        void stop();

        /**
         * 是否在播放中
         */
        boolean isPlaying();

        /**
         * 获取可以切换的线路数量
         */
        int getLinesCount();

        //获取当前线路可以切换的码率(清晰度)信息
        @Nullable
        List<PolyvDefinitionVO> getBitrateVO();

        /**
         * 获取播放模式
         *
         * @return @{@link PolyvMediaPlayMode.Mode}
         */
        int getMediaPlayMode();

        /**
         * 改变播放模式
         */
        void changeMediaPlayMode(@PolyvMediaPlayMode.Mode int mediaPlayMode);

        /**
         * 切换线路
         *
         * @param linesPos 线路索引
         */
        void changeLines(int linesPos);

        /**
         * 切换码率
         *
         * @param bitRate 码率索引
         */
        void changeBitRate(int bitRate);

        /**
         * 截图
         *
         * @return 截图的图片
         */
        @Nullable
        Bitmap screenshot();

        /**
         * 获取视频信息
         *
         * @return 视频信息数据
         */
        @Nullable
        PolyvLiveChannelVO getChannelVO();

        /**
         * 获取当前线路索引
         */
        int getLinesPos();

        /**
         * 获取当前码率(清晰度)索引
         */
        int getBitratePos();

        /**
         * 设置系统音量
         *
         * @param volume 音量值,范围:[0,100]
         */
        void setVolume(int volume);

        /**
         * 获取系统音量
         *
         * @return 音量值,范围:[0,100]
         */
        int getVolume();

        /**
         * 设置播放器音量
         *
         * @param volume 音量值,范围:[0,100]
         */
        void setPlayerVolume(int volume);

        /**
         * 是否需要手势
         *
         * @param need true:需要,false:不需要
         */
        void setNeedGestureDetector(boolean need);

        /**
         * 获取直播播放器数据
         */
        @NonNull
        PLVLivePlayerData getData();

        /**
         * 销毁,包括销毁播放器、解除view
         */
        void destroy();
    }
    // </editor-fold>
}

2.1 Presenter實作邏輯

ILivePlayerPresenter的實作類別為PLVLivePlayerPresenter

其內部主要使用以下兩個類別來完成核心業務:

1、IPLVLiveRoomDataManager,直播間資料管理器

2、PolyvLiveVideoView,sdk層的播放器videoView

2.1.1 初始化

PLVLivePlayerPresenter在建構子中進行了如下初始化操作:引用IPLVLiveRoomDataManager,建立PLVLivePlayerData

public PLVLivePlayerPresenter(@NonNull IPLVLiveRoomDataManager liveRoomDataManager) {
    this.liveRoomDataManager = liveRoomDataManager;
    livePlayerData = new PLVLivePlayerData();
}

PLVLivePlayerData是直播播放器資料,內部儲存的資料都是MutableLiveData類型,主要用於提供給非mvp的view監聽/取得播放器的資料,可以作用於不同業務模組間的資料監聽及取得。

2.1.2 註冊mvp-view

在ui層建立好mvp-view後,透過呼叫mvp-presenter的registerView方法,即可把mvp-view傳給mvp-presenter,使得mvp-presenter可對mvp-view進行操作;同時mvp-presenter也會把自身傳給mvp-view,使得mvp-view可以呼叫mvp-presenter提供的方法。

@Override
public void registerView(@NonNull IPLVLivePlayerContract.ILivePlayerView v) {
    this.vWeakReference = new WeakReference<>(v);
    v.setPresenter(this);
}

3 SDK核心類別介紹

直播播放器的SDK核心類別是PolyvLiveVideoView,該類別在PLVLivePlayerPresenter中被使用。

3.1 建立

PolyvLiveVideoView是一個view,因此可以在佈局中建立。

<com.easefun.polyv.livescenes.video.PolyvLiveVideoView
    android:id="@+id/live_video_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
</com.easefun.polyv.livescenes.video.PolyvLiveVideoView>

透過findViewById找到PolyvLiveVideoView後,可以透過播放器mvp-view的getLiveVideoView方法,將PolyvLiveVideoView傳給播放器mvp-presenter使用。

3.2 初始化

可以根據業務給PolyvLiveVideoView配置一些view,使用範例:

PLVLCLiveMediaLayout

private void initVideoView() {
    //设置子播放器view
    videoView.setSubVideoView(subVideoView);
    //设置音频模式view
    videoView.setAudioModeView(audioModeView);
    //设置loadingView
    videoView.setPlayerBufferingIndicator(loadingView);
    //设置无直播时显示的view
    videoView.setNoStreamIndicator(noStreamView);
    //设置直播停止时显示的view
    videoView.setStopStreamIndicator(stopStreamView);
    //设置控制栏
    videoView.setMediaController(mediaController);
    //设置跑马灯
    videoView.post(new Runnable() {
        @Override
        public void run() {
            marqueeView = ((Activity) getContext()).findViewById(R.id.plvlc_marquee_view);//after videoLayout add, post find
            videoView.setMarqueeView(marqueeView, marqueeItem = new PolyvMarqueeItem());
        }
    });
}

3.3 設定監聽器

PolyvLiveVideoView提供很多設定監聽器以監聽播放器相關的資訊。

/**
 * 设置视频播放完成回调,只有url播放才会触发该事件
 *
 * @param l
 */
public void setOnCompletionListener(IPolyvVideoViewListenerEvent.OnCompletionListener l);

/**
 * 设置视频已准备好马上进入播放回调
 *
 * @param l
 */
public void setOnPreparedListener(IPolyvVideoViewListenerEvent.OnPreparedListener l);

/**
 * 设置视频播放器内部错误回调,只有url播放才会触发该事件
 *
 * @param l
 */
public void setOnErrorListener(IPolyvVideoViewListenerEvent.OnErrorListener l);

/**
 * 设置视频播放器信息有变更回调
 *
 * @param l
 */
public void setOnInfoListener(IPolyvVideoViewListenerEvent.OnInfoListener l);

/**
 * 设置seek完成回调,只有url播放才会触发该事件
 *
 * @param l
 */
public void setOnSeekCompleteListener(IPolyvVideoViewListenerEvent.OnSeekCompleteListener l);

/**
 * 设置视频尺寸改变回调
 *
 * @param l
 */
public void setOnVideoSizeChangedListener(IPolyvVideoViewListenerEvent.OnVideoSizeChangedListener l);


/**
 * 设置视频缓存更新回调,只有url播放才会触发该事件
 *
 * @param l
 */
public void setOnBufferingUpdateListener(IPolyvVideoViewListenerEvent.OnBufferingUpdateListener l);

/**
 * 设置视频播放回调
 *
 * @param l
 */
public void setOnVideoPlayListener(IPolyvVideoViewListenerEvent.OnVideoPlayListener l);

/**
 * 设置视频暂停回调
 *
 * @param l
 */
public void setOnVideoPauseListener(IPolyvVideoViewListenerEvent.OnVideoPauseListener l);


/**
 * 设置暖场图片弹出监听回调
 *
 * @param l
 */
public void setOnCoverImageOutListener(IPolyvVideoViewListenerEvent.OnCoverImageOutListener l);

/**
 * 设置手势左向上回调
 *
 * @param l
 */
public void setOnGestureLeftUpListener(IPolyvVideoViewListenerEvent.OnGestureLeftUpListener l);

/**
 * 设置手势左向下回调
 *
 * @param l
 */
public void setOnGestureLeftDownListener(IPolyvVideoViewListenerEvent.OnGestureLeftDownListener l);

/**
 * 设置手势右向上回调
 *
 * @param l
 */
public void setOnGestureRightUpListener(IPolyvVideoViewListenerEvent.OnGestureRightUpListener l);

/**
 * 设置手势右向下回调
 *
 * @param l
 */
public void setOnGestureRightDownListener(IPolyvVideoViewListenerEvent.OnGestureRightDownListener l);

/**
 * 设置手势左滑回调
 *
 * @param l
 */
public void setOnGestureSwipeLeftListener(IPolyvVideoViewListenerEvent.OnGestureSwipeLeftListener l);

/**
 * 设置手势右滑回调
 *
 * @param l
 */
public void setOnGestureSwipeRightListener(IPolyvVideoViewListenerEvent.OnGestureSwipeRightListener l);

/**
 * 设置手势单击回调
 *
 * @param l
 */
public void setOnGestureClickListener(IPolyvVideoViewListenerEvent.OnGestureClickListener l);

/**
 * 设置手势双击回调
 *
 * @param l
 */
public void setOnGestureDoubleClickListener(IPolyvVideoViewListenerEvent.OnGestureDoubleClickListener l);

/**
 * 设置PPT显示回掉
 *
 * @param l
 */
public void setOnPPTShowListener(IPolyvVideoViewListenerEvent.OnPPTShowListener l);

/**
 * 设置视频重新加载
 *
 * @param l
 */
public void setOnVideoViewRestartListener(IPolyvVideoViewListenerEvent.OnVideoViewRestart l);

/**
 * 设置获取直播后台设置的跑马灯样式的监听器
 *
 * @param l
 */
public void setOnGetMarqueeVoListener(IPolyvVideoViewListenerEvent.OnGetMarqueeVoListener l);

/**
 * 设置SEI信息回调
 *
 * @param l
 */
void setOnSEIRefreshListener(IPolyvVideoViewListenerEvent.OnSEIRefreshListener l);

/**
 * 设置网络状态监听器回调
 *
 * @param l
 */
void setOnNetworkStateListener(IPolyvVideoViewListenerEvent.OnNetworkStateListener l);

設定監聽器的範例可以在PLVLivePlayerPresenter中找到。

3.4 開始播放

PolyvLiveVideoView提供了開始播放影片的方法。

/**
 * 点播与直播的播放入口
 *
 * @param params 请求数据实体的结构 通过这个结构可以统一点播与直播的播放入口
 * @param mode   播放的类型,确定需要解析的参数
 */
@MainThread
void playByMode(PolyvBaseVideoParams params, @PLVPlayOption.PlayMode int mode);

該方法在PLVLivePlayerPresenter做了封裝,播放器mvp-view呼叫PLVLivePlayerPresenterstartPlay方法即可開始播放影片。

@Override
public void startPlay() {
    PolyvLiveVideoParams liveVideoParams = new PolyvLiveVideoParams(
            getConfig().getChannelId(),
            getConfig().getAccount().getUserId(),
            getConfig().getUser().getViewerId()
    );
    liveVideoParams.buildOptions(PolyvBaseVideoParams.WAIT_AD, true)
            .buildOptions(PolyvBaseVideoParams.MARQUEE, true)
            .buildOptions(PolyvBaseVideoParams.PARAMS2, getConfig().getUser().getViewerName());
    if (videoView != null) {
        videoView.playByMode(liveVideoParams, PLVPlayOption.PLAYMODE_LIVE);
    }
    startPlayProgressTimer();
}

3.5 播放控制

PolyvLiveVideoView提供了以下的播放控制方法。

//开始
void start();
//暂停
void pause();
//停止
void stopPlay();

以上方法也在PLVLivePlayerPresenter中做了封裝,更多播放器相關方法的呼叫都可以參考PLVLivePlayerPresenter實作的介面ILivePlayerPresenter

联系客服,在线咨询