背景:
针对视频满屏播放,有时候如果仅仅是设置某个控件宽高都是match_parent, 但是视频源却没有和设备的比例保持一致,就会存在画面被拉伸的情况,那么应该怎么避免呢?
解决方法:
第一步:确定视频源的比例:根据帧宽高算出比例大致是9:5
第二步:确定设备的宽高比例,我们设备屏幕是10寸,宽高是:1920*1200,比例是8:5
第三步:分析,从上面两个比值来看,视频源比例和设备比例不一致,在高度相同的情况下,视频源要宽一点,设备要窄一点。如果设置视频控件的宽高是match_parent, 在源和设备高度一致的情况下,会将视频做横向压缩。
第四步:计算,两种方案(a)控件宽度固定,高度适当做比例压缩:9/5 = 1920/h ===> h = 1920/( 9/5),高度从1200压缩至1065。(b)如果是控件高度固定,宽度做适当调整:9/5 = w/1200=====>w = 1200*(9/5),宽度从1920拉伸到2160。这个已经超出设备屏幕,所以采用方案a
实际需求中,或许也会要求其他缩放模式,那么可以借鉴exoplayer中的源码,做出适合项目需求的缩放比例。
分析 google 中exoplayer是如何计算视频播放比例:
exoplayer 中提供了如下几种尺寸适配方式:
/**
* Resize modes for {@link AspectRatioFrameLayout}.
*/
@Retention(RetentionPolicy.SOURCE)
@IntDef({RESIZE_MODE_FIT, RESIZE_MODE_FIXED_WIDTH, RESIZE_MODE_FIXED_HEIGHT, RESIZE_MODE_FILL,
RESIZE_MODE_ZOOM})