Ich arbeite an einem Videokonferenzprojekt. Mein Video-Display verwendet die Oberflächenansicht. Während eines Videoanrufs besteht nun die Möglichkeit, dass das Seitenverhältnis für die eingehenden Frames geändert wird. Also habe ich den folgenden Code dafür ausprobiertGrößenanpassung der Oberflächenansicht für Änderung des Seitenverhältnisses in der Videoanzeige in Android
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*****************************************");
}
Alles ist in Ordnung, wenn ich diese Funktion zu Beginn des Anrufs aufrufen. Mein Problem ist, wenn ich diese Funktion zwischen einem Aufruf zum Ändern des Seitenverhältnisses aufrufen, dauert es zu viel Zeit, um das nächste Bild anzuzeigen. Manchmal bleibt das Video auch hängen.
Ich habe versucht, die Oberfläche mit
myVideoSurface.setVisibility(VIEW.GONE);
Aber die Oberfläche wird nicht erstellt, immer zu zerstören und neu zu erstellen.
Ich benutze Mediacodec für Video-Decodierung Ich werde benachrichtigt, wenn es eine Auflösung Änderung gibt.
Gibt es noch etwas, was ich tun sollte, um die Größe einer Oberfläche zu ändern, wenn bereits Video abgespielt wird.
Vielen Dank für Hilfe .........................
Wenn Ihr Problem ist gelöst, bitte antworten Sie mit einer Antwort. Du fragst also nicht in der "unbeantworteten" Liste. –
hier ist eine gute [Lösung] (http://StackOverflow.com/a/33670521/2220110) –