当前位置: 首页 > article >正文

【easy视频 | day04】视频转码 + 稿件管理 + 服务端审核稿件

文章目录

  • 前言
  • 回顾
  • 完成任务
    • 1. 从消息队列中获取要转码的视频
    • 2. 转码
    • 3. 客户端稿件管理
    • 4. 服务端稿件管理
    • 5. 服务端审核稿件
  • 总结

在这里插入图片描述

前言

本项目非原创,我只是个小小白,跟随 b 站脚步,找到老罗的这个项目,视频来源于:
高仿B站(单服务版) springboot项目实战 easylive

本人不分享项目源码,支持项目付费!!!

回顾

前面的发布视频的功能还没有完成。
已经将上传的投稿和分P视频文件相关信息写入数据库中,并且把需要转码的和需要删除的视频加入到消息队列。但还没有对消息队列中的视频进行操作。
接下来,要从消息队列中取数据,通过 FFmpeg 进行处理,消费消息队列,再继续更新列表的某些属性字段,补充一些值

完成任务

1. 从消息队列中获取要转码的视频

基于Redis队列的异步视频转码任务处理器。
通过后台线程持续监听队列,将待转码文件信息从Redis中取出,并调用服务进行转码处理:
在这里插入图片描述

  • 创建一个固定大小为 10 的线程池,用于异步执行后台任务。

在这里插入图片描述

  • @PostConstruct 注解:标识 Bean 初始化完后立即执行的方法。
    为什么要异步,单独开启一个线程来处理消息队列的任务 ? ——> 就是因为加了 @PostConstruct 注解,如果在主线程中,一启动,就会执行 consumeTransferFileQueue() 方法,这里面是一个死循环,那么服务启动的时候就会一直卡在这里,永远启动不了。
  • 通过 rpop() 方法,从 Redis 消息队列中弹出转码任务。

在这里插入图片描述
之前还把要删除的分P视频文件也放入到消息队列中,这里为什么要对其过期时间设置为 7 天 ? 因为如果我们在修改投稿时,对原来存在于视频中的某些分P 文件选择删除,同时还对其它的像简介这些进行修改,这个时候,应该要等待审核时,再进行删除。

从消息队列中获取文件后,现在的文件还是按切片分成的分片,现在要对它们进行合并为 .mp4 文件,合并后转为 .ts 文件,通过 FFmpeg 对 .ts 文件进行切割。与前端的切片不同,FFmpeg 切割 .ts 文件后,会有一个索引来解析。
在这里插入图片描述

2. 转码

在这里插入图片描述

  • 从 Redis 中获取当前分P视频文件的相关文件信息 fileDto。
  • 将原来分P视频文件存放地址下的文件分片,拷贝到正式目录下。
  • 删除临时文件目录
  • 在正式目录中,对文件分片进行合并,union:
    在这里插入图片描述
    根据传入的 delSource 参数,决定最后是否要删除分片文件。

合并完分片文件后:
在这里插入图片描述

  • 获取这个分P视频的播放时长:
    在这里插入图片描述
    并更新分P视频文件的播放时长、文件大小、文件路径、转码状态等相关字段。
  • 对合并好的 .mp4 文件进行切割:
    在这里插入图片描述
  • 如果当前的文件编码是 hevc 编码,还需要进行转码。新建一个文件 tempFileName 相当于是原来 .mp4 文件copy 的一份重命名的文件,对 tempFileName 文件进行转码到 videoFilePath 文件:
    在这里插入图片描述
  • 将编码转换后的文件转为 ts 文件,并生成索引文件 .m3u8 和 .ts 切片:
    在这里插入图片描述
  • 过程中出现异常,则 catch,并设置该分P视频文件转码失败。

最后,还需要更新数据库中的信息和文件状态:
在这里插入图片描述

  • 根据上面设置的相关字段值,更新分P视频文件的状态。
  • 如果当前分P视频文件转码失败,要更新对应的客户端所能看到的视频文件信息(VideoInfoPost),设置状态为转码失败:
    在这里插入图片描述
  • 如果查询数据库,发现已经没有需要转码的文件了,就计算当前投稿视频的所有分P视频文件的总时长,并更新当前投稿视频状态为“待审核”,更新当前投稿视频的总时长。

3. 客户端稿件管理

客户端的稿件管理包括查看提交的视频列表,以及稿件数量。
在这里插入图片描述
获取稿件视频列表:
在这里插入图片描述
视频状态中,页面上进行中为 -1,已通过为 3, 为通过为 4。
如果 status 为1, 要查找除了已通过,和未通过状态的其它状态,包括转码中,转码失败,待审核状态。
在这里插入图片描述

获取各类型对应的稿件数量:
在这里插入图片描述
分别查询进行中、已通过、未通过三种状态下的稿件数量,放到一个专门存储这三种稿件数量的类中并返回。
在这里插入图片描述

4. 服务端稿件管理

服务端查看,不仅要看视频稿件,还需要看这是哪个用户发出来的:
在这里插入图片描述
在 VideoInfoPostQuery 类中要添加字段:
在这里插入图片描述

5. 服务端审核稿件

controller 层:
参数有审核的视频 id,审核状态,审核不通过的原因 reason。
在这里插入图片描述
service 层:
在这里插入图片描述
一定要在更改条件上加上 status。update video_info_post set status = ? where vidoe_id = ? and status = 2
确保对数据进行修改,必须是在状态为 2(待审核)下。
避免多线程下的不安全。比如,有两个线程都在进行审核工作,一个线程已经对视频a进行审核,并且通过了,与此同时,另一个线程也在对视频a 进行审核,如果更新语句中条件没有 status = 2,那么另一个线程又会对状态进行修改

在这里插入图片描述
审核后对视频状态进行更新。如果审核是4(未通过),则无需进行接下来的操作。

在这里插入图片描述
审核通过后,如果当前审核的视频是第一次发布的,将增加用户积分。(后续)
并且将发布信息复制到正式信息表中。

在这里插入图片描述
更新分P视频文件信息,先将数据表中对应的 videoId 的分P视频都删除,再通过发布表中查找 videoId 的分P视频,找到后,再插入正式的分P视频文件表。

在这里插入图片描述
之前已经将要删除的本地磁盘文件放在了 Redis 消息队列中,现在审核过后,要对其进行删除。
从 Redis 中获取要删除的文件:
在这里插入图片描述
一个一个地循环对,删除每个路径下的文件。

在这里插入图片描述
最后还需要对 Redis 中的消息队列进行删除。

——————————————————————————————————————————
最后还需要将正式信息保存到 es 中(后续)
第一次发布视频,增加用户积分(后续)

总结

主要是转码过程理解,以及审核视频的流程。


http://www.kler.cn/a/571604.html

相关文章:

  • qt-C++笔记之Linux下Qt环境变量设置及与QtCreator的关系
  • 第四节:基于Winform框架的串口助手小项目---开关串口《C#编程》
  • IntelliJ IDEA 构建项目时内存溢出问题
  • 直播流程管理 AI 应用的开发思路和功能实现
  • JavaScript+vue 实现复制文字功能
  • P10904 [蓝桥杯 2024 省 C] 挖矿
  • 【0001】初识Java
  • ArcGIS操作:13 生成最小外接矩阵
  • 可狱可囚的爬虫系列课程 16:爬虫重试机制
  • 力扣HOT100之哈希:1. 两数之和
  • MySQL执行更新SQL流程
  • 【存储中间件】MyCat2应用与实战(二):安装与启动
  • 城市管理综合执法系统源码,B/S模式与手机等移动终端架构,java语言开发,可扩展性强
  • 在Spring Boot项目中导出复杂对象到Excel文件
  • Spring 源码硬核解析系列专题(六):Spring MVC 的请求处理源码解析
  • 简单的SQL语句以及使用Node.js连接MySQL
  • PYTHON常用指令
  • 【区块链 + 智慧政务】上海市城乡建设和交通发展研究院:基于联盟链的城市停车收费应用示范 | FISCO BCOS 应用案例
  • 服务降级
  • Ollama进行DeepSeek本地部署存在安全风险解决方案,nginx反向代理配置