关于点播视频文件生成封面的实现方案设计思考

简介: 对于多媒体存储服务,点播视频文件生成封面应该是非常基础的功能之一,目前自己正在开发的多媒体存储服务就面临这样的需求。因为这个多媒体存储服务是从零开始的,缺少部分基础功能的情况,各位大佬别见笑。但是,正是因为从零开始开发,因此很多之前被忽略的问题也渐渐浮出水面,映入了我们的眼帘。这个经历过程是非常可贵的,自己从中也学到了很多东西。
  • 目录
  • 前言
  • 现状
  • 需求
  • 实现方案
  • 结论与思考

前言

对于多媒体存储服务,点播视频文件生成封面应该是非常基础的功能之一,目前自己正在开发的多媒体存储服务就面临这样的需求。因为这个多媒体存储服务是从零开始的,缺少部分基础功能的情况,各位大佬别见笑。

但是,正是因为从零开始开发,因此很多之前被忽略的问题也渐渐浮出水面,映入了我们的眼帘。这个经历过程是非常可贵的,自己从中也学到了很多东西。

现状

首先,我们来看一下当前多媒体存储服务的现状。

目前,多媒体存储服务已经具备了上传、下载、观看预览、转码、查询、删除等基础功能。

文件结构体定义如下:

typeFilestruct {
// DefaultModel adds _id, created_at and updated_at fields to the Modelmgm.DefaultModel`bson:",inline"`Namestring`json:"name" bson:"name"`Md5string`json:"md5" bson:"md5"`Typestring`json:"type" bson:"type"`Urlstring`json:"url" bson:"url"`Pathstring`json:"path" bson:"path"`Durationfloat64`json:"duration" bson:"duration"`CloudUrlstring`json:"cloudurl" bson:"cloudurl"`Filekeystring`json:"filekey" bson:"filekey"`Sizeint64`json:"size" bson:"size"`}
typeFileArray []File

上述所有功能都是基于该结构体进行展开的。

需求

现在出现了一个新需求,就是为视频文件生成封面。我们应该怎样设计实现方案呢?

其实,大体的方案可以分为两类。一种方案是在原有文件结构体的基础上扩展封面相关字段,另一种方案是将封面作为一个单独的文件进行管理并与原文件做关联处理。下面会详细分析二者的区别及优缺点。

实现方案

方案一、在原有文件结构体的基础上扩展封面相关字段

这种方案,是继续扩展当前已经定义好的文件结构体,增加封面的关联地址,因此增加一个CoverURL字段就搞定了。乍一看,感觉没有毛病,但是深入分析一下就会发现问题。如果后续我们需要删除该点播视频文件,理论上应该把对应的封面文件也删除。这个时候,你会发现如果只增加上面的一个字段是不够的,缺少了操作句柄。因此,我们还需要增加一个字段CoverKey

按照上述方案,修改后的文件结构体:

typeFilestruct {
// DefaultModel adds _id, created_at and updated_at fields to the Modelmgm.DefaultModel`bson:",inline"`Namestring`json:"name" bson:"name"`Md5string`json:"md5" bson:"md5"`Typestring`json:"type" bson:"type"`Urlstring`json:"url" bson:"url"`Pathstring`json:"path" bson:"path"`Durationfloat64`json:"duration" bson:"duration"`CloudUrlstring`json:"cloudurl" bson:"cloudurl"`Filekeystring`json:"filekey" bson:"filekey"`Sizeint64`json:"size" bson:"size"`CoverURLstring`json:"coverurl" bson:"coverurl"`// 新增项CoverKeystring`json:"coverkey" bson:"coverkey"`// 新增项// 后续可能还要继续增加。。。}
typeFileArray []File

目前,上述结构体就已经满足当前需求了。但是,我们难道就仅仅满足当前的单一需求吗?我们是不是应该思考的更加长远一些?是的,作为一名资深的研发工程师,除了需要设计出满足当前需求的最佳实现方案,还需要具备后期的高可扩展性。

那么问题来了,如果我们后期想要查询或者修改封面的名字和大小,我们是不是还要增加新的 CoverNameCoverSize 字段?如果想要下载封面,是不是还要增加新的 CoverDownloadURL 字段......这次时候,你就会发现我们其实是复制了一遍文件结构体的所有字段,这样显然是不合理的。

如果是这样,那么有没有更好的可扩展方案呢?答案是有的,请参看方案二。

方案二、将封面作为一个单独的文件进行管理并与原文件做关联

这种方案,将封面作为一个单独的文件进行管理并与原视频文件做关联,能够解决方案一遇到的各种问题,同时,具备一定能力的可扩展性。如果想要满足当前需求,我们仅需要增加一个Cover字段,存储封面文件的ID,用来关联该视频文件的封面文件。后期对视频文件封面的所有操作都可以通过转换成封面文件的操作,因此简化了对封面文件管理逻辑。还有很多别的优点,大家可以自己思考补充,欢迎在评论区留言。

按照上述方案,修改后的文件结构体:

typeFilestruct {
// DefaultModel adds _id, created_at and updated_at fields to the Modelmgm.DefaultModel`bson:",inline"`Namestring`json:"name" bson:"name"`Md5string`json:"md5" bson:"md5"`Typestring`json:"type" bson:"type"`Urlstring`json:"url" bson:"url"`Pathstring`json:"path" bson:"path"`Durationfloat64`json:"duration" bson:"duration"`CloudUrlstring`json:"cloudurl" bson:"cloudurl"`Filekeystring`json:"filekey" bson:"filekey"`Sizeint64`json:"size" bson:"size"`Coverstring`json:"cover" bson:"cover"`// 新增项}
typeFileArray []File

大家会发现,方案二对原有文件结构体的修改程度最小,保证了文件结构体的简洁性和抽象性。同时,还满足了当前需求,又具备了一定的可扩展能力。

结论与思考

其实,日常开发过程中,我们经常会遇到各种各样的需求,解决方案也各式各样,我们想要成为一名资深的研发工程师,就要在统筹全局的前提下,寻找更加符合我们系统架构的实现方案。因为每个系统架构和业务线的设计和需求都不一样,很难找到一个大一统的方案,因此,我坚持的原则就是“设计开发实现方案时,没有最好只有更好”。上面就是本人分享的关于一次点播视频文件生成封面的需求设计和开发的思考过程,欢迎大家评论留言交流经验。


作者简介:😄大家好,我是 Data-Mining(liuzhen007),是一位音视频技术爱好者,前后就职于传统广电巨头和音视频互联网公司,具有丰富的音视频直播和点播相关经验,对 WebRTC、FFmpeg 和 Electron 有非常深入的了解,😄公众号:玩转音视频。同时也是 CSDN 博客专家、华为云社区云享专家、签约作者,欢迎关注我分享更多干货!😄

目录
相关文章
|
7月前
|
编解码
在智能媒体服务中,素材的清晰度差异可能是由以下几个原因导致
在智能媒体服务中,素材的清晰度差异可能是由以下几个原因导致【1月更文挑战第10天】【1月更文挑战第48篇】
76 3
设计并实现同时支持多种视频格式的流媒体点播系统
设计并实现同时支持多种视频格式的流媒体点播系统
171 0
|
7月前
|
编解码
音视频录制播放原理
音视频录制播放原理
143 1
|
移动开发 编解码 缓存
【知识拓展】音视频中的推流与拉流
【知识拓展】音视频中的推流与拉流
439 1
|
CDN
点播试看功能最佳实践
## 简介 试看指用户在观看视频或者音频等内容时,只能观看指定时间(如前五分钟)的内容,通常用于会员等付费业务场景。 阿里云视频点播服务提供了试看的完整解决方案,您可自由设置试看时长(或观看完整视频),播放服务会根据设置提供含有试看限制的特定的播放地址,可借此来实现完整的试看功能。 ## 使用前提 试看的基本原理是,播放的CDN加速地址带有试看的指定时长信息,云端会对该信息进行鉴权,鉴
3217 0
|
JavaScript 算法 前端开发
姜饼短视频无水印分析
姜饼短视频无水印分析
96 0
姜饼短视频无水印分析
|
安全 JavaScript 前端开发
如何让在线视频以自定义速度播放
现在看视频不来个两倍速(或者更快)都觉得在浪费生命。 特别是在看视频教程的时候,文字我们可以做到一目十行,但是视频呢,如果有字幕,我们甚至不用听清,用3倍速或者4倍速完全没有问题,尤其在看别人在线写代码的时候,速度快了,就觉得特别顺滑。
535 0
如何让在线视频以自定义速度播放
|
存储 编解码 前端开发
【微信开发】上传用户语音 并转码 分享
【微信开发】上传用户语音 并转码 分享
【微信开发】上传用户语音 并转码 分享
|
存储 编解码 缓存
带你走进多媒体世界:视频文件是怎么播放出来的
本文将聚焦在说明多媒体世界中的视频文件是怎么播放出来的。一个多媒体文件播放涉及到哪些过程?人体通过肉眼看到画面、通过耳朵听到视频声音,这中间经过了哪些处理?本文将尽可能通过简单易懂的文字讲述一个视频文件的播放流程。
带你走进多媒体世界:视频文件是怎么播放出来的
|
编解码 开发工具 容器
阿里云视频点播服务添加视频字幕的实现方案
本文给出了一个为视频点播服务里的视频添加字幕的方案。
4708 0
阿里云视频点播服务添加视频字幕的实现方案