我正在尝试在Android上进行WebRTC调用期间正确处理屏幕旋转。 但是在第一次旋转后,本地视频翻译停止了。 创建(或重新创建)活动后,我将为本地和远程视图创建SurfaceViewRenderers:
ourView.init(eglBase.eglBaseContext, null)
ourView.setScalingType(RendererCommon.ScalingType.SCALE_ASPECT_FIT)
ourView.setZOrderMediaOverlay(true)
ourView.setEnableHardwareScaler(true)
ourView.setMirror(true)
theirView.init(eglBase.eglBaseContext, null)
theirView.setScalingType(RendererCommon.ScalingType.SCALE_ASPECT_FIT)
theirView.setEnableHardwareScaler(false)
theirView.setMirror(true)
localVideoSyncer.setTarget(ourView)
remoteVideoSyncer.setTarget(theirView)
之后,如果这是第一次必须创建连接,则我正在初始化对等连接:
iceConnected = false
val dataChannelParameters = CallUtils.createChannelParameters()
peerConnectionParameters = CallUtils.createConnectionParameters(videoWidth, videoHeight, dataChannelParameters)
if(appRTCClient == null) {
appRTCClient = CallUtils.createAppRTCClient(roomId, this, info?.ice ?: emptyList())
}
roomConnectionParameters = CallUtils.createRoomConnectionParameters(info?.address, roomId)
if(peerConnectionClient == null) {
peerConnectionClient = PeerConnectionClient(
applicationContext, eglBase, peerConnectionParameters, this)
}
val options = PeerConnectionFactory.Options()
peerConnectionClient!!.createPeerConnectionFactory(options)
if (appRTCClient == null) {
NetworkLogger.log(TAG,"AppRTC client is not allocated for a call.")
return
}
if(callStartedTimeMs == 0L)
callStartedTimeMs = System.currentTimeMillis()
appRTCClient!!.connectToRoom(roomConnectionParameters!!)
if(audioManager == null)
audioManager = AppRTCAudioManager(applicationContext)
如果重新创建活动,则PeerConnectionClient不再可以将视频发送到远程目标。我试图重新分配localRender和videoCapturer,但这没有任何效果。重新创建活动后可以重用现有的连接吗?
答案 0 :(得分:0)
我认为这里最好的解决方案是将appRTCClient和相关对象置于活动之外,并使它们独立于活动的生命周期。使用applicationContext就是为什么您可以将其存储在依赖于应用程序生命周期的某个单调中的原因。另一种方法是在活动中使用片段来显示聊天窗口,并在onConfigurationChanged方法中手动处理旋转,因此您必须将肖像片段替换为风景片段。