JavaCV的摄像头实战之三:保存为mp4文件

欢迎访问我的GitHub

这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos

本篇概览

  • 本文是《JavaCV的摄像头实战》的第三篇,如题,咱们一起实践如何将摄像头的视频内容保存为MP4文件

编码

  • 《JavaCV的摄像头实战之一:基础》一文创建的simple-grab-push工程中已写好父类AbstractCameraApplication,本篇继续使用该工程,创建子类实现那些抽象方法即可
  • 编码前先回顾父类的基础结构,如下图,粗体是父类定义的各个方法,红色块都是需要子类来实现抽象方法,所以接下来,咱们以本地窗口预览为目标实现这三个红色方法即可:
    在这里插入图片描述
  • 新建文件RecordCameraSaveMp4.java,这是AbstractCameraApplication的子类,其代码很简单,接下来按上图顺序依次说明
  • 定义一个成员变量,用于指定视频文件存放路径,这里文件名用的是当前时间字符串,请您根据自己电脑的情况调整路径:
	// 存放视频文件的完整位置,请改为自己电脑的可用目录
    private static final String RECORD_FILE_PATH = "E:\\temp\\202111\\28\\camera-"
                                                 + new SimpleDateFormat("yyyyMMddHHmmss").format(new Date())
                                                 + ".mp4";
  • 将视频帧存为mp4文件的功能来自FrameRecorder,这是个抽象类,本篇用到的是其子类FFmpegFrameRecorder,所以定义FrameRecorder类型的成员变量:
	// 帧录制器
    protected FrameRecorder recorder;
  • 然后是初始化操作,可见是FFmpegFrameRecorder的实例化和各项参数设置:
    @Override
    protected void initOutput() throws Exception {
        // 实例化FFmpegFrameRecorder
        recorder = new FFmpegFrameRecorder(RECORD_FILE_PATH,        // 存放文件的位置
                                           getCameraImageWidth(),   // 分辨率的宽,与视频源一致
                                           getCameraImageHeight(),  // 分辨率的高,与视频源一致
                                           0);                      // 音频通道,0表示无

        // 文件格式
        recorder.setFormat("mp4");

        // 帧率与抓取器一致
        recorder.setFrameRate(getFrameRate());

        // 编码格式
        recorder.setPixelFormat(AV_PIX_FMT_YUV420P);

        // 编码器类型
        recorder.setVideoCodec(avcodec.AV_CODEC_ID_MPEG4);

        // 视频质量,0表示无损
        recorder.setVideoQuality(0);

        // 初始化
        recorder.start();
    }
  • 接下来是output方法,一行就够了:
    @Override
    protected void output(Frame frame) throws Exception {
        // 存盘
        recorder.record(frame);
    }
  • 最后是处理视频的循环结束后,程序退出前要做的事情,即关闭帧抓取器:
    @Override
    protected void releaseOutputResource() throws Exception {
        recorder.close();
    }
  • 至此,将摄像头视频存为mp4文件的功能已开发完成,再写上main方法,注意参数30表示抓取和录制的操作执行30秒,注意,这是程序执行的时长,不是录制视频的时长
    public static void main(String[] args) {
        // 录制30秒视频
        new RecordCameraSaveMp4().action(30);
    }
  • 运行main方法,等到控制台输出下图红框的内容时,表示视频录制完成:
    在这里插入图片描述
  • 打开mp4文件所在目录,如下图,红框中就是刚刚生成的文件和相关信息,可见分辨率和帧率都符合预期:
    在这里插入图片描述
  • 用VLC打开这个文件,如下图,播放正常:
    在这里插入图片描述
  • 至此,咱们已完成了保存视频文件的功能,得益于JavaCV的强大,整个过程是如此的轻松愉快,接下来请继续关注欣宸原创,《JavaCV的摄像头实战》系列还会呈现更多丰富的应用;

源码下载

  • 《JavaCV的摄像头实战》的完整源码可在GitHub下载到,地址和链接信息如下表所示(https://github.com/zq2599/blog_demos):
名称链接备注
项目主页https://github.com/zq2599/blog_demos该项目在GitHub上的主页
git仓库地址(https)https://github.com/zq2599/blog_demos.git该项目源码的仓库地址,https协议
git仓库地址(ssh)git@github.com:zq2599/blog_demos.git该项目源码的仓库地址,ssh协议
  • 这个git项目中有多个文件夹,本篇的源码在javacv-tutorials文件夹下,如下图红框所示:
    在这里插入图片描述
  • javacv-tutorials里面有多个子工程,《JavaCV的摄像头实战》系列的代码在simple-grab-push工程下:
    在这里插入图片描述

你不孤单,欣宸原创一路相伴

  1. Java系列
  2. Spring系列
  3. Docker系列
  4. kubernetes系列
  5. 数据库+中间件系列
  6. DevOps系列
  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 13
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员欣宸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值