Android音视频开发系列-MediaPlayer视频窗口尺寸适配

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第3天,点击查看活动详情

前言

使用MediaPlayer播放能力后再视频播放上还有一个问题需要解决,那就是适配尺寸适配。默认情况使用SurfaceView播放视频可能会出现视频被拉伸或是压缩的情况。

MediaPlayer内部方案

视频资源信息如下所示,视频尺寸为1080x606,正常播放情况是宽大于高展示。

正常播放 视频信息
7943e6f265e50978628e70c99effa919.jpg 9f8313a8b9c837f2c21730a12fb10e5e.jpg

MediaPlayer内部支持视频播放尺寸设置:VIDEO_SCALING_MODE_SCALE_TO_FITVIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING,通过setVideoScalingMode方法进行设置。两种方式展示形式如下图所示。

VIDEO_SCALING_MODE_SCALE_TO_FIT VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING
4dc6ed9459f9b2cb73a900fd6bed5c6d.jpg a2b43b3ddb489f0484dfc3a5e7b26aba.jpg

但实际效果上展示并为达到预期效果,要实现预先的尺寸适配还是要去修改窗口尺寸才行。

适配方案

在适配方案上的算法设计应该是视频宽高的某一边撑满屏幕(因为其他情况暂时不考虑),预设上先以屏幕尺寸作为基准来实现。这里也先以屏幕竖屏为例,横屏情况其实也是相同方案。

预先设计以屏幕竖屏需要撑满宽,计算屏幕宽高比,获取到视频尺寸后利用屏幕宽高比。以屏幕的宽为视频尺寸缩放后的宽,然后计算出视频尺寸缩放后的高。最终计算出来的尺寸并是SurfaceView视图窗口大小这样就能够保证播放视频尺寸被拉伸的问题了。

80ccc37a3e1f6eaa9468ec7ea80837c3.jpg

代码部分

视频尺寸信息可以在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)那可能就需要其他方案实现了。

猜你喜欢

转载自juejin.im/post/7084866365487579166
今日推荐