【项目】-后台定时录制视频流实现

简介: 后台定时录制视频流实现

image.png

背景    

由于上班的时候会挺忙,看的时候孩子要么是去户外游戏了,要么是午睡,或者你压根没时间看,幼儿园给的直播地址又不能回看,这就让我想到了可以做一个软件,将直播视频流录成视频保存起来,等有时间的时候可以回看,还可以录制其他直播。

需求

那怎么做呢?我简单调研整理了一下该软件的需求。

image.png

流程

大致流程是这样

image.png

上传到百度网盘后,是这样的

image.pngimage.png

功能实现

后台录制直播视频流关键是通过JavaCV组件来实现,这个组件的包非常大,功能也很强大,可以多了解了解。


1、根据录制时间分片

2、文件按日期命名保存

3、根据指定时间录制

依赖

<dependency>
  <groupId>org.bytedeco</groupId>
  <artifactId>javacv-platform</artifactId>
  <version>1.4.4</version>
</dependency>

分片录制

/**
  * 录制视频
  * @param inputFile 该地址可以是网络直播/录播地址,也可以是远程/本地文件路径
  * @param outputFile 该地址只能是文件地址,如果使用该方法推送流媒体服务器会报错,原因是没有设置编码格式
  * @param audioChannel 是否录制音频 1录制
  * @param time 录制时间
  * @throws Exception
  * @throws org.bytedeco.javacv.FrameRecorder.Exception
  */
 public void frameRecord(String inputFile, String outputFile, int audioChannel, int time)
   throws Exception, org.bytedeco.javacv.FrameRecorder.Exception {
  // 获取视频源
  FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(inputFile);
  // 流媒体输出地址,分辨率(长,高),是否录制音频(0:不录制/1:录制)
  FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(outputFile, 1280, 720, audioChannel);
  recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);
  recorder.setAudioCodec(avcodec.AV_CODEC_ID_AAC);
  //设置分片
  recorder.setFormat("segment");
  //生成模式 实时
  recorder.setOption("segment_list_flags", "live");
  //分片时长 60s
  recorder.setOption("segment_time", "60");
  //锁定分片时长
  recorder.setOption("segment_atclocktime", "1");
  //用来严格控制分片时长
  recorder.setOption("break_non_keyframes", "1");
  //设置日志级别
  avutil.av_log_set_level(avutil.AV_LOG_ERROR);
  // 开始取视频源
  try {
   grabber.start();
   recorder.start();
   Frame frame = null;
   Date startDate = new Date();
   while ((frame = grabber.grabFrame()) != null 
     && DateUtil.between(startDate, new Date(), DateUnit.SECOND) <= time * 60) {
    recorder.record(frame);
   }
   recorder.stop();
   grabber.stop();
  } finally {
   if (grabber != null) {
    grabber.stop();
   }
  }
 }

分片配置参考地址:https://ffmpeg.org/ffmpeg-formats.html#segment_002c-stream_005fsegment_002c-ssegment

定时录制

各种定时任务都太重麻烦不适合我这个玩玩的项目,一开始就都被pass掉了,后来发现可以用CronTrigger类,这个类可以动态指定cron来运行定时任务,并且可以控制任务停止,简单又好用。

Runnable runnable = () -> {
  try {
    log.info("taskId={},开始录制视频", task.getId());
    frameRecord(task.getStreamUrl(), prePath + DateUtil.today() + "-%03d" + ".flv", 1, task.getRecordTime());
    log.info("taskId={},结束录制视频", task.getId());
  } catch (Exception e) {
    log.warn("录制发生错误", e);
  }
};
CronTrigger cronTrigger = new CronTrigger(task.getRunRule());
//spring的 ThreadPoolTaskScheduler线程池
ScheduledFuture future = threadPoolTaskScheduler.schedule(runnable, cronTrigger);

停止任务

future.cancel(false);
相关文章
|
存储 安全 前端开发
基于springboot的流浪动物救助管理系统
基于springboot的流浪动物救助管理系统
|
Linux
CentOS 安装rz和sz命令
CentOS 安装rz和sz命令
277 0
|
3月前
|
人工智能 运维 Serverless
0 代码,一键部署 Qwen3
依托于阿里云函数计算 FC 算力,Serverless + AI 开发平台 FunctionAI 现已提供模型服务、应用模版两种部署方式辅助您部署 Qwen3 系列模型。完成模型部署后,您即可与模型进行对话体验;或以 API 形式进行调用,接入 AI 应用中,欢迎您立即体验。
|
数据采集 存储 运维
DAMA数据管理知识体系指南(3):数据治理
DAMA:国际数据管理协会,是一个全球性数据管理和业务专业志愿人士组成的非营利协会,是当前国际上在数据治理领域最权威的机构。 DMBOK2则是DAMA组织众多数据管理领域的国际级资深专家编著,深入阐述数据管理各领域的完整知识体系。它是市场上唯一综合了数据管理方方面面的一部权威性著作。 本系列文章,将针对DMBOK中的核心内容进行解读。
DAMA数据管理知识体系指南(3):数据治理
|
8月前
|
人工智能 算法 Serverless
短视频创作助手 | AI剧本生成与动画创作
短视频行业的快速发展得益于移动互联网和智能手机的普及,4G、5G网络的推广使用户对视频内容的需求大增。短视频以其短小精悍、易于传播的特点迅速吸引了大量用户。平台如抖音、快手通过算法推荐和社交功能推动了用户增长和内容生态繁荣。AI剧本生成与动画创作方案则进一步降低了创作门槛,简化从剧本到视频成片的过程。该方案利用阿里云的大模型服务平台百炼、函数计算FC和对象存储OSS等产品,实现了自动化流程,涵盖故事剧本撰写、插图设计、声音合成至视频合成,极大缩短了创作周期,提高了内容产出速度。部署简单快捷,耗时约5分钟,使得非技术人员也能轻松上手,满足企业和个人创作者的需求。
|
Java 计算机视觉
如何快速有效降低 JavaCV 依赖包体积?
如何快速有效降低 JavaCV 依赖包体积?
1230 2
|
存储 监控 网络安全
saltStack自动化工具
saltStack自动化工具
622 7
|
移动开发 前端开发 开发者
|
SQL 运维 数据库
MSSQL性能调优实战:索引策略、查询优化与并发控制的精细操作
在Microsoft SQL Server(MSSQL)的日常运维与优化中,实现高效、稳定的数据库性能是每位数据库管理员和开发者的核心任务
1006 1
|
调度 索引
【操作系统】进程的基本概念&进程的状态与转换&进程的组织方式
【操作系统】进程的基本概念&进程的状态与转换&进程的组织方式
408 2