Мигает видео / SurfaceView при изменении размера в режиме PiP - PullRequest
1 голос
/ 01 июля 2019

Я работаю над режимом PiP в моем приложении.На самом деле он работает довольно хорошо, но у меня проблема с миганием / исчезновением видео на долю секунды.

У меня VideoActivity в «полноэкранном» / нормальном режиме.Я звоню enterPictureInPictureMode(); и Activity рушится на маленький PiP-кадр.В тот момент, когда анимация заканчивается уменьшением макета, видео становится прозрачным за доли секунды / один кадр.Также точно в этом кадре весь PiP-кадр получает тень под (возвышением).Когда я касаюсь этого маленького PiP-кадра, он немного расширяется до большого PiP-кадра (не полноэкранного), и эта анимация плавная, но при автоматическом сворачивании в маленький PiP-кадр он снова мигает в конце ... Каждый раз, когда Activity анимирует на маленький PiP-кадр (независимо от того, разваливается ли он на большом PiP-кадре или в полноэкранном режиме Activity), при достижении конечных «маленьких границ» происходит мигание одного кадра прозрачности.Не влияет на звук, видео воспроизводится стабильно, нет вызовов на onPlayerStateChanged.

. В более новой версии API мы можем создавать анимацию с границами, и поэтому я знаю, что видео view мигает.Использование метода без атрибутов приводит к свертыванию всего макета, и я вижу мерцание только в области с видео / плеером / видом на поверхность (черные полосы над и под видео).Когда я использую более новый метод и setSourceRectHint, я вижу, что весь PiP-кадр исчезает без учета черного фона его родителя.На самом деле я добавил фиктивный View с фиксированным размером, цветом фона и centerInParent как PlayerView - он мигает / прячется, как игрок, когда находится ниже (первый в родительском элементе) PlayerViewслой, но помещенный выше , не мигает вообще и показывает выше PlayerView, даже если он исчезает на долю секунды.

Как исправить это мигание или, возможно, установить черный фон,не прозрачный ...

if (Build.VERSION.SDK_INT >= 26) {
    Rect bounds = new Rect();
    playerView.getVideoSurfaceView().getDrawingRect(bounds);
    int toTop = (playerView.getMeasuredHeight() - bounds.height()) / 2,
        toLeft = (playerView.getMeasuredWidth() - bounds.width()) / 2;
    bounds.top += toTop;
    bounds.left += toLeft;
    bounds.bottom += toTop;
    bounds.right += toLeft;
    enterPictureInPictureMode(new PictureInPictureParams.Builder().
        setSourceRectHint(bounds).
        setAspectRatio(new Rational(bounds.width(), bounds.height())).
        build());
} else
    enterPictureInPictureMode();

xml:

<RelativeLayout    
    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:background="@android:color/black">

<com.google.android.exoplayer2.ui.PlayerView
    android:id="@+id/activity_video_player_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_centerInParent="true"
    android:background="@android:color/black"
    app:controller_layout_id="@layout/exo_custom_control_view"
    app:fastforward_increment="10000"
    app:rewind_increment="10000"
    app:show_timeout="100" />
    ...

PS.Вышеуказанная проблема также появляется при использовании обычного VideoView, воспроизводимого в WebView и переходящего в полноэкранный режим с помощью VideoEnabledWebChromeClient .Но в этом случае мигание раскрывается для доли секунды WebView s содержимого

edit: я только что нашел обходной путь для мигания ExoPlayer - заменив SurfaceView на TextureView, добавив app:surface_type="texture_view"- но я читаю, что TextureView немного менее эффективен, а также это не исправляет VideoView мигание (в полноэкранном режиме с WebView)

edit2: может подтвердить мигание на Android 8 (Xiaomi) и9 (пиксель)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...