作者:JulyYu
转载地址:https://juejin.cn/post/7084866365487579166
前言
使用MediaPlayer
播放能力后再视频播放上还有一个问题需要解决,那就是适配尺寸适配。默认情况使用SurfaceView
播放视频可能会出现视频被拉伸或是压缩的情况。
MediaPlayer内部方案
视频资源信息如下所示,视频尺寸为1080x606
,正常播放情况是宽大于高展示。
MediaPlayer
内部支持视频播放尺寸设置:VIDEO_SCALING_MODE_SCALE_TO_FIT
和 VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING
,通过setVideoScalingMode
方法进行设置。两种方式展示形式如下图所示。
但实际效果上展示并为达到预期效果,要实现预先的尺寸适配还是要去修改窗口尺寸才行。
适配方案
在适配方案上的算法设计应该是视频宽高的某一边撑满屏幕(因为其他情况暂时不考虑),预设上先以屏幕尺寸作为基准来实现。这里也先以屏幕竖屏为例,横屏情况其实也是相同方案。
预先设计以屏幕竖屏需要撑满宽,计算屏幕宽高比,获取到视频尺寸后利用屏幕宽高比。以屏幕的宽为视频尺寸缩放后的宽,然后计算出视频尺寸缩放后的高。最终计算出来的尺寸并是SurfaceView
视图窗口大小这样就能够保证播放视频尺寸被拉伸的问题了。
代码部分
视频尺寸信息可以在MediaPlayer
加载视频资源准备结束后获取到。还记得之前提到通过getTrackInfo()
无法获取到视频尺寸,也不需要通过MediaExtractor
来实现,其实可以直接通过MediaPlayer
准备就绪后获取到视频信息。
@Override
public void onPrepared(MediaPlayer mp) {
playerInfo.playerStatus = PREPARED;
//获取到的资源不够查询详细数据
int width = mp.getVideoWidth();
int height = mp.getVideoHeight();
playerInfo.videoSize = new Size(width,height);
callbackInfo(playerInfo);
}
在资源准备就绪后在回调中获取到屏幕尺寸,然后算法计算出窗口大小从而实现视频尺寸适配。
@Override
public void onPlayerInfoCallBack(AndroidMediaPlayer.PlayerInfo playerInfo) {
if(playerInfo.getPlayerStatus() == AndroidMediaPlayer.PREPARED){
//屏幕比例
Size size = ScreenUtils.getScreenSize(TestSimpleMediaPlayerActivity.this);
//以宽为主
Size videoSize = playerInfo.getVideoSize();
//视频比例
float videoRatio = videoSize.getWidth() / (float)videoSize.getHeight();
float newHeight = size.getWidth() / videoRatio;
LinearLayout.LayoutParams layoutParams =(LinearLayout.LayoutParams) surfaceView.getLayoutParams();
layoutParams.height = (int)newHeight;
// 重新设置窗口尺寸高
surfaceView.setLayoutParams(layoutParams);
androidMediaPlayer.start();
}
}
总结
事实上视频播放窗口尺寸设置通过改变最终播放窗口尺寸即可。当然可以不根据屏幕尺寸作为基准来适配窗口大小,例如SurfaceView
外部布局窗口是个正方形等也是能够实现但展示效果上或许不太好看。其次若要视频尺寸内部缩放裁剪等(16:9、3:4)那可能就需要其他方案实现了。
网友评论