将ImageView中的视频的第一帧与MediaPlayer渲染匹配时,scaleX的差异

时间:2019-05-11 15:02:35

标签: android video imageview textureview

我有一个设置为scaleType = fitCenter的ImageView和一个位于帧布局内的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中显示的第一帧的宽度略有增加。

具体来说,要在播放时将第一帧与视频完全匹配,我需要将媒体播放器的x比例缩放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都没有结果。

除非我实际上将video scaleX设置为0.9f,否则始终存在差异。在多种设备上尝试过。

所以我的问题是,为什么我需要将scaleX设置为0.9f才能使视频与第一帧图像完全匹配?有没有更好的方法可以将ImageView中的第一帧与视频回放精确匹配?

PS:我从一个隐藏的TextureView开始,当视频加载时,我在该视图中显示和播放。工作良好。

0 个答案:

没有答案