上一篇博客谈到了腾讯云直播功能的基本实现方案,本篇将重点谈及一些细的功能。
一、推流端细功能介绍
①设置推流清晰度
注意:推流开始之后切换推流码率先停止推流,切换码率之后再重启推流,以防止花屏问题发生
mTXLivePusher.stopPusher();
mTXLivePusher.setVideoQuality(TXLiveConstants.VIDEO_QUALITY_STANDARD_DEFINITION);
mTXLivePusher.startPusher(TCConstants.PUBLISH_URL);
②设置美颜等级,setBeautyFilter 接口可以设置美颜和美白级别,两者的调整级别都是 0 至 9,0 表示不启用美颜;瘦脸,扩眼是升级版sdk的功能需要购买
mTXLivePusher.setBeautyFilter(7, 3);
mTXPushConfig.setFaceSlimLevel(5);
mTXPushConfig.setEyeScaleLevel(3);
③控制摄像头,默认是前置摄像头,调用一次前后调整一次
mTXLivePusher.switchCamera();
//mFlashTurnOn为true表示闪光灯打开,否则表示关闭
if (!mLivePusher.turnOnFlashLight(mFlashTurnOn)) {
Toast.makeText(getActivity().getApplicationContext(),
"打开闪光灯失败:绝大部分手机不支持前置闪光灯!", Toast.LENGTH_SHORT).show();
}
大部分后置摄像头才支持对焦,SDK 支持两种对焦模式:手动对焦和自动对焦。自动对焦是系统提供的能力,但有些机型并不支持自动对焦。手动对焦和自动对焦是互斥的,开启自动对焦后,手动对焦将不生效。
mLivePushConfig.setTouchFocus(mTouchFocus);
mLivePusher.setConfig(mLivePushConfig);
④横竖屏推流问题,当前推流的Activity加入以下属性
该属性保证当前Activity在横竖屏切换时不重新走生命周期,直接回调onConfigurationChanged方法
//横竖屏推流处理
@Override
public void onConfigurationChanged(Configuration newConfig) {
// 自动旋转打开,Activity随手机方向旋转之后,只需要改变推流方向
int mobileRotation = this.getWindowManager().getDefaultDisplay().getRotation();
int pushRotation = TXLiveConstants.VIDEO_ANGLE_HOME_DOWN;
//观众端图像处理
switch (mobileRotation) {
case Surface.ROTATION_0:
pushRotation = TXLiveConstants.VIDEO_ANGLE_HOME_DOWN;
break;
case Surface.ROTATION_90:
pushRotation = TXLiveConstants.VIDEO_ANGLE_HOME_RIGHT;
break;
case Surface.ROTATION_270:
pushRotation = TXLiveConstants.VIDEO_ANGLE_HOME_LEFT;
break;
default:
break;
}
//通过设置config是设置生效,可以不用重新推流,腾讯云支持直播中热切换分辨率
//主播端图像处理
mTXLivePusher.setRenderRotation(0);
mTXPushConfig.setHomeOrientation(pushRotation);
mTXLivePusher.setConfig(mTXPushConfig);
}
⑤事件监听,实现TXLivePushListener 接口即可,相应响应码如下
@Override
public void onPlayEvent(int event, Bundle param) {
// 反馈播放端该流地址无视频
if (event < 0) {
}
//视频断流
if (event == TXLiveConstants.PLAY_ERR_NET_DISCONNECT) {
}
if (TXLiveConstants.PLAY_EVT_PLAY_BEGIN == event) {
}
if (TXLiveConstants.PLAY_EVT_PLAY_LOADING == event) {
}
}
二、播放端细功能介绍
①播放端画面调整,可选择全屏填充或者按比例缩放
livePlayer.setRenderMode(TXLiveConstants.RENDER_MODE_FULL_FILL_SCREEN);
// 设置播放端竖屏
txvvPlayerView.setRenderRotation(TXLiveConstants.RENDER_ROTATION_PORTRAIT);
注意:播放端的视频展示有时候按业务需求需要监听推流端是横屏推流还是竖屏推流,以下将提供一种解决思路
@Override
public void onNetStatus(Bundle bundle) {
int width = Integer.parseInt(bundle.get(TXLiveConstants.NET_STATUS_VIDEO_WIDTH).toString());
int height = Integer.parseInt(bundle.get(TXLiveConstants.NET_STATUS_VIDEO_HEIGHT).toString());
if (width != 0 && height != 0) {
if (width > height) {
// 横屏推流
isPortraitPusher = false;
if (fullScreen) {
mTxlpPlayer.pause();
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
mTxlpPlayer.resume();
}
} else {
// 竖屏推流
isPortraitPusher = true;
if (fullScreen) {
mTxlpPlayer.pause();
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
mTxlpPlayer.resume();
}
}
}
}
onNetStatus是播放端TXLivePlayListener监听事件重写的方法,该方法通过比较推流视频的横纵大小判断是16:9或者9:16的视频推送,onNetStatus每秒钟会监听响应一次结果,前两次的回调结果无论宽高都是0不具有可比性所以判断中将其过滤掉了。
②暂停播放功能,在直播过程中调用pause,效果等同于暂时停止拉流,播放器不会被销毁,但会显示最后一帧画面。
// 暂停
mLivePlayer.pause();
// 继续
mLivePlayer.resume();
③卡顿与延时
TXLivePlayConfig mPlayConfig = new TXLivePlayConfig();
//自动模式
mPlayConfig.setAutoAdjustCacheTime(true);
mPlayConfig.setMinAutoAdjustCacheTime(1);
mPlayConfig.setMaxAutoAdjustCacheTime(5);
//极速模式
mPlayConfig.setAutoAdjustCacheTime(true);
mPlayConfig.setMinAutoAdjustCacheTime(1);
mPlayConfig.setMaxAutoAdjustCacheTime(1);
//流畅模式
mPlayConfig.setAutoAdjustCacheTime(false);
mPlayConfig.setCacheTime(5);
mLivePlayer.setConfig(mPlayConfig);
//设置完成之后再启动播放
直播Demo