Как в Android с помощью exoplayer заполнить Surfaceview видео, которое не имеет того же соотношения сторон, что и устройство?

У меня есть действие, в котором для воспроизведения видео используется 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());

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


person kimv    schedule 09.11.2015    source источник
comment
поздно на вечеринку и с противоположной стороны: как убедиться, что SurfaceView + AspectRatioFrameLayout сохраняет правильное соотношение сторон, а также максимально заполняет высоту и / или ширину экрана? Вы совпадаете с родителем на SurfaceView и ... что на AspectRatioFrameLayout?   -  person superjos    schedule 29.06.2018


Ответы (4)


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

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

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

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

person Hugo Gresse    schedule 18.11.2015
comment
Спасибо! Извините за поздний ответ ... это сработало! Так легко, просто переключение на макет кадра помогло - person kimv; 21.11.2015

Есть самый быстрый способ заполнить экран видео. Перейдите в класс 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) Вот и все!

person Hien Quang Le    schedule 12.03.2017
comment
simpleExoPlayerView.setResizeMode (AspectRatioFrameLayout.RESIZE_MODE_FILL); это полезно для заполнения родительского представления игроком. - person SANAT; 19.04.2017
comment
что, если я хочу установить соотношение сторон - person Anil Ugale; 22.09.2017
comment
Если вы хотите сохранить соотношение сторон видео, но расширить его до полного размера просмотра, используйте fixed_width, если ваше видео выше, чем его ширина (портрет), или fixed_height, если оно шире, чем высокое (альбомная ориентация). - person Gmeister4; 09.11.2017
comment
Это устарело, какое решение теперь? - person Lutaaya Huzaifah Idris; 24.01.2021

Это также можно сделать в 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" />
person stevyhacker    schedule 10.12.2018
comment
Тег resize_mode также есть на com.google.android.exoplayer2.ui.PlayerView для меня. Однозначно самое простое решение. +1 - person user1032613; 28.03.2019

Просто используйте следующую строку в своем xml. Это будет работать отлично.

app:resize_mode="fill"
person vishva vijay    schedule 03.10.2019