乐趣区

关于云计算:JavaCV的摄像头实战之三保存为mp4文件

欢送拜访我的 GitHub

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

本篇概览

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

编码

  • 《JavaCV 的摄像头实战之一:根底》一文创立的 <font color=”red”>simple-grab-push</font> 工程中已写好父类 <font color=”blue”>AbstractCameraApplication</font>,本篇持续应用该工程,创立子类实现那些形象办法即可
  • 编码前先回顾父类的根底构造,如下图,粗体是父类定义的各个办法,红色块都是须要子类来实现形象办法,所以接下来,咱们以本地窗口预览为指标实现这三个红色办法即可:

  • 新建文件 <font color=”blue”>RecordCameraSaveMp4.java</font>,这是 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 办法,留神参数 <font color=”blue”>30</font> 示意抓取和录制的操作执行 30 秒,留神,这是程序执行的时长,<font color=”red”> 不是录制视频的时长 </font>:
    public static void main(String[] args) {
        // 录制 30 秒视频
        new RecordCameraSaveMp4().action(30);
    }
  • 运行 main 办法,等到控制台输入下图红框的内容时,示意视频录制实现:

  • 关上 mp4 文件所在目录,如下图,红框中就是刚刚生成的文件和相干信息,可见分辨率和帧率都合乎预期:

  • 用 VLC 关上这个文件,如下图,播放失常:

  • 至此,咱们已实现了保留视频文件的性能,得益于 JavaCV 的弱小,整个过程是如此的轻松愉快,接下来请持续关注欣宸原创,《JavaCV 的摄像头实战》系列还会出现更多丰盛的利用;

源码下载

  • 《JavaCV 的摄像头实战》的残缺源码可在 GitHub 下载到,地址和链接信息如下表所示 (https://github.com/zq2599/blo…):
名称 链接 备注
我的项目主页 https://github.com/zq2599/blo… 该我的项目在 GitHub 上的主页
git 仓库地址 (https) https://github.com/zq2599/blo… 该我的项目源码的仓库地址,https 协定
git 仓库地址 (ssh) git@github.com:zq2599/blog_demos.git 该我的项目源码的仓库地址,ssh 协定
  • 这个 git 我的项目中有多个文件夹,本篇的源码在 <font color=”blue”>javacv-tutorials</font> 文件夹下,如下图红框所示:

  • <font color=”blue”>javacv-tutorials</font> 外面有多个子工程,《JavaCV 的摄像头实战》系列的代码在 <font color=”red”>simple-grab-push</font> 工程下:

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

https://github.com/zq2599/blog_demos

退出移动版