騰訊雲直播相關問題處理
問題①:彈幕有時候沒有從最右邊出現,一開始就顯示在彈幕區中間,是因為上一條彈幕劃過改變了起始位置。
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連結