上一篇博客談到了騰訊雲直播功能的基本實現方案,本篇將重點談及一些細的功能。
一、推流端細功能介紹
①設置推流清晰度
注意:推流開始之後切換推流碼率先停止推流,切換碼率之後再重啓推流,以防止花屏問題發生
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 支持兩種對焦模式:手動對焦和自動對焦。自動對焦是系統提供的能力,但有些機型並不支持自動對焦。手動對焦和自動對焦是互斥的,開啓自動對焦後,手動對焦將不生效。SDK 默認配置是手動對焦,您可以通過 TXLivePushConfig 的配置函數 setTouchFocus 接口進行切換:
mLivePushConfig.setTouchFocus(mTouchFocus);
mLivePusher.setConfig(mLivePushConfig);
④橫豎屏推流問題,當前推流的Activity加入以下屬性<activity
android:name="com.example.zachary.ui.PushActivity"
android:configChanges="orientation|keyboardHidden|screenSize" />
該屬性保證當前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();
③卡頓與延時文檔推薦:https://www.qcloud.com/document/product/454/7946#5.-.E6.92.AD.E6.94.BE.E7.AB.AF.E7.9A.84.E4.BC.98.E5.8C.969
三種模式的對接代碼
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);
//設置完成之後再啓動播放
至此我在項目中用到的騰訊雲直播功能基本都已經介紹了,雖然騰訊雲官方文檔很詳細但是做項目總會有一些坑得你自己爬,如果你在項目集成時遇到了類似的坑歡迎評論區留言交流。後面兩到三篇會介紹IM SDK在直播聊天室的運用以及dfm彈幕庫的使用,歡迎交流討論。