Как сбросить рендерер трека видео из удаленного медиапотока webrt c android - PullRequest
1 голос
/ 29 марта 2020

Когда пользователь приходит на экран вызова, рендерер видео дорожки был настроен нормально. Либо пользователь выполняет другое действие, либо возвращается, не завершая сеанс видеовызова, но когда пользователь возвращается к действию вызова, я должен установить удаленный поток мультимедиа, которого я не смог достичь успешно. Итак, я реализовал разные подходы, но приложение получило 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)

приложение работает нормально, и появляется черный экран.

...