我正在开发一个视频会议项目。我的视频显示使用表面视图(surface view)。在视频通话期间,传入帧的宽高比可能会发生变化。因此我尝试了以下代码来处理它。
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*****************************************");
}
如果我在调用的开始处调用此函数,一切都很好。
我的问题是,当我在调用更改纵横比的过程中调用此函数时,显示下一帧需要太长时间。有时甚至会卡住视频。我尝试使用销毁并重新创建表面来解决问题。
myVideoSurface.setVisibility(VIEW.GONE);
但表面没有被创建。
我正在使用Mediacodec进行视频解码,当分辨率发生更改时将收到通知。
如果已经播放视频,那么调整SurfaceView的大小是否需要做其他处理?
感谢帮助……