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

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

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);
相关文章
|
3月前
|
移动开发 监控 小程序
mPaaS常见问题之音视频通话微信小程序通话界面录制为画中画模式如何解决
mPaaS(移动平台即服务,Mobile Platform as a Service)是阿里巴巴集团提供的一套移动开发解决方案,它包含了一系列移动开发、测试、监控和运营的工具和服务。以下是mPaaS常见问题的汇总,旨在帮助开发者和企业用户解决在使用mPaaS产品过程中遇到的各种挑战
|
11月前
后台视频录制
要在屏幕关闭的情况下录制视频,您可以使用 cv2.VideoCapture 类的 set 方法设置 prop_return_value 为 False,从而禁用摄像头。这样,在录制过程中,屏幕将保持关闭状态。以下是修改后的代码:
86 0
|
6天前
|
开发工具 Android开发 开发者
Android平台如何不推RTMP|不发布RTSP流|不实时录像|不回传GB28181数据时实时快照?
本文介绍了一种在Android平台上实现实时截图快照的方法,尤其适用于无需依赖系统接口的情况,如在RTMP推送、RTSP服务或GB28181设备接入等场景下进行截图。通过底层模块(libSmartPublisher.so)实现了截图功能,封装了`SnapShotImpl.java`类来管理截图流程。此外,提供了关键代码片段展示初始化SDK实例、执行截图、以及在Activity销毁时释放资源的过程。此方案还考虑到了快照数据的灵活处理需求,符合GB/T28181-2022的技术规范。对于寻求更灵活快照机制的开发者来说,这是一个值得参考的设计思路。
|
3月前
如何定时打开网站
该内容是一个教程,介绍如何使用一个工具设置定时任务自动打开网页。用户需要从度娘网盘或蓝奏云下载工具,提取码分别为qwu2和2r1z。然后在工具中按Ctrl+3进入定时器模块,新建任务命名为“百度”,设置每1分钟执行一次,打开百度网站。通过右键添加链接并输入百度网址,完成设置后,倒计时任务会在主界面显示,计时结束会自动打开百度。
|
3月前
|
搜索推荐
【sgUploadTray_v2】自定义组件:升级版上传托盘自定义组件,可实时查看上传列表进度,可以通过选项卡切换上传中、成功、失败的队列,支持翻页,解决了列表内容太多导致卡顿的情况。(一)
【sgUploadTray_v2】自定义组件:升级版上传托盘自定义组件,可实时查看上传列表进度,可以通过选项卡切换上传中、成功、失败的队列,支持翻页,解决了列表内容太多导致卡顿的情况。
【sgUploadTray_v2】自定义组件:升级版上传托盘自定义组件,可实时查看上传列表进度,可以通过选项卡切换上传中、成功、失败的队列,支持翻页,解决了列表内容太多导致卡顿的情况。(一)
|
3月前
|
缓存
停止AVPlayer并在缓存阶段立即播放其它视频闪退问题及解决方案
停止AVPlayer并在缓存阶段立即播放其它视频闪退问题及解决方案
27 0
|
存储 缓存 小程序
如何实现游戏中的在线计时器和离线计时器
本文包含了游戏中两种计时器的实现原理和实现方法,皆在帮助你彻底的搞懂游戏开发中的计时器。 如果你没有任何的游戏开发经验,欢迎观看我的“人人都能做游戏”系列视频教程,它会手把手的教你做出自己的第一个小游戏。 在游戏中经常会有需要倒计时的需求,例如倒计时 10 分钟可以获得 1 点体力,倒计时 1 小时后可以开启一个宝箱,或者是根据游戏的计时获得奖励等等。
250 0
|
测试技术
自动定时发送每日构建测试报告
自动定时发送每日构建测试报告
144 1
|
XML Java Android开发
【安卓开发】调用系统相机录像并保存到本地
【安卓开发】调用系统相机录像并保存到本地
326 0
|
Kubernetes 网络协议 Cloud Native
【直播回放】DeepFlow AutoLogging:自动采集应用调用日志和流日志
第九期“原力释放 云原生可观测性分享会”云杉网络 产品专家 李倩分享了《DeepFlow AutoLogging:自动采集应用调用日志和流日志》主题, DeepFlow AutoLogging 可以自动采集网络流日志,并提供丰富的性能指标和精细至每包的TCP时序日志,与应用调用日志结合提供完整的全栈回溯能力。
298 0
【直播回放】DeepFlow AutoLogging:自动采集应用调用日志和流日志