【问题标题】:ExoPlayer in Android TV plays video in portrait mode instead of landscapeAndroid TV 中的 ExoPlayer 以纵向模式而不是横向模式播放视频
【发布时间】: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()

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

【问题讨论】:

    标签: kotlin android-tv m3u8 exoplayer


    【解决方案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);
      

      希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-11-04
        • 2013-03-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-21
        • 1970-01-01
        相关资源
        最近更新 更多