使用 Android 的本機 SDK 調整視頻視圖大小

在本主題中,您將學習如何調整/拉伸內部視頻視圖以填充BrightcoveVideoView使用適用於Android的Native SDK時。

概覽

作為開發人員,您可以更改視頻在視頻視圖中的顯示方式的默認行為。您可以調整/拉伸內部視頻視圖的大小(SurfaceView / TextureView)填寫BrightcoveVideoViewFrameLayout)。為此,您可以收聽EventType.VIDEO_SIZE_KNOWN事件,進行一些數學運算並設置顯示值。

有兩種方法可以更改視頻視圖:

調整容器大小

您可能需要開發一個將視頻視圖設置為適合縱向模式的整個設備屏幕的應用程序。您可以通過調整容器的大小來做到這一點(BaseVideoView / FrameLayout)。

設置容器屬性

如果您發現視頻周圍有黑邊,可以嘗試設置BrightcoveVideoViewlayout-height

  1. 打開XML 佈局文件。
  2. 設置BrightcoveVideoView layout-heightwrap_content
  3. 您可能會遇到上述說明中所述的初始閃爍。

設定影片檢視大小

控制視頻視圖的另一種方法是通過編程設置大小。

  1. 為了最大程度地減少初始閃爍,請嘗試設置layout_height到特定值(例如280dp)。目標是將高度設置為接近所計算的高度。
  2. 聽著EventType.VIDEO_SIZE_KNOWN事件。
  3. 得到Event.VIDEO_WIDTHEvent.VIDEO_HEIGHT
  4. 使用這些值,確定縱橫比。
  5. 使用寬高比計算顯示屏上的寬度和高度。

該解決方案將類似於以下內容:

//Event sent when we know the Video dimensions.
eventEmitter.on(EventType.VIDEO_SIZE_KNOWN, new EventListener() {
  @Override
  public void processEvent(Event event) {
    // Get the width and height
    float width = event.getIntegerProperty(Event.VIDEO_WIDTH);
    float height = event.getIntegerProperty(Event.VIDEO_HEIGHT);
    float aspectRatio = height/width;

    //Get the display metrics
    DisplayMetrics metrics = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(metrics);
    int videoWidth = metrics.widthPixels; // We cover the entire display's width
    int videoHeight = (int) (videoWidth*aspectRatio); //Calculate the height based on the ratio

    // Set the layout params
    brightcoveVideoView.setLayoutParams(new FrameLayout.LayoutParams(videoWidth,videoHeight));
  }
});

添加視圖時,您將需要覆蓋佈局參數。有關詳細信息,請參見Android:添加視圖/管理佈局文件。

調整視頻大小

您可能需要雙擊以填滿整個屏幕。這將拍攝16:9的視頻,並在18:9或19:9的設備上填滿屏幕。

您可以通過調整實際視頻的大小來做到這一點(SurfaceView)。

  1. 如果將寬度和高度設置為renderView為匹配設備顯示屏的大小,視頻將調整大小以匹配整個屏幕。

    //Event sent when we know the Video dimensions.
    eventEmitter.on(EventType.VIDEO_SIZE_KNOWN, new EventListener() {
      @Override
      public void processEvent(Event event) {
        // Get the width and height
        float width = event.getIntegerProperty(Event.VIDEO_WIDTH);
        float height = event.getIntegerProperty(Event.VIDEO_HEIGHT);
        float aspectRatio = height/width;
    
        //Get the display metrics
        DisplayMetrics metrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(metrics);
        int videoWidth = metrics.widthPixels; // We cover the entire display's width
        int videoHeight = (int) (videoWidth*aspectRatio); //Calculate the height based on the ratio
    
        // Set the video size
        brightcoveVideoView.getRenderView().setVideoSize(videoWidth, videoHeight);
      }
    });
    
  2. 以下代碼更新了基礎視頻視圖(例如SurfaceView)以匹配其父對象BaseVideoViewFrameLayout)。有幾件事要牢記:

    • 你需要聽VIDEO_SIZE_KNOWN進入和退出全屏以及旋轉設備時發生事件。
    • 您需要決定何時針對上述條件更新視圖。

    一種情況是您將BaseVideoView layout_height280dp然後調整SurfaceView匹配280dp。長寬比將稍作修改。如果用戶以縱向模式進入全屏模式,並且updateVideoViewMatchToParent()被稱為,那麼BaseVideoViewSurfaceView將會填滿設備的顯示屏,並且視頻的縱橫比會稍作修改。

    public void updateVideoViewMatchToParent(@NonNull BaseVideoView brightcoveVideoView) {
      RenderView renderView = brightcoveVideoView.getRenderView();
      if (renderView != null) {
          renderView.setVideoSize(brightcoveVideoView.getWidth(), brightcoveVideoView.getHeight());
      }
    }
    

    要檢測雙擊,您可以使用GestureDetector.OnDoubleTapListener接口。有關詳細信息,請參見檢測常見手勢文件。

如果您想在不考慮寬高比的情況下拉伸視頻(不裁剪視頻),可以嘗試以下操作:

eventEmitter.on(EventType.VIDEO_SIZE_KNOWN, new EventListener() {
  @Override
  public void processEvent(Event event) {
      //Get the display metrics
      DisplayMetrics metrics = new DisplayMetrics();
      getWindowManager().getDefaultDisplay().getMetrics(metrics);

      int videoHeight = metrics.heightPixels;
      int videoWidth = metrics.widthPixels;
      brightcoveVideoView.getRenderView().setVideoSize(videoWidth, videoHeight);
  }
});

請記住,您獲得的值受設備方向的影響。要同時拉伸縱向和橫向視頻,您需要執行以下操作:

  1. 覆蓋以下內容Activity

    public void onConfigurationChanged(Configuration configuration)
    
  2. 重置視頻大小。