2013-12-10 3 views
7

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 .........................

+0

Wenn Ihr Problem ist gelöst, bitte antworten Sie mit einer Antwort. Du fragst also nicht in der "unbeantworteten" Liste. –

+0

hier ist eine gute [Lösung] (http://StackOverflow.com/a/33670521/2220110) –

Antwort

22

Hallo mit folgenden Code versuchen:

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

Dank Kyogs für die schnelle Antwort. Aber ich mache auch etwas ähnliches recv_frame_width und recv_frame_height sind die aktuelle Rahmenhöhe und -breite. Ich möchte wissen, ob es für diese Änderung noch etwas anderes mit dem SurfaceView zu tun gibt, da das Video bereits abgespielt wird. –

+0

von der Oberflächenansicht können Sie Höhe und Breite des Videos erhalten. – kyogs

+0

@ kyogs Ya ich weiß das aber ohne dass ich auch die neue Breite und Höhe und das Seitenverhältnis habe. Das Problem tritt jedoch auf, wenn ich versuche, die Größe meiner Oberfläche zu ändern, was zu lange dauert und manchmal bleibt das Video hängen. –