Android TV 中的 ExoPlayer 以纵向模式而不是横向模式播放视频

Posted

技术标签:

【中文标题】Android TV 中的 ExoPlayer 以纵向模式而不是横向模式播放视频【英文标题】:ExoPlayer in Android TV plays video in portrait mode instead of landscape 【发布时间】:2019-01-27 14:06:39 【问题描述】:

我们正在使用 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()

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

【问题讨论】:

【参考方案1】:

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 帖子中找到另一种补救措施。

【讨论】:

【参考方案2】:

据我所知,exoplayer 将根据texture view 大小生成其大小。所以尝试以编程方式调整您的texture view 的大小

playerView.setResizeMode(AspectRatioFrameLayout.RESIZE_MODE_FILL);

并尝试以编程方式调整播放器的大小

mPlayer.setVideoScalingMode(C.VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING);

希望这会有所帮助。

【讨论】:

以上是关于Android TV 中的 ExoPlayer 以纵向模式而不是横向模式播放视频的主要内容,如果未能解决你的问题,请参考以下文章

android tv 中的 Exoplayer 不会在直播中重现 (.m3u8) 文件

Android TV Leanback Exoplayer 视频缩放问题

Android TV - Exoplayer 控件显示在模拟器上但不显示在电视上

Android 7+ 中的 Exoplayer 宽高比

Android 和 Exoplayer 中的视图绑定

Android TV 中的真实 4K