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

文章目录

  • 前言
  • 回顾
  • 完成任务
    • [1. 从消息队列中获取要转码的视频](#1. 从消息队列中获取要转码的视频)
    • [2. 转码](#2. 转码)
    • [3. 客户端稿件管理](#3. 客户端稿件管理)
    • [4. 服务端稿件管理](#4. 服务端稿件管理)
    • [5. 服务端审核稿件](#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 中(后续)

第一次发布视频,增加用户积分(后续)

总结

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

相关推荐
啥也不会的菜鸟·几秒前
Redis7——进阶篇(三)
redis·学习·缓存·redis经典面试题
神秘的t8 分钟前
优选算法合集————双指针(专题三)
java·数据结构·算法·二分查找
liubing518813 分钟前
解决java-jar报错:xxx.jar 中没有主清单属性的方法
java·pycharm·jar
搞不懂语言的程序员18 分钟前
数据库事务的 ACID,通过MVCC能做什么
java·开发语言·数据库
爱老的虎油20 分钟前
MySQL零基础教程16—表连接进阶
数据库·mysql
Lkkkkkkkcy25 分钟前
自己的网页加一个搜索框,调用deepseek的API
java·vue
java—大象26 分钟前
基于SpringBoot+mybatis+layui就业管理系统设计和实现
java·数据库·spring boot·后端·layui·mybatis
学编程的小鬼1 小时前
线程安全问题
java·安全
m0_748233641 小时前
MySQL的底层原理与架构
数据库·mysql·架构
CodeJourney.1 小时前
DeepSeek赋能Power BI:开启智能化数据分析新时代
数据库·人工智能·算法