案例一:
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/