写在前面的
网上有很多博客都是讲使用opengl+camera2美颜相机,本人技术能力有限,觉得openGL android使用十分复杂,GLES20以后还需要理解顶点着色器片段着色器等晦涩的名词,离开操作手册还是什么也不会写。camera2 api接口的回调太多,导致代码逻辑混乱,难以组织逻辑。
偶然发现opencv处理后拍视频,一点也不用担心处理的耗时导致视频卡顿,MediaCodec自带Buffer缓冲,拍720p的视频也没问题,1080p还没试过。由此做下笔记。
而opencv的滤镜库也很成熟,美颜滤镜磨皮美白也一大把,如果加静态图文水印就更简单,用不到滤镜算法。为windows平台写的opencv滤镜算法都有参考价值。
MediaCodec编码后可以录制视频,也可以编码成h264,h265等推流直播,会议。
首先根据设置支持Profile获取支持录制的视频格式,这里的例子都没添加声道,因为我觉得添加声音一定不难。
public class CameraUtils {
/**
* 根据MediaRecord支持的录像size大小,MediaRecord支持的录像大小,也是MediaCodec支持的
*/
public static Point initSupportProfile() {
int mQuality = 0;
if (CamcorderProfile.hasProfile(CamcorderProfile.QUALITY_TIME_LAPSE_480P)) {
//无声音的480p
mQuality = CamcorderProfile.QUALITY_TIME_LAPSE_480P;
} else if (CamcorderProfile.hasProfile(CamcorderProfile.QUALITY_TIME_LAPSE_QVGA)) {
mQuality = CamcorderProfile.QUALITY_TIME_LAPSE_QVGA;
} else if (CamcorderProfile.hasProfile(CamcorderProfile.QUALITY_TIME_LAPSE_CIF)) {
mQuality = CamcorderProfile.QUALITY_TIME_LAPSE_CIF;
} else if (CamcorderProfile.hasProfile(CamcorderProfile.QUALITY_TIME_LAPSE_720P)) {
mQuality = CamcorderProfile.QUALITY_TIME_LAPSE_720P;
}
Log.d("px", "finally mQuality resolution:" + mQuality);
CamcorderProfile profile = CamcorderProfile.get(mQuality);
Log.d("px", "video screen from CamcorderProfile resolution:" + profile.videoFrameWidth + "*" + profile.videoFrameHeight);
return new Point(profile.videoFrameWidth, profile.videoFrameHeight);
}
}
然后根据这个视频尺寸去找预览尺寸,相同尺寸最好,设置帧率,预览颜色格式,帧率。值得一提的是,帧率设置在很多设备报错,可能不能设置,或设置的不对吧。
static Camera.Parameters showSupportPreviewSize(Camera camera, Point size) {
//处理预览尺寸
Camera.Parameters p = camera.getParameters();
List<Camera.Size> previewSizes = p.getSupportedPreviewSizes();
if (previewSizes != null) {
StringBuilder sb = new StringBuilder("SupportedPreviewSizes:[");
for (Camera.Size s : pr