Я разрабатываю приложение webrtc для Android.В отношении соединения webrtc все работает, как и ожидалось, но теперь я анимирую SurfaceViewRenderer
, поэтому удаленное видео переходит от заполнения всего экрана к маленькому прямоугольнику в верхнем правом углу и наоборот (переходя от маленького к большому).
Я использую MotionLayout
для достижения этого, наряду с MotionScene
с несколькими состояниями, определяющими свойства SurfaceViewRenderer
, которые меняются со временем, чтобы получить приятный и плавный эффект изменения размера.
Сами представления изменяются должным образом с течением времени, но воспроизведение видео останавливается во время анимации, поэтому при переходе от малого к большому последний видеокадр остается небольшим, в то время как представление увеличивает его размер.И в конце анимации, когда возобновляется воспроизведение видео, появляется новый большой видеокадр, который заполняет вид.Поэтому вместо эффекта плавного изменения размера от маленького к большому я получаю эффект skip , когда воспроизведение небольшого видео останавливается, а затем через несколько миллисекунд возобновляется воспроизведение и увеличивается.
То, что я пытался
- Чтобы углубиться в вовлеченные классы (
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)
Есть какие-нибудь подсказки, как решить эту ситуацию?