問題①:彈幕有時候沒有從最右邊出現,一開始就顯示在彈幕區中間,是因爲上一條彈幕劃過改變了起始位置。
mDanmakuView.pause();
mDanmakuView.addDanmaku(danmaku);
mDanmakuView.resume();
在添加彈幕前暫停,添加完之後恢復,要注意的是該方法有可能阻塞消息併發,最好放在最終添加彈幕處處理該問題,比如在addDanmuInternal方法的添加彈幕處修改。
問題②:主播端橫豎屏直播,彈幕顯示問題。
在上篇博客騰訊雲直播下中提到過橫豎屏推流的處理,現在出現的一個問題是 onConfigurationChanged方法沒有被調用,但是主播旋轉手機的時候確實是在橫豎屏推流切換,那麼彈幕區的佈局就會導致彈幕對於主播來說並不總是從右往左。所以我們需要主播端的activity按照重力感應器處理界面橫豎屏。解決方案如下
一、添加權限
<uses-permission android:name="android.permission.CHANGE_CONFIGURATION" />
二、強制開啓屏幕旋轉效果,將橫豎屏的處理交還給SENSOR傳感器,放在onCreate的setContentView之後就好。
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
注意:當橫屏直播時主播直接退出直播,finish掉直播activity時,相關聯的界面是豎屏模式會造成崩潰的可能,可以在manifest文件中配置主播activity和相關的activity屬性android:screenOrientation="portrait"
問題③:觀看端半屏全屏播放控制
我們一般會給視頻播放器添加一個全屏按鈕,以便於觀衆可以自由選擇喜歡的觀看模式,那麼該如何設置按鈕和activity的狀態呢。半屏全屏可以根據佈局的weight來分配播放器的空間,全屏時騰訊雲提供了視頻播放旋轉270度的方法,但是該方法並不會改變activity的橫豎屏狀態,所以就會出現彈幕方向以及軟鍵盤彈出方向都不對的問題。下面提供一種設置方法。
@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();
}
}
}
}
以上是騰訊雲提供的一個觀看端的狀態回調,每秒響應一次,其中setRequestedOrientation方法就是設置activity狀態的關鍵。當然manifest依然需要配置configChanges屬性。該方法解決了橫豎屏問題,相關的頁面佈局也就會跟隨變化,你如果嫌這種頁面佈局醜又不怕麻煩的話可以讓UI設計兩套佈局分別放置在不同的layout文件夾效果如下。
問題④:主播端預覽畫面黑屏(部分機器,比如小米Max 榮耀8)
mTXCloudVideoView.enableHardwareDecode(true);
在開始攝像頭預覽前加入以上代碼,作用爲開啓硬件加速,可改變部分機型不能支持直播需要的資源消耗 cpu gpu 等情況,還能讓正常的機型更好的支持直播功能。
一些解釋:本來預備將demo上傳csdn,各位碼友看博客介紹時也好有個參考,demo有問題也可以相互探討,奈何csdn限制太高,本碼農等級太低只有60M的上傳權限,所以就傳個簡潔版,有問題可以留言提出相互探討demo鏈接