Как анимировать размер кадра 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)

Любые подсказки о том, как решить эту ситуацию?

0 ответов

Другие вопросы по тегам