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

欢迎访问我的GitHub

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

本篇概览

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

编码

  • 《JavaCV的摄像头实战之一:基础》一文创建的simple-grab-push工程中已写好父类AbstractCameraApplication,本篇继续使用该工程,创建子类实现那些抽象方法即可
  • 编码前先回顾父类的基础结构,如下图,粗体是父类定义的各个方法,红色块都是需要子类来实现抽象方法,所以接下来,咱们以本地窗口预览为目标实现这三个红色方法即可:

JavaCV的摄像头实战之三:保存为mp4文件
  • 新建文件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方法,等到控制台输出下图红框的内容时,表示视频录制完成:

JavaCV的摄像头实战之三:保存为mp4文件
  • 打开mp4文件所在目录,如下图,红框中就是刚刚生成的文件和相关信息,可见分辨率和帧率都符合预期:

JavaCV的摄像头实战之三:保存为mp4文件
  • 用VLC打开这个文件,如下图,播放正常:

JavaCV的摄像头实战之三:保存为mp4文件
  • 至此,咱们已完成了保存视频文件的功能,得益于JavaCV的强大,整个过程是如此的轻松愉快,接下来请继续关注欣宸原创,《JavaCV的摄像头实战》系列还会呈现更多丰富的应用;

源码下载

名称 链接 备注 项目主页
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的摄像头实战之三:保存为mp4文件
  • javacv-tutorials里面有多个子工程,《JavaCV的摄像头实战》系列的代码在 simple-grab-push工程下:

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

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

https://github.com/zq2599/blog_demos

Original: https://www.cnblogs.com/bolingcavalry/p/15845334.html
Author: 程序员欣宸
Title: JavaCV的摄像头实战之三:保存为mp4文件

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/588828/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 15.log4j.properties

    set log levels log4j.rootLogger = INFO,stdout,E out console log4j.appender.stdout = org.ap…

    Java 2023年6月13日
    073
  • 使用http代理,解决Java对外请求需固定ip问题

    背景:对接第三方接口,第三方为安全考虑,需要固定ip设置白名单。公司对外使用动态ip。 办法: 购买一台ip固定的服务器,比如云虚拟服务器。搭建http代理服务器,比如prioxy…

    Java 2023年5月29日
    083
  • Java面向对象(二)

    Java面向对象(二) Java面向对象(二) – 五、方法 5.1 方法的重载(overload) 5.2 可变参数的形参 5.3 方法参数的值传递机制 5.4 递归…

    Java 2023年6月9日
    081
  • StatementHandler-Mybatis源码系列

    内容更新github地址:我飞 StatementHandler接口 StatementHandler封装了Mybatis连接数据库操作最基础的部分。因为,无论怎么封装,最终我们都…

    Java 2023年6月14日
    0102
  • Spring-Cloud-Commons模块

    本文介绍SpringCloud的另一个基础模块 Spring Cloud Commons模块 。只要在项目的pom文件中引入了 spring-cloud-starter 依赖包 ,…

    Java 2023年5月30日
    084
  • 力扣刷题之路——二维数组变换、前缀和数组

    刷题顺序参考:力扣刷题顺序 涉及题目 48. 旋转图像 73. 矩阵置零 289. 生命游戏 238. 除自身以外数组的乘积 旋转图像 自己的解题思路: 题目上说不能使用另一个矩阵…

    Java 2023年6月5日
    093
  • Spring boot 内置tomcat禁止不安全HTTP方法

    Spring boot 内置tomcat禁止不安全HTTP方法 在tomcat的web.xml中可以配置如下内容,让tomcat禁止不安全的HTTP方法 <security-…

    Java 2023年5月30日
    079
  • 80后的互联网记忆

    现在下载音乐的网站越来越少,网易云黑金会员,居然一个月只能下载300首,一个月只能下载这么多,再多就超标了. 另外网易云下载的歌曲居然是ncm格式的,只能用网易云打开 无比怀恋80…

    Java 2023年6月9日
    0100
  • virtual box入门使用+踩坑

    事实上我并不是完全安装上面步骤进行安装,在vagrant 使用上,我选择的是使用命令行 进行虚拟机配置。 安装完virtual后,记得把虚拟机存储路径变为非C盘。不然C盘分分钟爆炸…

    Java 2023年6月7日
    072
  • IDEA插件和个性化配置推荐

    插件推荐 我自己现在使用的一些插件和一些自己感觉比较舒服配置分析给大家 idea如何安装插件: 如果打开设置没有看到,直接搜索plugins 然后在这里搜索即可 CodeGlanc…

    Java 2023年6月6日
    0101
  • 解决Nginx同网段ip_hash负载均衡无效果

    问题 Nginx ip_hash在局域网中所有机器访问的都是同一台机器没有Hash。造成原因如被Hash的Ip为192.168.1.100;实则上Nginx进行Hash算法时取的是…

    Java 2023年6月5日
    083
  • Docker操作(一) 镜像

    Docker操作(一) 镜像 1、查看本地所有镜像 docker images 2、搜索镜像 docker search 镜像名称 3、拉取镜像 未指定版本,就拉取latest最近…

    Java 2023年6月8日
    075
  • Java实现求质数(素数)

    题目要求: &#x8F93;&#x51FA;0-100&#x4EE5;&#x5185;&#x7684;&#x6240;&#x…

    Java 2023年6月9日
    080
  • 微服务保护

    1.初识Sentinel 1.1.雪崩问题及解决方案 1.1.1.雪崩问题 依赖服务I的业务请求被阻塞,用户不会得到响应,则tomcat的这个线程不会释放,于是越来越多的用户请求到…

    Java 2023年6月9日
    084
  • 日常学习用到的Git指令

    Git 常用Git指令 (本地) git init – 将文件夹初始化为Git仓库 git add – 将工作区的指定文件放入暂存区 git status …

    Java 2023年6月5日
    072
  • MySQL安装卸载、idea中Database的使用、常用的sql语句

    MySQL安装卸载 MySQL安装 在下面的 &#x8D44;&#x6E90;&#x94FE;&#x63A5;中下载MySQL软件 压缩包(绿色版)…

    Java 2023年6月15日
    067
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球