HardwareVideoCodec是一个高效的Android音视频编码库,支持软编和硬编。使用它你可以很容易的实现任何分辨率的视频编码,无需关心摄像头预览大小。一切都如此简单。目前已迭代多个稳定版本,欢迎查阅学习和使用,如有BUG或建议,欢迎Issue。
对Android摄像头开发有所了解的童鞋都知道,每个设备的摄像头都只支持固定的一系列分辨率,并且每个设备都有所不同。比如有些手机支持540x960,有的手机却不支持。
这使得我们每次使用Android摄像头的时候,不得不去获取一个支持分辨率列表,然后从中选取一个匹配的分辨率。但是前面说了,每个设备支持的分辨率都是不一样的,万一我们希望的分辨率正好在某设备上不支持,那怎么办。相信不少人不得不妥协,选择一个普遍支持的分辨率,来支持绝大多数的设备。这虽然能把出错率降到最低,但理论上还是会存在不支持的设备。对于有强迫症的部分人,简直不能忍!
摄像头兼容性这件苦差事,相信折磨着不少同鞋,也包括我。所以最近我一直在思考,有没有一劳永逸的方法,来支持任意分辨率摄像头的预览以及视频编码呢?我们先来分析一下。
对于以上的提问其实可以分解为两个问题
1. 如何根据给定的目标分辨率来选择最合适的摄像头分辨率
2. 如何高效的把摄像头输出画面大小裁剪成目标大小
最佳分辨率的选择
这里有人可能知道,选择一个最接近的分辨率不就行了吗。那么这里我要提问了,这个最接近我们如何定义?相信很多同鞋也去网上查找过一些帖子,我一开始也是这样子,能找到的基本上都是对摄像头分辨率进行排序,然后选择一个最接近目标分辨率的大小。我司的线上项目也是使用的这种方法,很遗憾,在某些机型上出现了选择错误。为什么会这样,问题出在哪里?
各位有没有想过,分辨率是包含宽和高这两个属性的。举个例子,我们需要输出540x960这个分辨率,但是某机型并不支持这个分辨率,只支持720x960和540x1080这两个分辨率,如果我们用排序法对这两个分辨率进行排序,我们应该优先对宽进行排序,还是对高进行排序呢。显然,这里应该优先对宽排序,进而选择540x960这个分辨率。同理,有没有可能会出现对高进