2017-05-20 65 views
3

案例1:GlSurfaceView setZMediaOrder导致视频到其父母在外面玩

GLSurfaceView 
| 
FrameLayout 
| 
TextureView 
| 
VideoRecording 

所以在这里我有一个GLSurfaceView,基于用户输入,我在它的上面添加一个正方形FrameLayout(尺寸设定使用的LayoutParams),然后在这个新添加的FrameLayout,然后录制视频的顶部添加TextureView,正如预期的那样,无论什么相机选择,我得到一个正方形的预览。

案例2:

GLSurfaceView 
| 
FrameLayout 
| 
GLSurfaceView 
| 
VideoPlayback

在这种情况下-1通过从已经以前TextureView记录我加入另一个GLSurfaceView视频后添加FrameLayout。此前,我只听到播放无任何视频的声音,但后来我碰到的例子,其使用
setZOrderMediaOverlay(true);

setZOrderOnTop(true)
现在在视频播放的,而是其母公司中玩耍,其在9打/ 16的纵横比。正如前面提到的,预期的行为是方形的视频(在FrameLayout里的尺寸)。

我怎样才能得到背景视频顶部新加入的视频,而无需得到它了其父母的界限的。

回答

0

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

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); 
    } 
} 
+0

对不起,苛刻,问题不在于调整表面大小。 –