Когда пользователь приходит на экран вызова, рендерер видео дорожки был настроен нормально. Либо пользователь выполняет другое действие, либо возвращается, не завершая сеанс видеовызова, но когда пользователь возвращается к действию вызова, я должен установить удаленный поток мультимедиа, которого я не смог достичь успешно. Итак, я реализовал разные подходы, но приложение получило sh, когда я установил рендерер на удаленный поток.
Первый раз, когда я установил удаленный поток мультимедиа в onAddRemoteStream()
, который работает хорошо.
override fun onAddRemoteStream(remoteStream: MediaStream, pcId: String, endPoint: Int) {
val renderer = VideoRenderer(remoteRender)
remoteStream.videoTracks[0].addRenderer(renderer)
WebrtcClient.getInstance().peerConnections[pcId]?.videoRenderer = renderer
VideoRendererGui.update(remoteRender,
REMOTE_X, REMOTE_Y,
REMOTE_WIDTH, REMOTE_HEIGHT, scalingType, true)
VideoRendererGui.update(localRender,
LOCAL_X_CONNECTED, LOCAL_Y_CONNECTED,
LOCAL_WIDTH_CONNECTED, LOCAL_HEIGHT_CONNECTED,
scalingType, true)
}
Инициализация webrt c клиент
private fun init() {
val displaySize = Point()
windowManager.defaultDisplay.getSize(displaySize)
val params = PeerConnectionParameters(
true, false, displaySize.x, displaySize.y, 30, 1,
VIDEO_CODEC_VP9, true, 1, AUDIO_CODEC_OPUS, true)
WebrtcClient.getInstance().webRtcClient(this, params, VideoRendererGui.getEGLContext())
}
Подготовка webrt c клиент
public void webRtcClient(RtcListener listener, PeerConnectionParameters params, EGLContext mEGLcontext) {
mListener = listener;
pcParams = params;
pcConstraints = new MediaConstraints();
PeerConnectionFactory.initializeAndroidGlobals(listener, true, true,
params.videoCodecHwAcceleration, mEGLcontext);
factory = new PeerConnectionFactory();
pcConstraints.mandatory.add(new MediaConstraints.KeyValuePair("OfferToReceiveAudio", "true"));
pcConstraints.mandatory.add(new MediaConstraints.KeyValuePair("OfferToReceiveVideo", "true"));
pcConstraints.optional.add(new MediaConstraints.KeyValuePair("DtlsSrtpKeyAgreement", "true"));
}
Второй раз я пытаюсь установить в VideoRendererGui.setView(glview_call) { \\... }
внутри него. Но приложение снова и снова обрабатывается sh.
private fun initWebrtc() {
glview_call.preserveEGLContextOnPause = true
glview_call.keepScreenOn = true
// Video Calling
VideoRendererGui.setView(glview_call) {
if (!WebrtcClient.getInstance().onResumingCalling) {
// Initializing Call
init()
} else {
// on call resuming
// Set local media stream
val localStream = WebrtcClient.getInstance().localMediaStream
if (localStream.videoTracks.size > 0) {
localStream.videoTracks[0].addRenderer(VideoRenderer(localRender))
VideoRendererGui.update(localRender,
LOCAL_X_CONNECTED, LOCAL_Y_CONNECTED,
LOCAL_WIDTH_CONNECTED, LOCAL_HEIGHT_CONNECTED,
scalingType, true)
}
WebrtcClient.getInstance().callingInfo.users.forEach {
val peer = WebrtcClient.getInstance().peerConnections[it.user?.id]
// 'peer' get return each user peer connection
peer?.let { p ->
p.remoteMediaStream?.let { mediaStream ->
// Checking video track linkedList length
if (mediaStream.videoTracks.size > 0) {
// removing old video renderer from video track
mediaStream.videoTracks.first.removeRenderer(p.videoRenderer)
// New renderer to show remote media stream
val renderer = VideoRenderer(remoteRender)
mediaStream.videoTracks[0].addRenderer(renderer)
p.videoRenderer = renderer
VideoRendererGui.update(remoteRender,
REMOTE_X,
REMOTE_Y, REMOTE_WIDTH,
REMOTE_HEIGHT, scalingType, true
)
}
}
}
}
}
}
// remote render
remoteRender = VideoRendererGui.create(
REMOTE_X,
REMOTE_Y, REMOTE_WIDTH,
REMOTE_HEIGHT, scalingType, true)
localRender = VideoRendererGui.create(
LOCAL_X_CONNECTING,
LOCAL_Y_CONNECTING,
LOCAL_WIDTH_CONNECTING,
LOCAL_HEIGHT_CONNECTING, scalingType, true)
}
Если я прокомментирую:
val renderer = VideoRenderer (remoteRender)
mediaStream.videoTracks [0] .addRenderer (средство визуализации)
VideoRenderer Gui .update (remoteRender, REMOTE_X, REMOTE_Y, REMOTE_WIDTH, REMOTE_HEIGHT, scalingType, true)
приложение работает нормально, и появляется черный экран.