gpt4 book ai didi

android - GlSurfaceView setZMediaOrder 导致视频在其 parent 之外播放

转载 作者:太空宇宙 更新时间:2023-11-03 11:00:45 25 4
gpt4 key购买 nike

案例一:

GLSurfaceView|FrameLayout|TextureView|VideoRecording

所以这里我有一个 GLSurfaceView,根据用户输入,我在它上面添加了一个正方形 FrameLayout(使用布局参数设置尺寸),然后添加 TextureView 在这个新添加的 FrameLayout 之上,然后录制视频,正如预期的那样,无论选择什么相机,我都会得到一个方形预览。

案例 2:

GLSurfaceView|FrameLayout|GLSurfaceView|VideoPlayback

在案例 1 中,我在录制视频后添加了另一个 GLSurfaceView,方法是从已添加的 FrameLayout 中删除之前的 TextureView。早些时候,我只能听到播放的声音而没有任何视频,但后来我遇到了使用
setZOrderMediaOverlay(true);
的示例或者
setZOrderOnTop(true)
现在播放视频,但不是在其父级中播放,而是以 9/16 宽高比播放。如前所述,预期行为是方形视频(FrameLayout 的尺寸)。

我怎样才能让新添加的视频位于背景视频之上而又不超出其 parent 的范围。

最佳答案

我认为您需要检查媒体播放器的宽高比并根据它进行设置,使用相对布局而不是框架布局并设置重心,并实现此代码:

MediaPlayer.OnVideoSizeChangedListener mOnVideoSizeChangedListener = new MediaPlayer.OnVideoSizeChangedListener() {

@Override
public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {

setAspectRatio(mp, width, height);

}
};

并创建一个方法并根据此设置视频布局参数:

  private void setAspectRatio(MediaPlayer mediaPlayer, int videoWidth, int videoHeight)
{
if(mediaPlayer != null)
{

DisplayMetrics displayMetrics = new DisplayMetrics();
getActivity().getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
int height = displayMetrics.heightPixels;
int width = displayMetrics.widthPixels;

ViewGroup.LayoutParams videoParams = getLayoutParams();


if (videoWidth > videoHeight)
{
videoParams.width = width;
videoParams.height = width * videoHeight / videoWidth;
}
else
{
videoParams.width = height * videoWidth / videoHeight;
videoParams.height = height;
}

// Commit params
surfaceView.setLayoutParams(videoParams);
}
}

关于android - GlSurfaceView setZMediaOrder 导致视频在其 parent 之外播放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44084927/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com