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
プレビューでそれが起こるかどうかを確認しようとしました。ビデオ プレビューでの使用CameraX
はandroidx.camera.view.PreviewView
、あらゆる種類の向きで正常に機能します。ただしSurfaceViewRenderer
、ビデオ プレビューは機能しません。
この点で何か助けていただければ幸いです。前もって感謝します。