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

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

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);
相关文章
|
8月前
|
移动开发 监控 小程序
mPaaS常见问题之音视频通话微信小程序通话界面录制为画中画模式如何解决
mPaaS(移动平台即服务,Mobile Platform as a Service)是阿里巴巴集团提供的一套移动开发解决方案,它包含了一系列移动开发、测试、监控和运营的工具和服务。以下是mPaaS常见问题的汇总,旨在帮助开发者和企业用户解决在使用mPaaS产品过程中遇到的各种挑战
111 0
后台视频录制
要在屏幕关闭的情况下录制视频,您可以使用 cv2.VideoCapture 类的 set 方法设置 prop_return_value 为 False,从而禁用摄像头。这样,在录制过程中,屏幕将保持关闭状态。以下是修改后的代码:
128 0
|
Android开发 开发者 UED
Android平台RTMP推送端实现外部数据对接推送和录像
好多开发者在做Android平台RTMP推送对接的同时,除了编码前的数据外,还有些外部编码数据推送诉求,他们希望外部的编码音视频数据不止可以实现RTMP推送,还可以同时在推送端实时录制下来,本文以我们(官方)Android平台RTMP直播推送模块为例,介绍下外部数据对接流程和数据录制流程。
115 0
|
小程序
UniApp video 使用(自定义进度条,及微信无法暂停播放设置进度问题)
UniApp video 使用(自定义进度条,及微信无法暂停播放设置进度问题)
1623 0
|
5月前
|
开发工具 Android开发 开发者
Android平台如何不推RTMP|不发布RTSP流|不实时录像|不回传GB28181数据时实时快照?
本文介绍了一种在Android平台上实现实时截图快照的方法,尤其适用于无需依赖系统接口的情况,如在RTMP推送、RTSP服务或GB28181设备接入等场景下进行截图。通过底层模块(libSmartPublisher.so)实现了截图功能,封装了`SnapShotImpl.java`类来管理截图流程。此外,提供了关键代码片段展示初始化SDK实例、执行截图、以及在Activity销毁时释放资源的过程。此方案还考虑到了快照数据的灵活处理需求,符合GB/T28181-2022的技术规范。对于寻求更灵活快照机制的开发者来说,这是一个值得参考的设计思路。
|
数据采集 开发工具 Android开发
Android平台如何实现屏幕数据采集并推送至RTMP服务器
随着无纸化、智慧教室等场景的普及,好多企业或者开发者开始寻求更高效稳定低延迟的RTMP同屏方案,本文以大牛直播SDK(Github)的同屏demo(对应工程:SmartServicePublisherV2)为例,介绍下如何采集编码推送RTMP数据到流媒体服务器。
203 0
|
8月前
|
编解码 开发工具
获取ffmpeg转码的实时进度
获取ffmpeg转码的实时进度
260 0
战斗录像工具开发记录
战斗录像工具开发记录
55 0
|
存储 缓存 小程序
如何实现游戏中的在线计时器和离线计时器
本文包含了游戏中两种计时器的实现原理和实现方法,皆在帮助你彻底的搞懂游戏开发中的计时器。 如果你没有任何的游戏开发经验,欢迎观看我的“人人都能做游戏”系列视频教程,它会手把手的教你做出自己的第一个小游戏。 在游戏中经常会有需要倒计时的需求,例如倒计时 10 分钟可以获得 1 点体力,倒计时 1 小时后可以开启一个宝箱,或者是根据游戏的计时获得奖励等等。
322 0

热门文章

最新文章