首页 > 解决方案 > Android TV 中的 ExoPlayer 以纵向模式而不是横向模式播放视频

问题描述

我们正在使用 ExoPlayer 在 Android TV 上播放 m3u8 文件(流)。流媒体工作正常,但视频以纵向模式播放(即使视频是横向拍摄的)。看起来像 android TV 的方向而不是纵横比的一些问题。

private fun initializePlayer() {

    if(mPlayer == null) {

        playerView = activity!!.findViewById<SimpleExoPlayerView>(R.id.texture_view)
       // playerView!!.setControllerVisibilityListener(this)
        playerView!!.requestFocus()
        val bandwidthMeter = DefaultBandwidthMeter()
        val videoTrackSelectionFactory = AdaptiveTrackSelection.Factory(bandwidthMeter)
        mTrackSelector = DefaultTrackSelector(videoTrackSelectionFactory)

        mPlayer = ExoPlayerFactory.newSimpleInstance(activity, mTrackSelector)
        playerView!!.player= mPlayer

        mPlayerAdapter = LeanbackPlayerAdapter(activity, mPlayer, UPDATE_DELAY)
        mPlayerGlue = VideoPlayerGlue(activity!!, mPlayerAdapter!!)
        mPlayerGlue!!.host = VideoSupportFragmentGlueHost(this)
        mPlayerGlue!!.playWhenPrepared()
        play(s1)
    }
}

评论这些行:

mPlayerAdapter = LeanbackPlayerAdapter(activity, mPlayer, UPDATE_DELAY)
mPlayerGlue = VideoPlayerGlue(activity!!, mPlayerAdapter!!)
mPlayerGlue!!.host = VideoSupportFragmentGlueHost(this)
mPlayerGlue!!.playWhenPrepared()

横向播放视频,但播放器控件被隐藏,它只播放最低质量的视频。请帮助我们。

标签: kotlinandroid-tvm3u8exoplayer

解决方案


视频的元数据MP4包含一个名为Rotation=90°但它被ExoPlayer. 要修复它,您需要将此 Java 函数注入到您的代码中:

void onVideoSizeChanged(int width, 
                        int height, 
                        int unappliedRotationDegrees, // 90° or 270°
                      float pixelWidthHeightRatio);

这允许应用程序通过TextureView对 进行适当的调用来轻松应用旋转TextureView.setTransform。请注意,在 Lollypop+unappliedRotationDegrees上将始终等于 0。

你可以在GitHub的MediaCodecVideoTrackRenderer页面的第 74 行找到这个函数。

如果上述方法对您不起作用,您可以在GitHub 上的Rotation Issue #91帖子中找到另一种补救措施。


推荐阅读