android 采集摄像头预览帧,使用opencv和MediaCodec直接录制水印滤镜视频

写在前面的

网上有很多博客都是讲使用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
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值