2013-12-10 5 views
7

Я работаю над проектом видеоконференций. Мой видеодисплей использует поверхностный вид. Теперь во время видеовызова есть вероятность изменения соотношения сторон для входящих кадров. Поэтому я попробовал следующий код для этогоИзменение размера поверхности для изменения соотношения сторон в видеоизображении в 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*****************************************"); 
} 

Все нормально, если я вызываю эту функцию в начале вызова. Моя проблема в том, что когда я вызываю эту функцию между вызовом для изменения соотношения сторон, для отображения следующего кадра требуется слишком много времени. Иногда видео застревает даже.

Я пытался уничтожить и воссоздать поверхность

myVideoSurface.setVisibility(VIEW.GONE); 

Но поверхность не получает создан.

Я использую Mediacodec для декодирования видео. Я получаю уведомление при изменении разрешения.

Есть ли что-то большее, что я должен сделать для изменения размера поверхностиView, когда уже воспроизводится видео.

Спасибо за помощь .........................

+0

Если ваш проблема решена, пожалуйста, примите ответ. Таким образом, вопрос не отображается в списке «без ответа». –

+0

здесь хорошее [решение] (http://stackoverflow.com/a/33670521/2220110) –

ответ

22

Здравствуйте попробовать с кодом ниже:

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

Спасибо за kyogs за быстрый ответ. Но я тоже делаю что-то подобное recv_frame_width, а recv_frame_height - текущая высота и ширина кадра. Я хочу знать, есть ли что-то еще с поверхностьюView для этого изменения, так как видео уже воспроизводится. –

+0

с поверхности вы можете получить высоту и ширину видео. – kyogs

+0

@ kyogs Я знаю, что без этого также у меня есть новая ширина и высота и соотношение сторон. но проблема возникает, когда я пытаюсь изменить размер моего поверхностного экрана, что занимает слишком много времени для него, и иногда видео застревает. –