-
Notifications
You must be signed in to change notification settings - Fork 16
3_1 直播_播放器
直播播放器的实现类是PolyvCloudClassVideoView
,在demo中,对播放器的绝大多数的演示和使用,都在PolyvCloudClassVideoItem
中做了演示,同时也用后者也是对播放器的一层封装。
//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);
进入直播室后如果当前频道有直播,就观看直播;如果当前频道没有直播,则观看后台设置的暖场视频,如果没有设置暖场视频,则显示当前暂无直播的图片。
区分直播场景是三分屏直播还是普通直播,通过登录SDK时发起的getLiveStatusJson()
接口的请求结果来判断(在PolyvCloudClassLoginActivity
中的requestLiveStatus()
),在PolyvCloudClassHomeActivity
中通过isNormalLive
字段接收。
在PolyvCloudClassHomeActivity#initialLiveVideo()
中,若isNormalLive=true
,表示是普通直播,则直播不会显示三分屏副屏。
在PolyvCloudClassHomeActivity#initialLiveVideo()
中,若isNormalLive=false
,表示是三分屏直播,则直播会显示三分屏副屏。
三分屏比普通直播多了一个副窗口,用于展示讲师的PPT内容。
副屏的随意拖动功能是用PolyvTouchContainerView
实现的,在PolyvCloudClassHomeActivity#initPpt()
方法中实例化和控制初始化位置。
副屏的尺寸:直接在PolyvCloudClassHomeActivity
的xml中改变PolyvTouchContainerView
的尺寸。
副屏的实现在PolyvPPTView
,封装在PolyvPPTItem
在PolyvCloudClassHomeActivity#initialLiveVideo()
中,根据isNormalLive
字段判断是否是三分屏。是三分屏,则实例化并传递给PolyvCloudClassVideoHelper
;不是三分屏,则传递null,则不会加载副屏。
打开:
PolyvPPTItem#show(View.VISIBLE);
或
PolyvCommonVideoHelper#showCamerView();
关闭
PolyvPPTItem#show(View.INVISIBLE);
或
PolyvPPTItem#hideSubView()
该逻辑较为复杂,在PolyvCloudClassMediaController#changePPTVideoLocation()
方法中
PolyvCloudClassMediaController
在PolyvCloudClassVideoItem#initialVideoView()
polyvCloudClassVideoView.setMediaController(controller);
在PolyvCloudClassMediaController
中分为横屏竖屏两套xml,可以按需修改。
三分屏副屏:
PolyvPPTItem
PolyvPPTView
,这里面可以修改没有PPT的时候占位图
-
亮度
PolyvLightTipsView
-
音量
PolyvVolumeTipsView
亮度和音量是随着手势滑动改变的,也可以直接在PolyvCloudClassVideoItem
里面找到这两个view的调用逻辑来自定义皮肤。
PolyvCloudClassMoreLayout
更多,是用PopupWindow
来实现的,包括了切换音频视频模式,切换码率,多线路等。在PolyvCloudClassMediaController
中被引用和初始化。
可以对这里进行修改来改变更多视图的皮肤
//接口
IPolyvLandscapeDanmuSender
//实现类
PolyvLandscapeDanmuSendPanel
PolyvLandscapeDanmuSendPanel
是横屏发送弹幕的实现类,用的是PopupWindow
来实现的,在PolyvCloudClassVideoItem
中被实例化,利用接口IPolyvLandscapeDanmuSender
来访问内部方法。自定义皮肤可以修改默认实现类,或者重新实现接口,注意,发送弹幕需要将弹幕同步到聊天室(默认实现类中有)。
public interface IPolyvCloudClassAudioModeView {
/**
* 当音频模式显示的时候调用(即切换到音频模式)
*/
void onShow();
/**
* 当音频模式隐藏的时候调用(即切换到视频模式)
*/
void onHide();
/**
* 需要返回根View。
*/
View getRoot();
}
实现类:PolyvCloudClassAudioModeView
,在PolyvCloudClassVideoItem#initailView()
中实例化。
可以修改PolyvCloudClassAudioModeView
或者重新实现接口。
可直接通过旋转手机或者点击播放器的MediaController的全屏按钮和全屏下的返回按钮来切换横竖屏。
在PolyvCloudClassMediaController中,点击事件调用了:
public void changeToLandscape()
public void changeToPortrait()
播放:
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()
方法。
//切换到音频模式
polyvVideoView.changeMediaPlayMode(PolyvMediaPlayMode.MODE_AUDIO);
//切换到视频模式
polyvVideoView.changeMediaPlayMode(PolyvMediaPlayMode.MODE_VIDEO);
音频和视频模式的切换业务在PolyvCloudClassMoreLayout
(右上角的更多布局)中有示例。
public interface IPolyvMediaController<T> extends IMediaController {
//...
/**
* 初始化多码率试图
* @param bitrateVO
*/
void initialBitrate(PolyvBitrateVO bitrateVO);
//...
}
在播放器拉流之前,播放器会回调该方法,IPolyvMediaController
的实现类例如:PolyvCloudClassMediaController
对应的方法会回调并拿到码率对象。在demo中,码率对象传输到PolyvCloudClassMoreLayout
中处理。
PolyvCloudClassVideoView#changeBitRate(int bitrate)
在demo中,用户通过PolyvCloudClassMediaController
的右上角的“更多”界面选择码率切换,在PolyvCloudClassMoreLayout.OnBitrateSelectedListener
回调中监听到选择码率的事件,调用了上述方法。参数bitrate是指获取到的码率数据中支持的码率数组的下标。
public interface IPolyvMediaController<T> extends IMediaController {
//...
/**
* 初始化多綫路试图
* @param lines
*/
void initialLines(List<PolyvLiveLinesVO> lines);
//...
}
在播放器拉流之前,播放器会回调该方法,IPolyvMediaController
的实现类例如:PolyvCloudClassMediaController
对应的方法会回调并拿到多线路对象。在demo中,多线路对象传输到PolyvCloudClassMoreLayout
中处理。
PolyvCloudClassVideoView#changeLines(int linePos);
在PolyvCloudClassMediaController
中:
moreLayout.setOnLinesSelectedListener(new PolyvCloudClassMoreLayout.OnLinesSelectedListener() {
@Override
public void onLineSelected(PolyvLiveLinesVO line, int linePos) {
polyvVideoView.changeLines(linePos);
}
});
追帧功能默认是关闭的,需要在代码中手动开启:
PolyvCloudClassVideoView#enableFrameSkip(boolean enable);
注意:开启追帧功能后,如果观看端的网络环境较差,则会引起更频繁的卡顿。
播放器默认使用软解播放,如果需要切换硬解,可以调用如下方法:
PolyvCloudClassVideoView#setDecodeMode(int decodeMode);//参数0:软解,1:硬解,默认软解
注意:使用硬解在部分手机会存在兼容性问题,可能会导致无法播放等问题。
直播播放器的事件监听的用法全部位于类: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();
在PolyvCloudClassVideoItem
中对手势滑动回调进行了基本的处理:亮度和音量的调节
OnGestureLeftUpListener
OnGestureLeftDownListener
OnGestureRightUpListener
OnGestureRightDownListener
OnGestureSwipeLeftListener
OnGestureSwipeRightListener
通过对播放器设置一个辅助播放器,来播放暖场视频。
在PolyvCloudClassVideoItem
中
//设置辅助播放器,不能为null
PolyvAuxiliaryVideoview subVideoview = findViewById(R.id.sub_videoview);
polyvCloudClassVideoView.setSubVideoView(subVideoview);
在PolyvCloudClassVideoItem#initialVideoView()
中有对跑马灯进行处理,跑马灯接收后台设置的跑马灯样式然后显示。
polyvCloudClassVideoView.setOnGetMarqueeVoListener(new IPolyvCloudClassListenerEvent.OnGetMarqueeVoListener() {
@Override
public void onGetMarqueeVo(PolyvLiveMarqueeVO marqueeVo) {
//PolyvLiveMarqueeVO是后台设置的跑马灯的数据结构
//处理逻辑参考PolyvCloudClassVideoItem
}
});
弹幕和聊天室的消息会同步。
//修改样式
private void initView()
//隐藏
public void hide()
//显示
public void show()
//发送弹幕
public void sendDanmaku(CharSequence message)
IPolyvLandscapeDanmuSender
的实现类PolyvLandscapeDanmuSendPanel
在PolyvCloudClassVideoItem
中实例化,可根据需要自定义横屏发送弹幕的逻辑