14

我有一个使用 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());

会解决问题,但我没有成功。有没有办法用视频填充屏幕,即使部分视频从屏幕上被切断?

4

4 回答 4

13

有一种最快的方法可以用视频填充屏幕。去SimpleExoPlayerView.java上课,把resizeModefromAspectRatioFrameLayout.RESIZE_MODE_FIT改成AspectRatioFrameLayout.RESIZE_MODE_FILLRESIZE_MODE_FILL将忽略指定的纵横比。如果您在项目中使用 ExoPlayer 作为模块,请使用这种方式。

更新 如果您使用 ExoPlayer 作为库,他们有一个方法来setResizeMode(). 你只是AspectRatioFrameLayout.RESIZE_MODE_FILL在你看来: simpleExoPlayerView.setResizeMode(AspectRatioFrameLayout.RESIZE_MODE_FILL) 就是这样!

于 2017-03-12T03:15:48.023 回答
11

这也可以在 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" />
于 2018-12-10T20:34:08.720 回答
8

您可以删除.com.google.android.exoplayer.AspectRatioFrameLayout

接下来,把一个简单FrameLayout的带宽度和高度放在match_parent.

请注意,SurfaceView应该保持在 width 和 height = match_parent

解释:AspectRatioFrameLayout是根据真实的视频比例设置正确的视图高度(根据宽度、高度和pixelRatio计算)。如果你不想这样,Exoplayer 仍然可以SurfaceView像以前一样在 a 上显示视图。如果SurfaceView不是@Override,它将没有纵横比。

于 2015-11-18T09:02:17.973 回答
2

只需在您的 xml 中使用下面的行。它会完美地工作。

app:resize_mode="fill"
于 2019-10-03T06:16:40.247 回答