问题①:弹幕有时候没有从最右边出现,一开始就显示在弹幕区中间,是因为上一条弹幕划过改变了起始位置。
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链接
