【问题标题】:Scale video on textureview to give appearance of centercrop在纹理视图上缩放视频以呈现中心裁剪的外观
【发布时间】:2018-05-04 13:46:58
【问题描述】:

我在纹理视图中重复播放视频,其目的是显示背景视频。我需要将纹理视图的宽度和高度设置为 match_parent。

我想缩放视频,使其在播放的纹理视图上看起来被裁剪。

我点击此链接TextureView scaling 并使用了给定的功能。

private void updateTextureViewSize(int viewWidth, int viewHeight) {
float scaleX = 1.0f;
float scaleY = 1.0f;

if (mVideoWidth > viewWidth && mVideoHeight > viewHeight) {
    scaleX = mVideoWidth / viewWidth;
    scaleY = mVideoHeight / viewHeight;
} else if (mVideoWidth < viewWidth && mVideoHeight < viewHeight) {
    scaleY = viewWidth / mVideoWidth;
    scaleX = viewHeight / mVideoHeight;
} else if (viewWidth > mVideoWidth) {
    scaleY = (viewWidth / mVideoWidth) / (viewHeight / mVideoHeight);
} else if (viewHeight > mVideoHeight) {
    scaleX = (viewHeight / mVideoHeight) / (viewWidth / mVideoWidth);
}

// Calculate pivot points, in our case crop from center
int pivotPointX = viewWidth / 2;
int pivotPointY = viewHeight / 2;

Matrix matrix = new Matrix();
matrix.setScale(scaleX, scaleY, pivotPointX, pivotPointY);

mTextureView.setTransform(matrix);
mTextureView.setLayoutParams(new FrameLayout.LayoutParams(viewWidth, viewHeight));
}

我将 mVideoWidth 和 mVideoHeight 检索为 mediaPlayer.getVideoWidth() 和 mediaPlayer.getVideoHeight()。我不明白的是我应该作为函数参数viewWidth和viewHeight传入什么? 我尝试传递父容器的宽度和高度,但这会使应用程序崩溃。

这是父级的xml代码

<FrameLayout
            android:id="@+id/fl_profile_video_container"
            android:layout_width="match_parent"
            android:layout_height="300dp">

            <!--<VideoView-->
                <!--android:id="@+id/vv_profile_video"-->
                <!--android:layout_width="match_parent"-->
                <!--android:layout_height="match_parent" />-->

            <TextureView
                android:id="@+id/profile_video_texture_view"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_gravity="center"/>

            <View
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:background="@drawable/profile_video_overlay"/>

        </FrameLayout>

这是视频播放部分的代码。

       FrameLayout profileVideoContainer = (FrameLayout) view.findViewById(R.id.fl_profile_video_container);
    profileVideoTextureView = (TextureView) view.findViewById(R.id.profile_video_texture_view);
    SharedPreferences sharedPrefs = getApplicationContext().getSharedPreferences(ProfileVideoRecordingActivity.TAG_VIDEO_PROFILE, Context.MODE_PRIVATE);
    final String profileVideoPath = sharedPrefs.getString(ProfileVideoRecordingActivity.VIDEO_PROFILE_PATH, null);
    if(profileVideoPath != null && (new File(profileVideoPath)).exists()){
        profileVideoContainer.setVisibility(View.VISIBLE);
        profileVideoTextureView.setSurfaceTextureListener(new TextureView.SurfaceTextureListener() {
            @Override
            public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int i, int i1) {
                Surface surface = new Surface(surfaceTexture);
                try {
                    profileVidMediaPlayer = new MediaPlayer();
                    profileVidMediaPlayer.setDataSource(mActivity, Uri.parse(profileVideoPath));
                    profileVidMediaPlayer.setSurface(surface);
                    profileVidMediaPlayer.prepareAsync();
                    profileVidMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                        @Override
                        public void onPrepared(MediaPlayer mediaPlayer) {
                            profileVidMediaPlayer.start();
                            profileVidMediaPlayer.setLooping(true);
                        }
                    });
                }catch(IOException e){
                    Log.e("DEBUG", "IOException", e);
                }
            }

            @Override
            public void onSurfaceTextureSizeChanged(SurfaceTexture surfaceTexture, int i, int i1) {

            }

            @Override
            public boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) {
                return true;
            }

            @Override
            public void onSurfaceTextureUpdated(SurfaceTexture surfaceTexture) {

            }
        });
    }else{
        profileVideoContainer.setVisibility(View.GONE);
    }

如何缩放视频,使其看起来像 ImageView 上的属性一样居中裁剪?

【问题讨论】:

    标签: android textureview


    【解决方案1】:

    我尝试使用https://www.binpress.com/video-cropping-with-texture-view/ 中描述的相同缩放方法,但无法正确缩放。

    我找到了另一个如何为 TextureView 缩放视频的示例,它适用于我:https://github.com/yqritc/Android-ScalableVideoView/blob/master/library/src/main/java/com/yqritc/scalablevideoview/ScaleManager.java

    【讨论】:

      猜你喜欢
      • 2019-04-08
      • 2015-02-09
      • 2018-10-18
      • 2021-09-08
      • 2019-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多