Как анимировать размер кадра webrtc SurfaceViewRenderer вместе с размером представления в Kotlin для Android? - PullRequest
0 голосов
/ 14 декабря 2018

Я разрабатываю приложение 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)

Есть какие-нибудь подсказки, как решить эту ситуацию?

...