GlSurfaceView setZMediaOrder导致视频在其父节点之外播放

时间:2017-05-20 10:46:38

标签: android glsurfaceview z-order

案例-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的尺寸)。

如何在背景视频之上播放新添加的视频,而不会超出其父母的范围。

1 个答案:

答案 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);
    }
}