本文将就接入TRTC中常碰到视频相关的问题进行分析和探讨,由于小编水平有限,如有误的地方,欢迎读者朋友评论指正。
随着移动互联网普及,移动设备和高清摄像头在日常生活和工作中大量使用,人们产生海量的视频数据,如何高效实时采集、传输、显示视频数据,成为当下各方参与者摩拳擦掌的竞技舞台,TRTC是将腾讯多年来在网络与音视频技术上的深度积累,以多人音视频通话和低延时互动直播两大场景化方案,TRTC音视频解决方案是其中的佼佼者。
在开发者接入TRTC时候常常会遇到一些困难情况,作为一线的开发人员该如何排查这些问题呢?下面小编整理了一些视频相关的问题供大家参考。
黑屏就视频画面不显示,通常分为推流端端预览画面黑屏和拉流端的拉流画面黑屏,这时候需要根据场景来判断。
视频花屏问题比较少见,这类问题通常是涉及到底层的硬件编码器解码异常导致的。
如果网络出现严重的丢包和延时,可能会导致 I 帧导致,因为 P 帧和 B 帧的解码都依赖于 I 帧,如果 I 帧丢失了,P 帧和 B 帧都会解码失败,于是画面就会花屏、拖影、绿屏等情况,可以用ffplay、VLC、Potplayer 同时播放一下同一路流,如果播放器都出现花屏、绿屏的情况,通常就是音视频源码流就存在问题。
这类情况通常出现在 Android 设备上,一些 Android 设备的硬件编解码器实现不好,兼容性不佳。这种情况,最好的办法,换软编软解对比。
大多数的播放器一般只会在开始解码之前解析一次 metadata 设置解码参数,当画面发生变化,例如分辨率变化了,但播放器解码参 数没有重新配置,就有可能导致花屏、绿屏,这种情况下,最好的办法是推流端 在直播过程中不改变编码参数,这样就不会引起 metadata 信息的修改。
推流端和播放端颜色格式不一致导致,例如推流端使用的是 NV12,而播放端支持的是 I420,则解码时就会因为颜色格式不一致而显示为花屏、绿屏等情况。这 种情况下,统一推拉流两端的颜色格式。
清晰度主要和码率有关,这时候需要检查 SDK 码率是否配置的比较低,如果高分辨率低码率容易产生马赛克等模糊现象。
TRTC 会通过云端 QOS 流控策略,根据网络状况动态调整码率、分辨率,网络比较差时容易降低码率导致清晰度下降。如果想避免画面模糊的情况,可以把最小码率和码率设置为同一个值。
检查进房时使用的 VideoCall 模式还是 Live 模式,针对通话场景 VideoCall 模式主打低延时和保流畅,所以在弱网情况下会更容易牺牲画质确保流畅,对画质更加看重的场景建议使用 Live 模式。
使用muteLocalVideo,muteRemoteVideoStream接口暂停视频都只会在当前房房间内有效,在退出房间后,这些状态将会重置。如果在重新进入房间后,要继续保存暂停状态,需要重新调用muteLocalVideo。
当推流端上行带宽或拉流端下行带宽不足,都会出现丢包现象,如果发送帧率远低于采集帧率,比如:采集15帧,到达云端只有8帧,拉流端观看的视频画面会出现卡顿现象。这是需要排查一下用户网络是否拥堵。另外,采集分辨率是否设置过高,超过用户上行下行的带宽对情况。
查看帧率和 CPU 占用率,帧率比较低和 CPU 使用率过高都会导致卡顿现象。这需要关闭占有CPU较高的应用,观察是否恢复正常的帧率和CPU使用率。
如果用户的网络拥堵,剩余带宽不足以满足视频流推流和拉流的码率要求,会出现丢包现象,另外如果网络连接不稳定也会出现,比如连的是4G网络在信号较差的地方。这时候需要提醒用户切换网络。
如果同一个房间有两个以上的相同UserId进房,并同时推流,拉流端会出现严重的丢包现象。这时候属于非法操作,应该排查原因,并避免相同UserId用户进房。
SDK渲染远端视频分为填充和适应两种方式。在显示View组件的宽和高跟视频分辨率比例不一致时候,就会按这两种方式渲染,其中默认的渲染方式是填充,该模式下会把视频等比例拉伸,直至填满View的可视区域,不可避免的出现一部分视频画面被剪裁的情况。如果需要显示完整视频的画面,需要把渲染模式改为“适应模式”。
参考文档:画面渲染模式
SDK渲染远端视频分为填充和适应两种方式。在适应模式下,在显示View宽和高跟视频分辨率比例不一致会导致出现黑边现象,如果需要消除黑边现象,可以把渲染模式设置为“填充模式”,视频画面会被放大一部分,直至填充满整个显示组件。
通过setLocalRenderParams接口设置本地画面渲染参数,把TRTCRenderParams.fillMode 设置为 TRTCVideoFillMode_Fill模式。
通过setRemoteRenderParams接口设置远端画面渲染参数,把TRTCRenderParams.fillMode 设置为 TRTCVideoFillMode_Fill模式。
需要设置 setGSensorMode() 为 TRTCGSensorMode_Disable,关闭重力感应,否则调用 setVideoEncoderRotation 后远端用户观看到的画面不会变化。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。