4

SurfaceViewRendererランドスケープ/リバースランドスケープ/センサーランドスケープでアクティビティを実行するたびにプレビューが空白になるという奇妙な問題に直面しています。奇妙な問題は、一部の電話でビデオ プレビューが逆の横向きモードで機能し、一部の電話が横向きモードで機能することです。たとえば、 でアクティビティを実行するとAndroid 5.0、横向きモードのビデオ プレビューは正常に機能しますが、逆横向きモードでは機能しません。次に、実行中のOneplus電話で同じことを試みましたAndroid 10。ここで、SurfaceViewRenderer のビデオ プレビューは、逆ランドスケープ モードでは正常に機能しますが、ランドスケープ モードでは機能しません。

注: プレビューが空白になっても、リモート ストリーミングは問題なく正常に動作し、ビデオ プレビューのみが動作しません。どういうわけか更新に失敗してSurfaceViewRendererいますが、リモート参加者へのストリーミングに問題はありません。

<androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".ui.session.activities.LiveSessionActivity">

  
        <org.webrtc.SurfaceViewRenderer
            android:id="@+id/localGLSurfaceView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:visibility="visible" />

        <View
            android:id="@+id/vBackground"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:alpha="0.4"
            android:background="@android:color/black"
            android:visibility="visible"
            app:layout_constraintBottom_toBottomOf="@+id/localGLSurfaceView"
            app:layout_constraintEnd_toEndOf="@+id/localGLSurfaceView"
            app:layout_constraintHorizontal_bias="0.0"
            app:layout_constraintStart_toStartOf="@+id/localGLSurfaceView"
            app:layout_constraintTop_toTopOf="@+id/localGLSurfaceView"
            app:layout_constraintVertical_bias="0.0" />

        <View
            android:id="@+id/vShadow"
            android:layout_width="wrap_content"
            android:layout_height="@dimen/_42sdp"
            android:background="@drawable/ic_rectangle_shadow"
            app:layout_constraintEnd_toEndOf="@+id/localGLSurfaceView"
            app:layout_constraintStart_toStartOf="@+id/localGLSurfaceView"
            app:layout_constraintTop_toTopOf="@+id/localGLSurfaceView" />

        <ImageView
            android:id="@+id/ivBackButton"
            android:layout_width="@dimen/_8sdp"
            android:layout_height="@dimen/_13sdp"
            android:layout_marginStart="@dimen/_12sdp"
            android:layout_marginTop="@dimen/_16sdp"
            android:src="@drawable/ic_back"
            app:layout_constraintStart_toStartOf="@+id/localGLSurfaceView"
            app:layout_constraintTop_toTopOf="@+id/localGLSurfaceView" />

        <TextView
            android:id="@+id/tvLiveClassName"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="@dimen/_12sdp"
            android:text="Live Class 10"
            android:textColor="@android:color/white"
            android:textSize="@dimen/medium_text"
            app:layout_constraintBottom_toBottomOf="@+id/ivBackButton"
            app:layout_constraintStart_toEndOf="@+id/ivBackButton"
            app:layout_constraintTop_toTopOf="@+id/ivBackButton" />

        <TextView
            android:id="@+id/tvCountDown"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="5"
            android:textColor="@android:color/white"
            android:textSize="@dimen/xxx_large_text"
            app:layout_constraintBottom_toTopOf="@+id/tvTestAudio"
            app:layout_constraintEnd_toEndOf="@+id/localGLSurfaceView"
            app:layout_constraintStart_toStartOf="@+id/localGLSurfaceView" />

        <TextView
            android:id="@+id/tvGoLiveIn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginBottom="@dimen/_18sdp"
            android:text="Going Live in"
            android:textColor="@android:color/white"
            android:textSize="@dimen/xx_large_text"
            app:layout_constraintBottom_toTopOf="@+id/tvCountDown"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="@+id/localGLSurfaceView" />

        <ImageView
            android:id="@+id/ivStrengthIcon"
            android:layout_width="@dimen/_19sdp"
            android:layout_height="@dimen/_19sdp"
            android:layout_marginTop="@dimen/_14sdp"
            android:layout_marginEnd="@dimen/_12sdp"
            android:src="@drawable/ic_network_strength"
            app:layout_constraintEnd_toEndOf="@+id/localGLSurfaceView"
            app:layout_constraintTop_toTopOf="@+id/localGLSurfaceView" />

        <TextView
            android:id="@+id/tvNetworkStrength"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginEnd="@dimen/_8sdp"
            android:layout_marginBottom="@dimen/_2sdp"
            android:text="Good"
            android:textColor="@android:color/white"
            android:textSize="@dimen/small_text"
            app:layout_constraintBottom_toBottomOf="@+id/ivStrengthIcon"
            app:layout_constraintEnd_toStartOf="@+id/ivStrengthIcon"
            app:layout_constraintTop_toTopOf="@+id/ivStrengthIcon" />

        <Button
            android:id="@+id/btnCancelLive"
            android:layout_width="@dimen/_108sdp"
            android:layout_height="@dimen/_29sdp"
            android:layout_marginBottom="@dimen/_25sdp"
            android:background="@drawable/ic_rectangle_button"
            android:gravity="center"
            android:text="Cancel Live"
            android:textAllCaps="false"
            android:textSize="@dimen/medium_text"
            app:backgroundTint="@null"
            app:layout_constraintBottom_toBottomOf="@+id/localGLSurfaceView"
            app:layout_constraintEnd_toEndOf="@+id/localGLSurfaceView"
            app:layout_constraintStart_toStartOf="@+id/localGLSurfaceView" />

        <TextView
            android:id="@+id/tvTestAudio"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginBottom="@dimen/_12sdp"
            android:text="Speak to test the audio"
            android:textColor="@android:color/white"
            android:textSize="@dimen/medium_text"
            app:layout_constraintBottom_toTopOf="@+id/btnCancelLive"
            app:layout_constraintEnd_toEndOf="@+id/localGLSurfaceView"
            app:layout_constraintStart_toStartOf="@+id/localGLSurfaceView" />

        <androidx.constraintlayout.widget.Group
            android:id="@+id/groupTopView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:visibility="gone"
            app:constraint_referenced_ids="ivBackButton,
            tvLiveClassName,tvNetworkStrength,ivStrengthIcon,vShadow" />

        <androidx.constraintlayout.widget.Group
            android:id="@+id/groupVideoView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:visibility="gone"
            app:constraint_referenced_ids="localGLSurfaceView,
            tvCountDown,tvGoLiveIn,btnCancelLive,tvTestAudio,
            vBackground,preview" />

        <Button
            android:id="@+id/btnJoinSession"
            style="@style/Widget.MaterialComponents.Button.OutlinedButton"
            android:layout_width="@dimen/_130sdp"
            android:layout_height="@dimen/_40sdp"
            android:text="Join Session"
            app:backgroundTint="@color/colorAccent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <include
            android:id="@+id/include"
            layout="@layout/video_bottom_menu_layout"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:visibility="gone"
            app:layout_constraintBottom_toBottomOf="@id/localGLSurfaceView"
            app:layout_constraintEnd_toEndOf="@id/localGLSurfaceView"
            app:layout_constraintStart_toStartOf="@id/localGLSurfaceView" />
    </androidx.constraintlayout.widget.ConstraintLayout>

これが、ビデオプレビューを初期化する方法です。

private fun initVideoView() {
        val rootEglBase = EglBase.create()
        mLiveSessionBinding.localGLSurfaceView.init(rootEglBase.eglBaseContext, null)
        mLiveSessionBinding.localGLSurfaceView.setScalingType(RendererCommon.ScalingType.SCALE_ASPECT_FILL)
        mLiveSessionBinding.localGLSurfaceView.setMirror(true)
        mLiveSessionBinding.localGLSurfaceView.setEnableHardwareScaler(true)
        mLiveSessionBinding.localGLSurfaceView.setZOrderMediaOverlay(true)
    }

プレビューとストリーミングを行うためのビデオ カメラの設定

public VideoTrack MakeCameraSettingsReady() {
        final EglBase.Context eglBaseContext = EglBase.create().getEglBaseContext();
        PeerConnectionFactory peerConnectionFactory = this.sessionManager.getPeerConnectionFactory();

        // create AudioSource
        AudioSource audioSource = peerConnectionFactory.createAudioSource(new MediaConstraints());
        this.audioTrack = peerConnectionFactory.createAudioTrack("101", audioSource);

        surfaceTextureHelper = SurfaceTextureHelper.create("CaptureThread", eglBaseContext);
        // create VideoCapturer
        VideoCapturer videoCapturer = createCameraCapturer();
        VideoSource videoSource = peerConnectionFactory.createVideoSource(videoCapturer.isScreencast());
        videoCapturer.initialize(surfaceTextureHelper, context, videoSource.getCapturerObserver());
        videoCapturer.startCapture(480, 640, 30);

        return peerConnectionFactory.createVideoTrack("100", videoSource);
    }

これが私がカメラキャプチャーを作成する方法です

private VideoCapturer createCameraCapturer() {
        CameraEnumerator enumerator;
        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP) {
            enumerator = new Camera2Enumerator(this.context);
        } else {
            enumerator = new Camera1Enumerator(false);
        }
        final String[] deviceNames = enumerator.getDeviceNames();

        // Try to find front facing camera
        for (String deviceName : deviceNames) {
            if (enumerator.isFrontFacing(deviceName)) {
                videoCapturer = enumerator.createCapturer(deviceName, null);
                if (videoCapturer != null) {
                    return videoCapturer;
                }
            }
        }
        // Front facing camera not found, try something else
        for (String deviceName : deviceNames) {
            if (!enumerator.isFrontFacing(deviceName)) {
                videoCapturer = enumerator.createCapturer(deviceName, null);
                if (videoCapturer != null) {
                    return videoCapturer;
                }
            }
        }
        return null;
    }

これはマニフェスト ファイルで宣言したアクティビティです。

<activity android:name=".ui.session.activities.LiveSessionActivity"
            android:configChanges="orientation|screenSize"
            android:screenOrientation="sensorLandscape">

CameraXプレビューでそれが起こるかどうかを確認しようとしました。ビデオ プレビューでの使用CameraXandroidx.camera.view.PreviewView、あらゆる種類の向きで正常に機能します。ただしSurfaceViewRenderer、ビデオ プレビューは機能しません。

この点で何か助けていただければ幸いです。前もって感謝します。

4

0 に答える 0