В Android, используя exoplayer, как заполнить обзор поверхности видео, которое не имеет одинакового соотношения сторон с устройством?

У меня есть активность, которая использует ExoPlayer для воспроизведения видео. Когда я вхожу в полноэкранный режим, если соотношение сторон устройства не равно размеру изображения, я получаю маленькие черные полосы вверху и внизу видео.

Вот как выглядит макет:

<com.google.android.exoplayer.AspectRatioFrameLayout
    android:id="@+id/video_frame"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true"
    android:layout_alignParentRight="true"
    android:layout_alignParentBottom="true">

    <SurfaceView android:id="@+id/surface_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="fill_vertical"/>

    <View android:id="@+id/shutter"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@android:color/black"/>

</com.google.android.exoplayer.AspectRatioFrameLayout>

Я надеялся, что

aspectRatioFrameLayout.setAspectRatio(mVideo.getAspectRatio());

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

Ответ 1

Вы можете удалить com.google.android.exoplayer.AspectRatioFrameLayout.

Затем добавьте простой FrameLayout с шириной и высотой на match_parent.

Обратите внимание, что SurfaceView должен оставаться в ширине и высоте = match_parent.

Объяснение: AspectRatioFrameLayout устанавливает правильную высоту представления в соответствии с реальным соотношением видео (вычисление на основе ширины, высоты и pixelRatio). Если вы этого не сделаете, Exoplayer все еще может отображать представление на SurfaceView, как это было раньше. Если SurfaceView не @Override, он не будет иметь соотношение сторон.

Ответ 2

Самый быстрый способ заполнить экран видео. Перейдите в класс SimpleExoPlayerView.java, измените resizeMode с AspectRatioFrameLayout.RESIZE_MODE_FIT на AspectRatioFrameLayout.RESIZE_MODE_FILL. RESIZE_MODE_FILL будет игнорировать указанное соотношение сторон. Используйте этот способ, если вы используете ExoPlayer в качестве модуля в своем проекте.

ОБНОВЛЕНО Если вы используете ExoPlayer в качестве библиотеки, у них есть метод setResizeMode(). Вы просто указали на AspectRatioFrameLayout.RESIZE_MODE_FILL в своем представлении: simpleExoPlayerView.setResizeMode(AspectRatioFrameLayout.RESIZE_MODE_FILL) Это все!

Ответ 3

Это можно сделать и в XML, если вы используете SimpleExoPlayerView.

Просто добавьте app:resize_mode="zoom" чтобы сохранить соотношение сторон видео, или app:resize_mode="fill" если вас не интересует соотношение сторон.

<com.google.android.exoplayer2.ui.SimpleExoPlayerView
            android:id="@+id/video"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:resize_mode="zoom" />

Ответ 4

Просто используйте ниже линию в вашем XML. Это будет отлично работать.

app:resize_mode="fill"