Skip to content

3_1 直播_播放器

jlayi edited this page Jun 24, 2020 · 6 revisions

直播播放器的实现类是PolyvCloudClassVideoView,在demo中,对播放器的绝大多数的演示和使用,都在PolyvCloudClassVideoItem中做了演示,同时也用后者也是对播放器的一层封装。

1 进入直播室

//isNormalLive参数表示当前是普通直播还是三分屏直播
PolyvCloudClassHomeActivity.startActivityForLive(Activity activity, String channelId, String userId, boolean isNormalLive);

//0.13.0开始,新增了rtctype,开发者应当通过SDK请求服务器rtctype的值传参再跳转
//rtctype的值参考demo,暂不支持ucloud方式
PolyvCloudClassHomeActivity.startActivityForLiveWithParticipant(Activity activity, String channelId, String userId, boolean isNormalLive, boolean isParticipant,String rtcType);

进入直播室后如果当前频道有直播,就观看直播;如果当前频道没有直播,则观看后台设置的暖场视频,如果没有设置暖场视频,则显示当前暂无直播的图片。

2 部署播放器

区分直播场景是三分屏直播还是普通直播,通过登录SDK时发起的getLiveStatusJson()接口的请求结果来判断(在PolyvCloudClassLoginActivity中的requestLiveStatus()),在PolyvCloudClassHomeActivity中通过isNormalLive字段接收。

2.1 普通直播

PolyvCloudClassHomeActivity#initialLiveVideo()中,若isNormalLive=true,表示是普通直播,则直播不会显示三分屏副屏。

2.2 三分屏直播

PolyvCloudClassHomeActivity#initialLiveVideo()中,若isNormalLive=false,表示是三分屏直播,则直播会显示三分屏副屏。

2.2.1 三分屏副屏

三分屏比普通直播多了一个副窗口,用于展示讲师的PPT内容。

副屏的随意拖动功能是用PolyvTouchContainerView实现的,在PolyvCloudClassHomeActivity#initPpt()方法中实例化和控制初始化位置。

副屏的尺寸:直接在PolyvCloudClassHomeActivity的xml中改变PolyvTouchContainerView的尺寸。

副屏的实现在PolyvPPTView,封装在PolyvPPTItem

2.2.2 加载副屏

PolyvCloudClassHomeActivity#initialLiveVideo()中,根据isNormalLive字段判断是否是三分屏。是三分屏,则实例化并传递给PolyvCloudClassVideoHelper;不是三分屏,则传递null,则不会加载副屏。

2.2.3 打开/关闭副屏

打开:

PolyvPPTItem#show(View.VISIBLE);

PolyvCommonVideoHelper#showCamerView();

关闭

PolyvPPTItem#show(View.INVISIBLE);

PolyvPPTItem#hideSubView()
2.2.4 主副屏切换

该逻辑较为复杂,在PolyvCloudClassMediaController#changePPTVideoLocation()方法中

3 皮肤

3.1 播放器

PolyvCloudClassMediaController

PolyvCloudClassVideoItem#initialVideoView()

polyvCloudClassVideoView.setMediaController(controller);

PolyvCloudClassMediaController中分为横屏竖屏两套xml,可以按需修改。

3.2 三分屏的副屏

三分屏副屏:

PolyvPPTItem

PolyvPPTView,这里面可以修改没有PPT的时候占位图

3.3 调节屏幕亮度和音量

  1. 亮度

    PolyvLightTipsView
  2. 音量

    PolyvVolumeTipsView

亮度和音量是随着手势滑动改变的,也可以直接在PolyvCloudClassVideoItem里面找到这两个view的调用逻辑来自定义皮肤。

3.4 更多弹窗视图

PolyvCloudClassMoreLayout

更多,是用PopupWindow来实现的,包括了切换音频视频模式,切换码率,多线路等。在PolyvCloudClassMediaController中被引用和初始化。

可以对这里进行修改来改变更多视图的皮肤

3.5 横屏发送弹幕控件

//接口
IPolyvLandscapeDanmuSender
//实现类
PolyvLandscapeDanmuSendPanel

PolyvLandscapeDanmuSendPanel是横屏发送弹幕的实现类,用的是PopupWindow来实现的,在PolyvCloudClassVideoItem中被实例化,利用接口IPolyvLandscapeDanmuSender来访问内部方法。自定义皮肤可以修改默认实现类,或者重新实现接口,注意,发送弹幕需要将弹幕同步到聊天室(默认实现类中有)。

3.6 音频模式图

public interface IPolyvCloudClassAudioModeView {
    /**
 	* 当音频模式显示的时候调用(即切换到音频模式)
	 */
    void onShow();
    /**
     * 当音频模式隐藏的时候调用(即切换到视频模式)
     */
    void onHide();
    
	/**
     * 需要返回根View。
     */
    View getRoot();
}

实现类:PolyvCloudClassAudioModeView,在PolyvCloudClassVideoItem#initailView()中实例化。

可以修改PolyvCloudClassAudioModeView或者重新实现接口。

4 横竖屏切换

可直接通过旋转手机或者点击播放器的MediaController的全屏按钮和全屏下的返回按钮来切换横竖屏。

在PolyvCloudClassMediaController中,点击事件调用了:

public void changeToLandscape()
public void changeToPortrait()

5 视频播放

5.1 播放/暂停

播放:

PolyvCloudClassVideoParams cloudClassVideoParams = new PolyvCloudClassVideoParams(channelId, userId, studentUserId);
cloudClassVideoParams
				//是否开启暖场视频
				.buildOptions(PolyvBaseVideoParams.WAIT_AD, true)
				//是否开启跑马灯
                .buildOptions(PolyvBaseVideoParams.MARQUEE, true)
                //后台统计数据需要,填入学员昵称
                .buildOptions(PolyvBaseVideoParams.PARAMS2,studentNickName);
                
livePlayerHelper.startPlay(cloudClassVideoParams)
//或直接调用直播播放器的方法也可以
//videoView.playByMode(cloudClassVideoParams,PolyvPlayOption.PLAYMODE_LIVE);

暂停:

polyvVideoView.pause()

注:如果是从暂停又回到播放,不要调用polyvVideoView.start(),该方法不会加载最新的直播画面,只是从刚才暂停的画面继续播放直播流。正确的做法是从新开始拉流,如PolyvCloudClassMediaController#refreshVideoView()方法。

5.2 音视频模式切换

//切换到音频模式
polyvVideoView.changeMediaPlayMode(PolyvMediaPlayMode.MODE_AUDIO);
//切换到视频模式
polyvVideoView.changeMediaPlayMode(PolyvMediaPlayMode.MODE_VIDEO);

音频和视频模式的切换业务在PolyvCloudClassMoreLayout(右上角的更多布局)中有示例。

5.3 码率切换

5.3.1获取码率数据
public interface IPolyvMediaController<T> extends IMediaController {
    //...
    
    /**
     * 初始化多码率试图
     * @param bitrateVO
     */
    void initialBitrate(PolyvBitrateVO bitrateVO);
    
    //...
}

在播放器拉流之前,播放器会回调该方法,IPolyvMediaController的实现类例如:PolyvCloudClassMediaController对应的方法会回调并拿到码率对象。在demo中,码率对象传输到PolyvCloudClassMoreLayout中处理。

5.3.2 方法调用
PolyvCloudClassVideoView#changeBitRate(int bitrate)

在demo中,用户通过PolyvCloudClassMediaController的右上角的“更多”界面选择码率切换,在PolyvCloudClassMoreLayout.OnBitrateSelectedListener回调中监听到选择码率的事件,调用了上述方法。参数bitrate是指获取到的码率数据中支持的码率数组的下标。

5.4 多线路切换

5.4.1 多线路数据获取
public interface IPolyvMediaController<T> extends IMediaController {
    //...
    
    /**
     * 初始化多綫路试图
     * @param lines
     */
    void initialLines(List<PolyvLiveLinesVO> lines);
    
    //...
}

在播放器拉流之前,播放器会回调该方法,IPolyvMediaController的实现类例如:PolyvCloudClassMediaController对应的方法会回调并拿到多线路对象。在demo中,多线路对象传输到PolyvCloudClassMoreLayout中处理。

5.4.2 方法调用
PolyvCloudClassVideoView#changeLines(int linePos);

PolyvCloudClassMediaController中:

moreLayout.setOnLinesSelectedListener(new PolyvCloudClassMoreLayout.OnLinesSelectedListener() {
    @Override
    public void onLineSelected(PolyvLiveLinesVO line, int linePos) {
        polyvVideoView.changeLines(linePos);
    }
});

5.5 追帧

追帧功能默认是关闭的,需要在代码中手动开启:

PolyvCloudClassVideoView#enableFrameSkip(boolean enable);

注意:开启追帧功能后,如果观看端的网络环境较差,则会引起更频繁的卡顿。

5.6 软硬解

播放器默认使用软解播放,如果需要切换硬解,可以调用如下方法:

PolyvCloudClassVideoView#setDecodeMode(int decodeMode);//参数0:软解,1:硬解,默认软解

注意:使用硬解在部分手机会存在兼容性问题,可能会导致无法播放等问题。

6 播放器事件监听

直播播放器的事件监听的用法全部位于类:PolyvCloudClassVideoItem中。

//监听播放器错误
polyvCloudClassVideoView.setOnErrorListener(...);
//监听播放器重播
polyvCloudClassVideoView.setOnVideoViewRestartListener(...);
//监听播放器准备
polyvCloudClassVideoView.setOnPreparedListener();
//监听PPT显示或隐藏
polyvCloudClassVideoView.setOnPPTShowListener();
//监听摄像头显示或隐藏
polyvCloudClassVideoView.setOnCameraShowListener();
//监听手势滑动事件,共6个
polyvCloudClassVideoView.setOnGestureXXXListener();
//监听跑马灯回调
polyvCloudClassVideoView.setOnGetMarqueeVoListener();
//监听麦克风回调
polyvCloudClassVideoView.setMicroPhoneListener();
//监听:暂无直播,直播结束,直播暂停的回调
polyvCloudClassVideoView.setOnNoLiveAtPresentListener();
//监听后台是否打开弹幕(不是实时的)
polyvCloudClassVideoView.setOnDanmuServerOpenListener();
//监听直播线路改变回调
polyvCloudClassVideoView.setOnLinesChangedListener();
//监听视频流中的SEI帧信息回调
polyvCloudClassVideoView.setOnSEIRefreshListener();

7 手势滑动

PolyvCloudClassVideoItem中对手势滑动回调进行了基本的处理:亮度和音量的调节

OnGestureLeftUpListener
OnGestureLeftDownListener
OnGestureRightUpListener
OnGestureRightDownListener
OnGestureSwipeLeftListener
OnGestureSwipeRightListener

8 暖场播放

通过对播放器设置一个辅助播放器,来播放暖场视频。

PolyvCloudClassVideoItem

//设置辅助播放器,不能为null
PolyvAuxiliaryVideoview subVideoview = findViewById(R.id.sub_videoview);
polyvCloudClassVideoView.setSubVideoView(subVideoview);

9 跑马灯

PolyvCloudClassVideoItem#initialVideoView()中有对跑马灯进行处理,跑马灯接收后台设置的跑马灯样式然后显示。

polyvCloudClassVideoView.setOnGetMarqueeVoListener(new IPolyvCloudClassListenerEvent.OnGetMarqueeVoListener() {
    @Override
    public void onGetMarqueeVo(PolyvLiveMarqueeVO marqueeVo) {
        //PolyvLiveMarqueeVO是后台设置的跑马灯的数据结构
        //处理逻辑参考PolyvCloudClassVideoItem
    }
});

10 弹幕

10.1 PolyvDanmuFragment

弹幕和聊天室的消息会同步。

//修改样式
private void initView()

//隐藏
public void hide()
    
//显示
public void show()
    
//发送弹幕
public void sendDanmaku(CharSequence message)

10.2 横屏发送弹幕

IPolyvLandscapeDanmuSender的实现类PolyvLandscapeDanmuSendPanel

PolyvCloudClassVideoItem中实例化,可根据需要自定义横屏发送弹幕的逻辑

Clone this wiki locally