【问题标题】:How to rotate SurfaceView on Android?如何在 Android 上旋转 SurfaceView?
【发布时间】:2021-05-07 21:21:27
【问题描述】:

我正在使用 VLCAndroid 库。在开始时,我使用了 TextureView,因此我可以将播放器旋转到任何我想要的方向。但是 TextureView 在一些旧设备中表现不佳并且 FPS 下降,然后我必须切换回 SurfaceView。但是我不能再旋转播放器了

我尝试通过requestOrientation() 设置活动的方向,但我使用的设备无法将其方向设置为REVERSE_LANDSCAPE

我尝试设置 VLC 选项,但它也不起作用:

args.add("--video-filter=rotate")
args.add("--rotate-angle=180")

所以我剩下的唯一选择就是旋转 VLCLayout 的 SurfaceView。但是我尝试将其方向设置为 180f,但它也不起作用。

你知道如何旋转 SurfaceView 吗?谢谢。

【问题讨论】:

  • 你能分享详细的日志吗?

标签: android surfaceview libvlc vlc-android


【解决方案1】:
private void changeMediaPlayerLayout(int displayW, int displayH) {
        if (mMediaPlayer.isReleased()) return;
        /* Change the video placement using the MediaPlayer API */
        switch (mCurrentScaleType) {
            case SURFACE_BEST_FIT:
                mMediaPlayer.setAspectRatio(null);
                mMediaPlayer.setScale(0);
                break;
            case SURFACE_FIT_SCREEN:
            case SURFACE_FILL: {
                IMedia.VideoTrack vtrack = mMediaPlayer.getCurrentVideoTrack();
                if (vtrack == null)
                    return;
                final boolean videoSwapped = vtrack.orientation == IMedia.VideoTrack.Orientation.LeftBottom
                        || vtrack.orientation == IMedia.VideoTrack.Orientation.RightTop;
                if (mCurrentScaleType == MediaPlayer.ScaleType.SURFACE_FIT_SCREEN) {
                    int videoW = vtrack.width;
                    int videoH = vtrack.height;

                    if (videoSwapped) {
                        int swap = videoW;
                        videoW = videoH;
                        videoH = swap;
                    }
                    if (vtrack.sarNum != vtrack.sarDen)
                        videoW = videoW * vtrack.sarNum / vtrack.sarDen;

                    float ar = videoW / (float) videoH;
                    float dar = displayW / (float) displayH;

                    float scale;
                    if (dar >= ar)
                        scale = displayW / (float) videoW; /* horizontal */
                    else
                        scale = displayH / (float) videoH; /* vertical */
                    mMediaPlayer.setScale(scale);
                    mMediaPlayer.setAspectRatio(null);
                } else {
                    mMediaPlayer.setScale(0);
                    mMediaPlayer.setAspectRatio(!videoSwapped ? ""+displayW+":"+displayH
                            : ""+displayH+":"+displayW);
                }
                break;
            }
            case SURFACE_16_9:
                mMediaPlayer.setAspectRatio("16:9");
                mMediaPlayer.setScale(0);
                break;
            case SURFACE_4_3:
                mMediaPlayer.setAspectRatio("4:3");
                mMediaPlayer.setScale(0);
                break;
            case SURFACE_ORIGINAL:
                mMediaPlayer.setAspectRatio(null);
                mMediaPlayer.setScale(1);
                break;
        }
    }

来自https://code.videolan.org/videolan/vlc-android/-/blob/master/libvlc/src/org/videolan/libvlc/VideoHelper.java

您需要使用比例和纵横比功能。

【讨论】:

  • 您能详细解释一下吗?这与旋转媒体有何关系?
  • 它允许配置 libvlc 函数的视频输出
  • 但我无法访问它,因为它在 VideoHelper 中是私有的
  • 我尝试了这些代码,但它不起作用。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-22
  • 2012-10-06
相关资源
最近更新 更多