Androidアプリケーション用のwebrtcを開発しています。webrtc 接続に関してはすべてが期待どおりに機能しますがSurfaceViewRenderer
、リモート ビデオが画面全体を占める状態から右上隅の小さな四角形に、またはその逆 (小さいものから大きいもの) に遷移するようにアニメーション化しています。
私はMotionLayout
これを達成するために を使用しており、プロパティをMotionScene
定義するいくつかの状態とともに を使用してSurfaceViewRenderer
、時間の経過とともに変化し、スムーズでスムーズなサイズ変更効果を得ています。
ビュー自体は時間の経過とともに適切にサイズ変更されますが、ビデオの再生はアニメーション中に停止するため、小さいものから大きいものに移行すると、ビューのサイズが大きくなる間、最後のビデオ フレームは小さいままです。アニメーションの最後でビデオの再生が再開されると、新しい大きなビデオ フレームが表示され、ビューがいっぱいになります。そのため、小さなビデオから大きなビデオへのスムーズなサイズ変更効果ではなく、小さなビデオの再生が停止し、数ミリ秒後に再生を再開して大きくなるスキップ効果のようになります。
私が試したこと
- 関連するクラス (
SurfaceViewRenderer
、VideoRenderer
、VideoTrack
) を詳しく調べて、現在のビデオ フレームを取得してサイズを変更する方法を見つけましたが、その方法が見つかりませんでした。
再現する手順
シグナリング サーバーと一緒に webrtc 環境をセットアップする必要があるため、正確なシナリオを再現することは困難ですが、使用しているコードの一部を共有します。私の主なレイアウトは次のようになります。
<android.support.constraint.motion.MotionLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:orientation="vertical"
app:layoutDescription="@xml/motion_master_view_scene"
android:id="@+id/webRtcViewsLayout">
<org.webrtc.SurfaceViewRenderer
android:id="@+id/slaveVideoView"
android:layout_width="300dp"
android:layout_height="169dp"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_marginEnd="84dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<org.webrtc.SurfaceViewRenderer
android:id="@+id/masterVideoView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</android.support.constraint.motion.MotionLayout>
次に、motion_master_view_scene.xmlMotionScene
は次のようになります。
<?xml version="1.0" encoding="utf-8"?>
<MotionScene xmlns:motion="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<Transition
motion:duration="500">
</Transition>
<StateSet
motion:defaultState="@id/localMasterState">
<State android:id="@+id/bothMinimizedState" motion:constraints="@id/bothMinimizedConstraintSet"></State>
<State android:id="@+id/localMasterState" motion:constraints="@id/localMasterConstraintSet"></State>
</StateSet>
<ConstraintSet android:id="@+id/bothMinimizedConstraintSet">
<Constraint
android:id="@+id/masterVideoView"
android:layout_width="300dp"
android:layout_height="169dp"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_marginTop="196dp"
android:layout_marginRight="10dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
/>
<Constraint
android:id="@+id/slaveVideoView"
android:layout_width="300dp"
android:layout_height="169dp"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_marginTop="10dp"
android:layout_marginRight="10dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
/>
</ConstraintSet>
<ConstraintSet android:id="@+id/localMasterConstraintSet">
<Constraint
android:id="@+id/masterVideoView"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
<Constraint
android:id="@+id/slaveVideoView"
android:layout_width="300dp"
android:layout_height="169dp"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_marginTop="10dp"
android:layout_marginRight="10dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
/>
</ConstraintSet>
</MotionScene>
そして最後に、これを行うことで MainActivity の状態を切り替えます
webRtcViewsLayout.transitionToState(newState)
この状況を解決する方法の手がかりはありますか?