调整表面视图以改变androidvideo显示的纵横比

我正在开发一个video会议项目。 我的video显示是使用表图。 现在,在video通话期间,传入帧可能会发生纵横比变化。 所以我已经尝试了下面的代码

public void surfaceResize() { // WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); Point size = new Point(); int screenWidth = 0; //Get the SurfaceView layout parameters float aspectRatio = (float) recv_frame_width / recv_frame_height; if(getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) { //Get the width of the screen getWindowManager().getDefaultDisplay().getSize(size); screenWidth = size.x; //Set the width of the SurfaceView to the width of the screen surflp.width = screenWidth; //Set the height of the SurfaceView to match the aspect ratio of the video //be sure to cast these as floats otherwise the calculation will likely be 0 surflp.height = (int) ((1 / aspectRatio) * (float)screenWidth); //Commit the layout parameters } else { size.x = size.y = 0; //Get the width of the screen getWindowManager().getDefaultDisplay().getSize(size); int screenHeight = size.y; //Set the width of the SurfaceView to the width of the screen surflp.height = screenHeight; //Set the width of the SurfaceView to match the aspect ratio of the video //be sure to cast these as floats otherwise the calculation will likely be 0 surflp.width = (int) ( aspectRatio * (float)screenHeight); //Commit the layout parameters // code to do for Portrait Mode } surflp.addRule(RelativeLayout.CENTER_HORIZONTAL); surflp.addRule(RelativeLayout.CENTER_VERTICAL); if(myVideoSurfaceView != null) myVideoSurfaceView.setLayoutParams(surflp); System.out.println("Surface resized*****************************************"); } 

如果我在通话开始时调用这个函数,一切都很好。 我的问题是,当我调用这个函数在改变宽高比的调用之间需要太多的时间来显示下一帧。 有时甚至video卡住了。

我试图用摧毁和重build表面

 myVideoSurface.setVisibility(VIEW.GONE); 

但表面并没有被创造出来。

我正在使用Mediacodec进行video解码,当解决scheme发生变化时,我会收到通知。

当已经播放video时,是否还有更多的事情要做,以调整SurfaceView的大小。

感谢帮助…………………….

Solutions Collecting From Web of "调整表面视图以改变androidvideo显示的纵横比"

你好,尝试下面的代码:

 private void setVideoSize() { // // Get the dimensions of the video int videoWidth = mediaPlayer.getVideoWidth(); int videoHeight = mediaPlayer.getVideoHeight(); float videoProportion = (float) videoWidth / (float) videoHeight; // Get the width of the screen int screenWidth = getWindowManager().getDefaultDisplay().getWidth(); int screenHeight = getWindowManager().getDefaultDisplay().getHeight(); float screenProportion = (float) screenWidth / (float) screenHeight; // Get the SurfaceView layout parameters android.view.ViewGroup.LayoutParams lp = surfaceView.getLayoutParams(); if (videoProportion > screenProportion) { lp.width = screenWidth; lp.height = (int) ((float) screenWidth / videoProportion); } else { lp.width = (int) (videoProportion * (float) screenHeight); lp.height = screenHeight; } // Commit the layout parameters surfaceView.setLayoutParams(lp); }