客户端View相关的常见问题

本章节为您介绍了客户端View相关的常见问题及解决办法。

常见问题一:Android端黑屏一会才显示视频内容

Android 端有时候会见到视频在正常显示之前会黑一会,这是由于SurfaceViewSurface创建到视频的第一帧渲染的时间过长导致(因为Surface默认为黑色)。这里分两种情况解决:

  1. 如果是本地视频预览:建议调用 setLocalViewConfig 之后马上调用startPreview。

  2. 如果是远端视频渲染:建议在 onFirstVideoFrameReceived 回调中调用setRemoteViewConfig,将 SurfaceView 传给SDK。

常见问题二:Android端大小流切换时黑屏

大小流切换时使用一个新的SurfaceView来显示另外一个类型的视频流,由于新创建的Surface默认为黑色导致了这一问题。建议大小流切换时不要切换SurfaceView,只是改变SurfaceView的位置和大小,具体方案有两个:

  1. SurfaceView 从原来的 ViewGroup 移除,然后在大小流切换成功之后(onSubscribeStreamTypeChanged回调中)添加到另外一个 ViewGroup 中。

  2. 直接修改SurfaceView的位置和大小。

常见问题三:View 对象泄露

RTC 3.0 版本开始,可以通过调用 setLocalViewConfig 和 setRemoteViewConfig 接口,实现同一个视频渲染到多个View中。

这种能力给开发者提供了灵活性,同时也带来了 View 泄露的风险:当对同一路视频设置多个 View 时,这些 View 都会被 SDK 持有,即使 App 已经释放这些 View,从而导致 View 的泄露。

当 App 不再需要使用这些 View 的时候,可以通过以下两种方式对这些 View 进行释放:

  1. 将 DingRtcVideoCanvas 的 toBeRemoved 字段设置为 true ,并且再次调用 setLocalViewConfig 或 setRemoteViewConfig ,这样会释放 DingRtcVideoCanvas 中指定的 View;

  2. 将 DingRtcVideoCanvas 对象设置为 null,并且再次调用 setLocalViewConfig 或 setRemoteViewConfig,这样会释放与该视频流绑定的全部 View;

常见的场景:

  1. 每次订阅新的视频流,都创建新的 View 与该流进行绑定:这种情况,在视频无需渲染的时候,务必采用上面两种任一方式对 View 进行释放。

  2. 创建一个 View 对象池进行复用:每次 View 用完放入到对象池之前,务必采用上面两种任一方式对 View 进行释放。

常见问题四:横竖屏切换之后推流画面放大

在未调用Camera Zoom相关接口的情况下,推流的画面感觉被放大。这是由于推流过程中发生了横竖屏切换,而setVideoEncoderConfiguration接口中设置的orientationMode参数为固定横屏或者固定竖屏,这样在发生横竖屏切换以后,就会发生画面裁剪,感觉就像画面放大。解决的方案就是将orientationMode参数设置为DingRtcVideoEncoderOrientationModeAdaptive 自适应模式。