基于SnapDragonBoard410c的视频录制出现分辨率变化的原因

本文介绍了在使用MediaRecorder进行视频录制时遇到的startfailed错误及其解决方案。通过正确设置预览和录制分辨率,并确保这些设置与设备支持的分辨率匹配,可以有效避免此问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

某天搞来一块410c开发板开始录制的时候报我MediaRecorder: start failed错误。
经过一番折腾,才发现是分辨率的问题。
事情是这个样子的:
按正常流程,在录制前,我们需要设置camera的分辨率和录制的分辨率。
也就是

Parameters parameter=camera.getParameters();
parameter.setPreviewSize(1280,720);
//以及
mRecorder.setVideoSize(1280,720);

这里有个问题。设置分辨率的时候值必须是设备支持的。如果设置了不支持的分辨率,运行时就会报错。
那么,怎么获得支持的分辨率呢?很简单:

Parameters parameter=camera.getParameters();
List<Camera.Size> prviewSizeList = parameter.getSupportedPreviewSizes();
List<Camera.Size> videoSizeList = parameter.getSupportedVideoSizes();

这里有两组分辨率。问题就在这,大部分手机这两组值是一样的。然而有部分手机却是不一样的。如果天真的使用其中一组里的值来设置预览和录制的分辨率,十有八九会有一个不支持导致错误。
所以我们需要根据两组不同的分辨率设置预览和录制。
比如我们以预览的分辨率为基准,查找出最接近的视频录制分辨率(以宽度为准):

Camera camera = Camera.open(0);
Parameters parameter=camera.getParameters();
List<Camera.Size> prviewSizeList = parameter.getSupportedPreviewSizes();
List<Camera.Size> videoSizeList = parameter.getSupportedVideoSizes();
parameter.setPreviewSize(prviewSizeList.get(0).width,prviewSizeList.get(0).height);

//查找出最接近的视频录制分辨率
public int bestVideoSize(int _w){
        //降序排列
        Collections.sort(videoSizeList, new Comparator<Camera.Size>() {
            @Override
            public int compare(Camera.Size lhs, Camera.Size rhs) {
                if (lhs.width > rhs.width) {
                    return -1;
                } else if (lhs.width == rhs.width) {
                    return 0;
                } else {
                    return 1;
                }
            }
        });
        for(int i=0;i<videoSizeList.size();i++){
            if(videoSizeList.get(i).width<_w){
                return i;
            }
        }
        return 0;
    }

int index=bestVideoSize(prviewSizeList.get(0).width);
MediaRecorder mRecorder = new MediaRecorder();
mRecorder.setVideoSize(videoSizeList .get(index).width,videoSizeList .get(index).height);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值