问题描述
我正在使用 VLCAndroid 库。在开始时,我使用了 TextureView,因此我可以将播放器旋转到任何我想要的方向。但是 TextureView 在一些旧设备中表现出较差的性能并降低 FPS,然后我必须切换回 SurfaceView。但是我不能再旋转播放器了
我尝试通过 requestOrientation()
设置活动的方向,但我使用的设备无法将其设置为 REVERSE_LANDSCAPE
。
我尝试设置 VLC 选项,但它也不起作用:
args.add("--video-filter=rotate")
args.add("--rotate-angle=180")
所以我剩下的唯一选择是旋转 VLCLayout 的 SurfaceView。但是我尝试将其方向设置为 180f,但它也不起作用。
你知道如何旋转SurfaceView吗?谢谢。
解决方法
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;
}
}
您需要使用缩放和纵横比功能。