Как анимировать размер кадра webrtc SurfaceViewRenderer вместе с размером представления в Kotlin для Android?
Я занимаюсь разработкой приложения webrtc для Android. Все работает, как и ожидалось, относительно соединения 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.xml MotionScene
выглядит так:
<?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)
Любые подсказки о том, как решить эту ситуацию?