Разница в scaleX при сопоставлении первого кадра видео в ImageView с визуализацией MediaPlayer - PullRequest
0 голосов
/ 11 мая 2019

У меня есть ImageView, для которого установлено scaleType = fitCenter и TextureSurface внутри структуры кадра:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/colorBackground"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <ImageView
        android:id="@+id/imageStart"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:srcCompat="@drawable/splash_image_start"
        android:padding="0dp"
        android:scaleType="fitCenter"
        android:adjustViewBounds="false"/>

    <TextureView
        android:id="@+id/surfaceView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:visibility="invisible"/>
</FrameLayout>

Когда загружается действие, я хочу показать splash_image_start изображение во время загрузки видео и сразу же начать воспроизведение видео.

splash_image_start - это 1080x1920 пикселей, что точно соответствует размеру видео.

Все работает нормально, но видео начинает слегка увеличиваться по ширине первого кадра, показанного в ImageView.

В частности, для точного соответствия первого кадра с видео при воспроизведении мне нужно преобразовать медиаплеер на 1% по шкале х:

    mediaPlayer.setOnVideoSizeChangedListener(new MediaPlayer.OnVideoSizeChangedListener() {
        @Override
        public void onVideoSizeChanged(MediaPlayer mp, int videoWidth, int videoHeight) {
            Log.v(TAG, "MediaPlayer video size changed");
            float viewWidth = sv.getWidth();
            float viewHeight = sv.getHeight();

            int pivotPointX = (int) (viewWidth / 2);
            int pivotPointY = (int) (viewHeight / 2);

            Matrix matrix = new Matrix();
            // Completely unknown as to why but when trying to match a video render against
            // a static frame render there is a 0.1% difference in scale X
            matrix.setScale(0.9f, 1.0f, pivotPointX, pivotPointY);

            sv.setTransform(matrix);
        }
    }); 

Я пробовал различные конфигурации в ImageView, а также играл с mediaPlayer.setVideoScalingMode, но безрезультатно.

Если я на самом деле не установил масштаб видео X на 0,9f, разница всегда есть. Пробовал на нескольких устройствах.

Итак, мой вопрос, есть ли объяснение, почему мне нужно установить scaleX равным 0,9f, чтобы видео точно совпадало с изображением первого кадра? Есть ли лучший способ точного сопоставления первого кадра в ImageView с воспроизведением видео?

PS: я начинаю со скрытого TextureView, и когда видео загружается, я показываю и играю в этом представлении. Работает отлично.

...