Quickblox 错误,& remote/local 视频轨道未在 QBRTCSurfaceView 中呈现
Quickblox error, & remote/local video track is not rendering in QBRTCSurfaceView
2021-03-06 17:56:41.069 2475-3124/com.example.app I/org.webrtc.Logging:EglRenderer:local_video_viewDropping 帧 - 无表面
这就是我正在经历的 error/warning。 remote/local 视频轨道未在 QBRTCSurfaceView 中呈现。
fun onCreateView() {
....
binding?.remoteVideoView?.init(QBRTCClient.getInstance(requireContext()).eglContext.eglBaseContext, null)
binding?.remoteVideoView?.setZOrderMediaOverlay(true)
binding?.localVideoView?.init(QBRTCClient.getInstance(requireContext()).eglContext.eglBaseContext, null)
binding?.localVideoView?.setZOrderMediaOverlay(true)
return binding?.root
}
//region QBRTCClientVideoTracksCallbacks
override fun onLocalVideoTrackReceive(qbrtcSession: QBRTCSession?, videoTrack: QBRTCVideoTrack) {
localVideoTrack = videoTrack
localVideoTrack?.let {
binding?.localVideoView?.let { v ->
fillVideoView(v, videoTrack)
}
}
}
override fun onRemoteVideoTrackReceive(session: QBRTCSession?, videoTrack: QBRTCVideoTrack, userID: Int?) {
remoteVideoTrack = videoTrack
binding?.remoteVideoView?.let { v ->
fillVideoView(v, videoTrack)
}
}
private fun fillVideoView(videoView: QBRTCSurfaceView?, videoTrack: QBRTCVideoTrack) {
videoTrack.cleanUp()
if (videoView != null) {
videoTrack.addRenderer(videoView)
updateVideoView(videoView)
}
}
private fun updateVideoView(videoView: SurfaceViewRenderer) {
val scalingType = RendererCommon.ScalingType.SCALE_ASPECT_FILL
videoView.setScalingType(scalingType)
videoView.setMirror(false)
videoView.requestLayout()
}
这是我的问题的更新:
那么,QBRTCSurfaceViews 是否在单个 activity 应用程序中工作,在类型为“BottomSheetDialogFragment”的片段中?
我有一个带有 MainFragment 的 activity 应用程序,当我使用 NavDirections 推送一个新的 Fragment (FragmentB) 时,会显示一个包含 QBRTCSurfaceView 的 BottomSheetDialogFragment (FragmentC); QBRTCSurfaceViews 不呈现本地(部分)或远程轨道,而仅呈现 QBRTCSurfaceViews 的红色背景。但是底部正在渲染本地轨道,但它只显示了部分渲染。
本地曲目phone是三星SM-S111DL。
远程轨道 Phone 是 Google 像素 2。
Local Track 仅在 phone 屏幕之外的具有主页和向上按钮的部分呈现(在 MainActivity 之外,所以这很奇怪)。
这是否意味着我必须在 activity 的第一个子片段内显示 QBRTCSurfaceView?
如:
MainActivity显示CallActivity->FirstFragment->QBRTCSurfaceViews
目前我有:
MainActivity -> 使用 nav_graph 的多个片段 -> 我推送包含 QBRTCSurfaceViews
的 BottomSheetDialogFragment
此外,音频工作 100% 正常,所有 Quickblox 回调都正确触发,只是渲染在本地被切断,远程渲染没有显示,我相信这是因为我的 QBRTCSurfaceViews与 Quickblox 示例一样,不在 Activity 的第一个子片段内。
我检查了示例,示例应用程序不是单个 activity 应用程序。这意味着它在创建 android 应用程序时没有遵循最新推荐的最佳做法。如果我需要显示一个 CallingActivity,然后是一个 Fragment,然后将我的 QBRTCSurfaceViews 添加到那个 Fragment,那很好,但是文档没有告诉用户这个限制。另外,QBRTCSurfaceViews 是否与 BottomSheetDialogFragment 一起工作? https://docs.quickblox.com/docs/android-video-calling
我找到了答案,如果您对 QBRTCSurfaceViews 有疑问,请检查 android SurfaceView 选项以根据您的设置进行配置 https://developer.android.com/reference/android/view/SurfaceView
2021-03-06 17:56:41.069 2475-3124/com.example.app I/org.webrtc.Logging:EglRenderer:local_video_viewDropping 帧 - 无表面
这就是我正在经历的 error/warning。 remote/local 视频轨道未在 QBRTCSurfaceView 中呈现。
fun onCreateView() {
....
binding?.remoteVideoView?.init(QBRTCClient.getInstance(requireContext()).eglContext.eglBaseContext, null)
binding?.remoteVideoView?.setZOrderMediaOverlay(true)
binding?.localVideoView?.init(QBRTCClient.getInstance(requireContext()).eglContext.eglBaseContext, null)
binding?.localVideoView?.setZOrderMediaOverlay(true)
return binding?.root
}
//region QBRTCClientVideoTracksCallbacks
override fun onLocalVideoTrackReceive(qbrtcSession: QBRTCSession?, videoTrack: QBRTCVideoTrack) {
localVideoTrack = videoTrack
localVideoTrack?.let {
binding?.localVideoView?.let { v ->
fillVideoView(v, videoTrack)
}
}
}
override fun onRemoteVideoTrackReceive(session: QBRTCSession?, videoTrack: QBRTCVideoTrack, userID: Int?) {
remoteVideoTrack = videoTrack
binding?.remoteVideoView?.let { v ->
fillVideoView(v, videoTrack)
}
}
private fun fillVideoView(videoView: QBRTCSurfaceView?, videoTrack: QBRTCVideoTrack) {
videoTrack.cleanUp()
if (videoView != null) {
videoTrack.addRenderer(videoView)
updateVideoView(videoView)
}
}
private fun updateVideoView(videoView: SurfaceViewRenderer) {
val scalingType = RendererCommon.ScalingType.SCALE_ASPECT_FILL
videoView.setScalingType(scalingType)
videoView.setMirror(false)
videoView.requestLayout()
}
这是我的问题的更新:
那么,QBRTCSurfaceViews 是否在单个 activity 应用程序中工作,在类型为“BottomSheetDialogFragment”的片段中?
我有一个带有 MainFragment 的 activity 应用程序,当我使用 NavDirections 推送一个新的 Fragment (FragmentB) 时,会显示一个包含 QBRTCSurfaceView 的 BottomSheetDialogFragment (FragmentC); QBRTCSurfaceViews 不呈现本地(部分)或远程轨道,而仅呈现 QBRTCSurfaceViews 的红色背景。但是底部正在渲染本地轨道,但它只显示了部分渲染。
本地曲目phone是三星SM-S111DL。 远程轨道 Phone 是 Google 像素 2。
Local Track 仅在 phone 屏幕之外的具有主页和向上按钮的部分呈现(在 MainActivity 之外,所以这很奇怪)。
这是否意味着我必须在 activity 的第一个子片段内显示 QBRTCSurfaceView?
如: MainActivity显示CallActivity->FirstFragment->QBRTCSurfaceViews
目前我有: MainActivity -> 使用 nav_graph 的多个片段 -> 我推送包含 QBRTCSurfaceViews
的 BottomSheetDialogFragment此外,音频工作 100% 正常,所有 Quickblox 回调都正确触发,只是渲染在本地被切断,远程渲染没有显示,我相信这是因为我的 QBRTCSurfaceViews与 Quickblox 示例一样,不在 Activity 的第一个子片段内。
我检查了示例,示例应用程序不是单个 activity 应用程序。这意味着它在创建 android 应用程序时没有遵循最新推荐的最佳做法。如果我需要显示一个 CallingActivity,然后是一个 Fragment,然后将我的 QBRTCSurfaceViews 添加到那个 Fragment,那很好,但是文档没有告诉用户这个限制。另外,QBRTCSurfaceViews 是否与 BottomSheetDialogFragment 一起工作? https://docs.quickblox.com/docs/android-video-calling
我找到了答案,如果您对 QBRTCSurfaceViews 有疑问,请检查 android SurfaceView 选项以根据您的设置进行配置 https://developer.android.com/reference/android/view/SurfaceView