专栏首页非典型程序猿【玩转腾讯云】基于COS+CI+MPS图文音视频完整解决方案
原创

【玩转腾讯云】基于COS+CI+MPS图文音视频完整解决方案

导言

本文将主要介绍如何通过腾讯云下的对象存储COS,数据万象CI,视频处理MPS、CMQ和CDN等服务来一招解决社区功能中图文音视频方案。

从早期的门户网站,到后面的feeds流,再到如今的各种垂直行业的社区分享,一次次变更成就了近几年行业中的领跑者。从行业领先的微博,再看头部公司产品从头条到手百,中间各路小红书、陌陌、B站等等,绝对都是可以看到feeds和社区的影子。而其中跑不掉的原始素材便是基础的图片、音频和视频等。今天就来介绍基于腾讯云如何解决这些社区方案中原始基础素材的问题。

问题分析

在介绍方案之前,我们先要来分析看下,当我们需要做feeds,做社区的时候,针对这些原始素材会遇到哪些典型的问题:

类型兼容

从类型来看,在做当前的社区功能或者feeds流时,主要还是在文本、图片、音频和视频这四类素材,当然我们的产品角度对这四类基本素材是可以相互结合的,如图文、多图、文本+视频等等。因此基本看下来,我们会需要对这些基本素材有支持存储、读取的功能等等。

数据安全

从数据安全角度,素材会分公有和私有,排列组合下来也就是需要有:公有读公有写,公有读私有写,私有读公有写和私有读私有写。不过其中的私有读公有写显然是没有该场景的,那么看下来就是需要支持:公有度私有写,公有读写和私有读写这三种读写操作。

数据量

从数据存储量角度,无论我们预估自己的产品会到什么量级,在后端架构设计上,存储是一定要做到可以水平扩展的,不然就是一个不合格的高可用产品,因此我们的素材在做存储方案时,也需要考虑到存储的扩展能力。

访问性能

从性能角度来看,这个问题比较清晰,因为无论是feeds流或社区产品,这些都是ToC类产品一定是需要高qps的,也就是我们肯定是需要CDN相关能力支持的。

版权所有

从版权角度,如防盗链功能,可以防止不良网站盗用开发者的图片链接,盗取图片流量,给开发者带来经济损失;同时用户也会需要有对图片做一些水印保护的需求等等。

加载速度

从用户体验来看,更快的打开一个页面其实很重要,而现在所有的图片和视频都是高清、720P起步,那么我们就需要满足不同带宽下的不同分辨率视频流切换,同时对于图片或者视频封面图等,都是需要做预览功能,这样才可以显著提升页面加载速度和改善用户体验。

安全合规

从安全合规角度,也就是鉴黄、涉政等能力,在互联网行业诸如这几天爱奇艺刚出来的ghs事件影响非常之大,这种事在国内是绝对需要杜绝的,否则会带来毁灭性的打击。

其实上面列出的这些待解决的问题还不是包括全部的,但是仅这些功能如果全部做出来的话就需要巨资打造一个上百人的团队花费上半年的时间(可能还bug不断,功能不止)。巨资还好,因为互联网行业最重要不是钱,但是时间,却是致命的。因此,云服务就此而现,腾讯云的诞生就是为互联网创业团队或者公司去解决这些棘手的问题,让业务可以focus业务,下面我们就基于腾讯云解决方案来逐一化解上述的一个个问题。

对象存储(COS)

COS,对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。

存储能力

也就是无论对于文本类文件、抑或是图片、音频和视频文件,都是可以存储于COS中。所以对于上面的第一个问题,通过COS已经可以完美解决。再来看COS生态,从当下来看,COS的读写支持已经到了十分变态的地步了,各种开发语言的API且不说,从js、java、go到ios、安卓和小程序等数十种SDK(更多详细可以在COS的SDK支持),同时也支持了大量的客户端工具(更多详细可以在COS的客户端工具支持),甚至当前的CosBrowser工具都已经在linux下可以界面化使用了,如下图。

COSBrowser可视化界面工具支持

我们这里不会详细的介绍SDK的使用方式,也不会对这些工具做开箱介绍,更多的是从解决方案的支持角度来讲解。所以具体的使用大家去上面的链接里详细看下就有分寸了。

权限管理

下面让我们继续回到上面的第二个问题。首先,COS的存储是使用状态无关的分桶(下称bucket)机制,而针对于不同的bucket有不同的访问权限级别,在COS中支持的访问权限共三种:私有读写、公有度私有写和公有读写。这也就是说,在COS之下我们通过对bucket设置不同的权限,再将不同访问权限的文件存储于不同bucket之下,就可以完美的实现对访问素材的不同权限管理,如下图。

不同访问级别的分桶展示

访问性能

同时,腾讯云 COS 的存储桶空间无容量上限,无需分区管理,这就是说明对于问题三的数据量问题,我们通过一个COS的bucket就已经解决了。不过,一般我们对于数据存储量和访问的qps,也就是问题三和问题四总是同时考虑的。在COS中,单bucket的访问qps是有一定限制的,从当下来看,单bucket有30000/s的读写性能,基本上在前期使用是完全OK的,具体可以参看请求速率与性能优化。如果需要考虑更高的性能场景,可以在业务层做一下一致性哈希,负载均衡的将数据存放到不同的bucket,如公有数据可以存放到demo-public-1,demo-public-2,demo-public-N等等,从而将存储的qps能力可以水平扩展,那么具体如何做负载均衡或者一致性哈希如何去做就不是本文讲解的重点了。

数据万象(CI)

介绍完基础读写能力后,我们下面继续来看一些增值能力的支持。在问题5中,我们提到了图片的版权问题,这也是当下社区产品必须支持的一个基础功能了。这时候,就需要引入腾讯云的第二套产品,数据万象了。

能力开启

数据万象(Cloud Infinite,CI),是腾讯云为客户提供的专业一体化的图片解决方案,涵盖图片上传、下载、存储、处理、识别等功能,将 QQ 空间相册积累的十年图片服务运作经验开放给开发者。目前数据万象提供图片缩放、裁剪、水印、转码、内容审核等多种功能,提供高效准确的图像识别及处理服务,减少人力投入,真正地实现人工智能。

看完上面这段介绍,基本上CI的能力大家也都知道了,这些功能极大的解放了我们的研发能力,而更关键的是实用角度的便利性。当下CI和COS早就已经完美打通,我们只需要前往CI控制台下,通过预设权限,便可以在CI下直接绑定COS的bucket,而这些操作也十分方便,全部都是点点就可以完成,如下图。

CI绑定COS的bucket
CI到COS的权限打通

一旦我们绑定完成后,再来看看CI的能力。其实CI的功能非常强大,基本的图片处理如缩放、裁剪,增值操作如水印能力,内容鉴别能力等等,更多详细功能可以查看这里

防盗链

那么,我们上面遇到的问题也就迎刃而解了,首先我们来看防盗链问题,腾讯云CI推出的防盗链功能,通过 HTTP 协议支持的 Referer 机制来进行相应的来源识别和管理,如下图所示,支持设置网站为黑名单或白名单,Referer 名单也支持多个域名。回车换行,一行输入一个,同时支持通配符。同时在开启防盗链设置后,可根据策略限定服务来源。

CI防盗链设置

水印能力

再来看水印能力,CI同时支持可见水印和盲水印能力。首先我们来说一说这两种场景。

可见水印,就是我们社区图片中常见的场景了,CI支持了文本水印和图片水印的能力,文本水印比较好理解,就是例如图片中的用户ID,从而可以标明所有权。而图片水印,可以理解为是图片上覆盖另一个图片,在当下美图等产品中使用很多。

盲水印功能,通过该功能,可将水印图以不可见的形式添加到原图信息中,并不会对原图质量产生太大影响。在图片被盗取后,可对疑似被盗取的资源进行盲水印提取,验证图片归属。CI提供的盲水印功能拥有半盲、全盲和文字盲水印三种类型。

功能介绍完毕,我们再来看CI+COS的结合所给开发者带来的解放是什么样的,简单看下下面两个url:

http://examples-1251000004.cos.ap-shanghai.myqcloud.com/sample.jpeg

http://examples-1251000004.cos.ap-shanghai.myqcloud.com/sample.jpeg?watermark/2/text/6IW-6K6v5LqRwrfkuIfosaHkvJjlm74/fill/IzNEM0QzRA/fontsize/20/dissolve/50/gravity/northeast/dx/20/dy/20/batch/1/degree/45

首先,我们来看两张图,视觉上看到的是,前者是原图,后者是加了水印的图片。而从域名角度,我们会发现两者依然是COS的域名,且url path的前面都是一样的。这说明了后面的?watermark这一参数实现了水印能力,也就是说,只要打通了CI和COS之后,代码无需任何改动,只需要根据产品逻辑拼接参数即可实现各种水印需求!这绝对是方便了我们的研发的很多时间,具体的水印参数拼接逻辑可以看这里。

图片缩放

同样的道理,我们再来看CI的图片缩放能力,我们继续给出下面两个url:

http://examples-1251000004.cos.ap-shanghai.myqcloud.com/sample.jpeg

http://examples-1251000004.cos.ap-shanghai.myqcloud.com/sample.jpeg?imageMogr2/thumbnail/!50p

原图还是上面的图片,而下面的缩略图也一样只需要通过?imageMogr2参数来实现即可。这个功能的意义是什么呢?我们前端APP或者页面在很多场景都需要展示图片列表,这时候需要很快速的拉取一个个图片,如果采用原图,图片质量过高,文件过大,会导致加载速度很慢,而如果只拉取缩略图列表,可以大大的降低了带宽,同时又提高了APP或者页面加载速度。

当然了,CI的能力强大的远不止这些,还是建议大家多去看看、用用,一定可以极大的提升大家的研发效率。

视频处理(MPS)

从快手抖音开始,视频流已经不是新鲜事了,而前几天老罗也加入了直播带货,直接让直播行业进入了另一个维度。下面我们先来看一下腾讯云官网对于视频处理的介绍。

能力开启

视频处理(Media Processing Service,MPS)是针对海量多媒体数据,提供的云端转码和音视频处理服务。您可以按需将云存储中的视频文件转码为适合在 OTT、PC 或移动端播放的格式,满足您在各类平台将视频文件转为不同码率和分辨率的需求。此外,还为您提供了叠加水印、视频截图、智能封面、智能编辑等视频处理服务。 

和上面说到的CI一样,MPS和COS也是完全打通,在开通的过程,我们同样需要走一个授权的流程,如下图。不得不说,腾讯云的角色管理架构设计的还是非常好的。

MPS到COS的权限打通

工作流使用

在MPS中,通过配置工作流的方式,可以直接将存储于COS的bucket中某一目录下的视频,进行各种花式操作。下面用转码举例,在下面的配置中,我们将demo-public桶下的/video/目录下的所有文件,转码为480P并存放于/video/480/目录下。

MPS工作流配置

当下MPS的视频转码支持数十种样式可选,同时MPS还支持了截图,转动图,审核等等功能。其中截图功能,就可以完美的自动支持视频的预览图方案,可以通过配置一个截图工作流来完成对视频的自动截取,从而我们可以将视频中某个时间点的图片作为封面图。而审核功能则可以开始涉黄,涉政等审核能力,不用过多解释,也是当下社区所必备的基础能力了。下面展示了这三种工作流的配置方式,而在输出路径这一项,我们可以预置目标文件名的格式,这样极大的方便了前端同学对于诸如视频封面图的获取(甚至通过默认封面图+拼接名称可以让后端同学0代码改动就可以支持到产品角度视频封面图的功能)。

MPS更过工作流配置

对了,MPS当下只会对bucket中增量数据进行处理,也就是只有在任务流配置完之后的新存入到COS的bucket中指定目录的文件,才会被处理。当然,其实这也是合理的操作,毕竟万一存量视频有几百上千,这么一配置,不就亏本了么。

事件通知

有的同学可能会问,那这个转码需要多久,我怎么知道结果呢?细心的同学可能已经看到,在上面的工作流配置截图中有个【开启事件通知的选项】。是的,MPS的转码完成事件,已经打通到腾讯云的CMQ消息队列!我们只需要在CMQ中配置topic,并在业务代码中订阅该topic,那么当转码任务完成后,就可以收到该事件通知了。

MPS事件通知

内容分发网路(CDN)

最后一部分,我们要说的就是CDN了, CDN的功能其实不用多说了,通过将站点内容发布至遍布全国的海量加速节点,使其用户可就近获取所需内容,避免网络拥堵、地域、运营商等因素带来的访问延迟问题,有效提升下载速度、降低响应时间,提供流畅的用户体验。

这儿不会详细介绍CDN是什么,CDN原理等等了,还是要从解决方案的角度来说。其实很简单,一句话,上面说的这些诸如COS、CI或者MPS等的数据早已经和腾讯云 CDN打通了。只需要通过简单的配置就可以完成CDN加速了,如下图所示。

COS的CDN加速配置

总结

通过上面的这些介绍,我想大家基本上对于通过使用腾讯云中的诸如对象存储、数据万象、视频处理、CMQ和CDN等这些服务如何构建基础的社区或feeds流的能力已经有所了解,赶快动起手来快去试试吧。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【实战分享】手把手教你直播解决方案

    要说2019最火的猪是人工智能的话,那么2020就一定是直播带货了。斗鱼、虎牙等培养起了大家观看直播的习惯,薇娅、李佳琪将直播带货拉进了大家的眼帘,而“老罗”罗...

    netkiddy
  • CentOS7下OpenCV2+CUDA9的编译问题解决

    OpenCV是一个基于(开源)发行的跨平台计算机视觉库。CUDA是由NVIDIA所推出的一种集成技术,透过这个技术,用户可利用NVIDIA的GeForce 8以...

    netkiddy
  • Golang中的热重启

    这几天在写组里的一个http框架,于是研究了下,在golang中如何实现服务的热重启,从而实现整个服务的重启可以实现对请求客户端的透明。

    netkiddy
  • MD文件图片base64自动编码

    不知道你在使用markdown写文章的时候有没有遇到过这样的烦恼, 文件写完了, 想将写完的文章粘贴到博客的时候, 你满心欢喜的复制粘贴, 但是发现图片根本复...

    烟草的香味
  • 来源于WCF的设计模式:可扩展对象模式[上篇]

    我一直很喜欢剖析微软一些产品、框架的底层实现。在我看来,这不但让我们可以更加深入地了解其运作的原理,同时也能提高设计/架构的技能。因为对于这些框架或者产品来说,...

    蒋金楠
  • python 微信跳一跳脚本

    葫芦
  • 受疫情影响,在线视频未来将会有怎样的趋势及格局?

    2020年春节期间(1月24日-2月6日),全网连续剧日均有效播放较去年春节同比增长14.8%。受疫情影响,春节当周及第二周剧集日均有效播放仍环比为正,不同于过...

    庄帅
  • 记一次简单的腾讯电脑管家免杀

    字节脉搏实验室
  • ITIL V3 服务运营篇 之 组织结构

    服务运营组织结构 •服务台 •技术管理 •IT运营控制 •应用管理

    py3study
  • PyTorch代码调试利器: 自动print每行代码的Tensor信息

    GitHub 项目地址: https://github.com/zasdfgbnm/TorchSnooper

    机器之心

扫码关注云+社区

领取腾讯云代金券