【问题标题】:Center Crop Exoplayer with SurfaceView带有 SurfaceView 的中心裁剪 Exoplayer
【发布时间】:2017-07-18 14:16:43
【问题描述】:

我目前在一个项目中使用 Exoplayer,并希望在视频上实现类似于您在图像视图中看到的“CenterCrop”类型属性。基本上它将适合表面视图的高度,保持相同的纵横比,并裁剪离开屏幕的一侧的边缘。我的布局看起来像这样:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/videoPlayerContainer"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="404dp">

    <com.google.android.exoplayer2.ui.SimpleExoPlayerView
        android:id="@+id/videoPlayer"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:clickable="true"
        app:controller_layout_id="@layout/empty_controls">

        <SurfaceView
            android:id="@+id/surfaceView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
    </com.google.android.exoplayer2.ui.SimpleExoPlayerView>

    <TextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Text"
        android:background="@android:color/white"/>

</FrameLayout>

大部分用于创建和启动播放器的代码已经由同事在包装器中设置,基本上如下所示:

BandwidthMeter bandwidthMeter = new DefaultBandwidthMeter();
TrackSelection.Factory videoTrackSelectionFactory = new AdaptiveVideoTrackSelection.Factory(bandwidthMeter);
trackSelector = new DefaultTrackSelector(videoTrackSelectionFactory);

LoadControl loadControl = new DefaultLoadControl();
simpleExoPlayer = ExoPlayerFactory.newSimpleInstance(this.context, trackSelector, loadControl);

simpleExoplayer.setSurfaceView(surfaceView);

DataSource.Factory mediaDataSourceFactory = new DefaultDataSourceFactory(context, "Agent");

MediaSource videoSource = new HlsMediaSource(uri, mediaDataSourceFactory, new Handler(), null);

simpleExoplayer.addListener(this);
simpleExoplayer.prepare(videoSource);

simpleExoplayer.setPlayWhenReady(true);

//this is supposedly used to set the scaling mode
simpleExoplayer.setVideoScalingMode(C.VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING);

此代码采用 uri 进行一些设置并播放视频,一切正常。在对裁剪进行了一些研究之后,我发现了我在上面代码的最后一行添加的“setVideoScalingMode”。不幸的是,这无济于事。有没有人知道这应该如何完成以及我可以调整以使其正常工作?谢谢!

【问题讨论】:

  • 你必须使用SurfaceView吗? TextureView 有一个很好的 setTransform(Matrix) 功能,可以让您完全控制缩放/平移/旋转
  • @pskink 我可能可以使用texttureview。但是我读到它比表面视图消耗电池的速度要快得多。
  • 而你想用一块石头杀死两只鸟...
  • @pskink 好吧,鉴于此视频所在位置的性质,我宁愿不耗尽用户的电池电量,而是想出替代 UX。问题是具有表面视图的 ExoPlayer 显然对这种缩放有某种支持,但目前尚不清楚如何实现这一点,因为这方面的信息很少。有一些 Github 问题在讨论这个问题,但解决方案从来没有真正清楚地解释过。
  • 同意,VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING 的描述在某种程度上具有误导性,因为它没有说明如何裁剪内容以适应表面

标签: android video-streaming crop exoplayer


【解决方案1】:

我知道这很晚才能回答。经过大量的头脑风暴,研究EXOPlayer源代码来实现这个功能,我自己想通了,我所做的只是添加以下行,它就像一个魅力:

mVideoView.setResizeMode(AspectRatioFrameLayout.RESIZE_MODE_ZOOM); //This will increase video's height or width to fit with maintaining aspect ratios of video.

并删除下面提到的其他两个选项:

mExoplayer.setVideoScalingMode(C.VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING);
mVideoView.setResizeMode(AspectRatioFrameLayout.RESIZE_MODE_FILL)

愿这对其他人有所帮助。

【讨论】:

  • 事实上,在关于这个问题的 GitHub 线程中(github.com/brianwernick/ExoMedia/issues/80),最后得出了相同的结论(仅使用RESIZE_MODE_ZOOM),作者表示他们可能会提供支持按版本 3.x 缩放类型。
  • 这行得通。我认为这应该添加到 Exoplayer 文档中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-04
  • 2013-05-19
  • 2020-08-04
  • 2019-06-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多