案例-1:
GLSurfaceView | FrameLayout | TextureView | VideoRecording
所以我在GLSurfaceView
根据用户输入我在其上添加了一个方格FrameLayout
(尺寸是使用layoutparams设置的),然后添加TextureView
这个新添加的FrameLayout
,然后录制视频,正如预期的那样,无论相机选择什么,我都会进行正方形预览。
案例-2:
GLSurfaceView | FrameLayout | GLSurfaceView | VideoPlayback
在录制视频后的情况1中,我通过从已添加的GLSurfaceView
中删除之前的TextureView
来添加另一个FrameLayout
。之前,我可以在没有任何视频的情况下听到播放的声音,但后来我发现使用了setZOrderMediaOverlay(true);
的示例
或
setZOrderOnTop(true)
现在视频播放,但不是在其父节目内播放,而是以9/16宽高比播放。如前所述,预期行为是方形视频(FrameLayout的尺寸)。
如何在背景视频之上播放新添加的视频,而不会超出其父母的范围。
答案 0 :(得分:0)
我认为您需要检查媒体播放器的宽高比并根据它设置,使用相对布局而不是帧布局并设置重力CENTER,并实现此代码:
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);
}
}