Android 使用MediaRecord录像的一些问题总结

本文总结了使用MediaRecord进行录像时遇到的清晰度、亮度和帧数问题的解决办法。通过采用系统配置参数改善清晰度,通过调整源码解决亮度不足问题,以及利用camera设置达到理想帧率,实现与系统录像质量一致。

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

最近一段时间都在做一些录像相关的事情,通过直接找到一些大神的博客,学习怎么使用MediaRecord,总算完成,如果只是这样就不写这篇文章了,关键在我们的技术支持是一个追求完美的人,他提出了三个问题:

1、录像出来的文件清晰度不够;

2、录像文件和系统对比,亮度不够;

3、帧数达不到要求;

总之就是和系统录像有差距,录制的视频文件要和系统录制出来的一样,头大,针对个问题,又是一番百度:

1、针对清晰度问题,直接采用系统配置的参数

private
@Nullable
CamcorderProfile getBestCamcorderProfile() {
    int quality = CamcorderProfile.QUALITY_HIGH;
    if (videoType == 1 && CamcorderProfile.hasProfile(CamcorderProfile.QUALITY_1080P)) {
        quality = CamcorderProfile.QUALITY_1080P;
    } else if (videoType == 2 && CamcorderProfile.hasProfile(CamcorderProfile.QUALITY_720P)) {
        quality = CamcorderProfile.QUALITY_720P;
    } else if (videoType == 3 && CamcorderProfile.hasProfile(CamcorderProfile.QUALITY_480P)) {
        quality = CamcorderProfile.QUALITY_480P;
    } else {
        quality = CamcorderProfile.QUALITY_CIF;
    }
    return CamcorderProfile.get(quality);
}

这样录制的视频清晰度绝对是系统级别的,如果不需要,可以自由调整比特率和分辨率来满足需求;

2、针对亮度不够的问题:

这里走了不少弯路,首先想到的是黑白平衡、亮度、饱和度、曝光级别,设置了都没用,至少在我测试的定制机上是没有效果的;后面又想到了自动聚焦和区域聚焦,结果把自己调到一个更大的坑,一把辛酸泪不多说;最后实在没办法,翻阅系统MediaRecord相关demo,想从这个里面找到原因,看了两天,txt上看真的头疼,好不容易看完,修改录像代码,测试发现没效果;最后只能去阅读camera 源码,在源码里面总算找到一个方法:

没错 就是这个方法,设置之后效果和系统录像一致,达到了要求;

3、第三个问题相比起来简直不是问题,camera直接提供了相应的方法:

查阅了不少大神博客,发现很少有用这个方法的,为了达到要求,设置了这个方法,和系统录像达到一样的帧率,不过要注意的是,最大最小帧率都是30帧,录像文件只有29.xx帧,会有一点损失。

 

三个问题总算解决,成功保住了饭碗,下面贴出代码:

public class MediaRecorderActivity extends BaseActivity
        implements SurfaceHolder.Callback, MediaRecorder.OnErrorListener
        , MediaRecorder.OnInfoListener {


    // ---------------------------- 常量-------------------------------

    // -------------------------- 全局变量------------------------------
    private MediaRecorder mediarecorder;// 录制视频的类
    private SizeSurfaceView surfaceview;// 显示视频的控件
    // 用来显示视频的一个接口,我靠不用还不行,也就是说用mediarecorder录制视频还得给个界面看
    private SurfaceHolder surfaceHolder;
    private int WIDTH_DEF = 1920;
    private int HEIGHT_DEF = 1080;


    private static final int ONE_MINUTE_TIME = 60 * 1000;
    private static final int ONE_HOUR_TIME = 60 * ONE_MINUTE_TIME;

    private String outString;
    private String parentString;

    private static Timer timer;

    private Camera mCamera;

    private int videoType = 3;  //1 : 1080P   2 : 720 P   3 : 480   4: 流畅


    //控制闪光灯 手电筒的
    public static final int FLASH_MODE_OFF = 0;
    public static final int FLASH_MODE_ON = 1;
    public static int flashType = FLASH_MODE_OFF;

    private boolean isNotify = false;

    private long mMediaRecorderStartTImes = 0;

    //记录本地视频信息
    private VideoData videoData = new VideoData();
    private long fragmentVideoDataStartTimes;
    private ArrayList<FragmentVideoData> fragmentVideoDatas = new ArrayList<>();


    public static void launch(Context context) {
        Intent i = new Intent(context, MediaRecorderActivity.class);
        i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(i);
    }

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        /**
         * 如果录像按钮不处于按下状态,结束录制本地视频
         * 防止出现本地视频自己会开启的情况
         */
        if (!HandlerManager.isPress) {
            finish();
            return;
        }
        setContentView(R.layout.activity_mediarecord);
        initView();
        initData();
    }


    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        // 将holder,这个holder为开始在oncreat里面取得的holder,将它赋给surfaceHolder
        surfaceHolder = holder;
        initCamera();
        start();
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        // 将holder,这个holder为开始在oncreat里面取得的holder,将它赋给surfaceHolder
        surfaceHolder = holder;
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        releaseCamera();
        surfaceview = null;
        surfaceHolder = null;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        stopMediarecorder();
        releaseCamera();
        stopTimer();
        LightPoingManager.getInstance().cancel();
        getDuration();
        VideoManager.getInstance().setIsPress(true);
    }


    @Override
    public void onError(MediaRecorder mr, int what, int extra) {
        TtsManager.getInstance().say("录制出错,已经结束本次录制");
        releaseCamera();
        finish();
    }

    @Override
    public void onInfo(MediaRecorder mr, int what, int extra) {
        if (what == MediaRecorder.M
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值