版权申明:本文由腾讯云原创文章,转载请注明出处: 
文章原文链接:https://www.qcloud.com/community/article/196

起源:腾云阁 https://www.qcloud.com/community

产品的整个技术实现架构由Android/iOS APP、业务服务器以及腾讯云服务组成。其中,APP负责和用户进行交互,蕴含的功能模块有:

  1. 注册登录(反对微信、QQ等第三方账号登录)
  2. 拍照/录像
  3. 上传到云(腾讯云对象存储COS+内容散发网络CDN)
  4. 视频播放(本地播放/云端点播)
  5. 语音辨认(腾讯云智能语音服务Artificial Audio Intelligence)
  6. 图片解决(腾讯云万象优图的图片解决和智能鉴黄服务)

思考到咱们的业务类型和开发团队的技术根底,咱们选用的后盾技术架构是Struts+Hibernate+Spring+MySql,前端为Android和iOS。

为便于疾速开发和牢靠扩大,对于关键技术难点——图片、音频、视频等大量非结构化数据的上传、存储和点播,咱们采纳腾讯云提供的对象存储(COS:Cloud Object Service)和内容散发网络(CDN:Content Delivery Network)作为实现计划。这样,后盾的MySql数据库中就只须要存储图片、音频、视频等文件在腾讯云对象存储中的Url,而不用在业务侧保护其数据长久化和容量扩大,同时,内容的散发和拜访,也可通过腾讯云CDN来减速,无效升高了服务器端的下载压力。

在私有云产品的价格方面,腾讯云提供了每月50G存储,10G外网拜访流量、10G的CDN 回源流量、100 万次读申请和10万次写申请的收费额度,能够满足初创我的项目的应用需要。同时,腾讯云对象存储还提供了全面的开发者手册和各类编程语言的SDK Demo,能够让开发者疾速上手,搭建原型利用。

腾讯云COS的注册、实名认证,以及开明CDN的过程都很简略快捷,能够点击链接立刻应用COS的Web控制台,依照教程“疾速上手”实现上述操作。
接下来,新建我的项目PetUGC,而后在我的项目中新建bucket存储桶。

同时,抉择(默认)开明CDN减速。

在存储桶gamevideo中新建文件夹whirlpk,用于寄存APP上传的“宠物互动视频”。
点击获取API密钥(肯定要留神爱护本人的密钥不被透露,并尽量定期的更换密钥)。

对于APP端的“文件上传”性能,腾讯云COS官网提供的SDK曾经将分片上传的性能做了封装,开发者只需依照SDK文档调用FileUploadTask函数,即可实现图片、音频、视频等大文件的上传,并且能在对应的回调接口中进行上传胜利/失败后的进一步操作,比方更新APP的UI来显示上传进度,或者提醒上传胜利/失败音讯等。上面为代码示例:

import com.tencent.upload.task.impl.FileUploadTask;import com.tencent.upload.task.IUploadTaskListener; /* 若已存在同名的文件: INSERTONLY==false 示意可能上传胜利,且会笼罩同名的文件; INSERTONLY==true 则不能胜利上传*/ FileUploadTask task = new FileUploadTask(BUCKETNAME, appidFILEPATH, ARGETDIR, ATTRS, INSERTONLY, new IUploadTaskListener(){         @Override        public void onUploadFailed(int arg0, String arg1) {            // TODO Auto-generated method stub            // 上传胜利        }         @Override        public void onUploadProgress(long arg0, long arg1) {            // TODO Auto-generated method stub            // 上传进度        }         @Override        public void onUploadStateChange(TaskState arg0) {            // TODO Auto-generated method stub            // 上传状态变动        }         @Override        public void onUploadSucceed(FileInfo arg0) {            // TODO Auto-generated method stub            // 上传失败        }});filetask.setAuth(SIGN);fileUploadMgr.upload(task);

须要阐明的是,下面filetask.setAuth(SIGN)中的SIGN字段,即为业务端服务器返回的签名字符串,用于实现用户申请的鉴权。SIGN的生成过程,在服务器端的SDK中也有提供封装好的办法。

腾讯云COS的签名SIGN分为两种:屡次无效签名和单次无效签名。当须要进行上传文件, 重命名文件, 创立目录, 获取文件/目录属性, 拉取目录列表这几个操作时,必须在申请中填写屡次无效签名。

对于屡次无效签名,能够在服务器端调用getPeriodEffectiveSign办法来取得。
String getPeriodEffectiveSign(String bucketName, String cosPath, Credentials cred, long expired)
其中的各个参数对应的含意是:

参数名

参数类型

默认值

参数形容

bucket

String

bucket名称,即为上文中提到的gamevideo

cos\_path

String

资源在bucket下的相对路径,即为上文中提到的 /whirlpk/test.jpg

cred

Credentials

用户身份信息, 包含appid, secretId, secretkey. 将腾讯云COS Web控制台中获取到的API密钥信息填入即可

expired

long

签名过期工夫, UNIX工夫戳,单位为秒。留神,这儿的expired是个工夫点,而非时间段。它等于以后工夫+有效期限

获取屡次无效签名的代码示例:

Credentials cred = new Credentials(appId, secretId, secretKey);long expired = System.currentTimeMillis() / 1000 + 600;String signStr = Sign.getPeriodEffectiveSign(bucketName, "/whirlpk/test.jpg", cred, expired);

对于单次无效签名,实用场景为删除和更新文件目录。在服务器端的结构过程和下面的屡次无效签名相似。

当(图片、音频、视频等)文件上传胜利后,腾讯云会给APP端返回文件在COS中的Url,此时,业务端的数据库仅需存储这个Url,当用户拜访该文件时,将这个Url返回给用户,而后由腾讯云COS+CDN来响应用户的申请,将理论的文件传输给用户。

这样,在APP端,就能够间接调用原生的视频播放控件(比方Android的VideoView或者自定义MediaPlayer),链入腾讯云COS提供的Url来播放视频(当Android应用VideoView来播放视频时,视频源必须是规范的mp4或3gp的视频,否则无奈播放)。

须要阐明的是,腾讯云返回的资源Url会有两种,一种是source\_url(不通过CDN减速,间接拜访COS存储源),另一种是access\_url(通过CDN减速来拜访COS存储源)。举荐应用access\_url来为拜访减速,不仅能够极大的升高拜访时延,同时还能够节俭COS的回源流量。

除了音视频的上传和(下载)播放以外,咱们的产品还须要为用户提供图片解决性能,包含缩放、裁剪。同时,为了保障平台内容的衰弱可继续,咱们须要引入图片鉴黄性能;为了爱护UGC内容的版权,咱们还须要防盗链和水印性能。
于是咱们采纳腾讯云的万象优图来实现上述的图片解决性能。整个应用过程能够分为:

  1. 在万象优图控制台配置参数;
  2. 在业务服务器和APP中集成SDK;
  3. 依照业务需要自定义回调解决逻辑。

首先,在腾讯云Web控制台中点击进入“万象优图”。在之前曾经建好的我的项目PetUGC中新建一个图片空间petimage。

而后,点击“治理”,进入对图片空间的配置界面。

如何在Web控制台对鉴黄性能进行设置?

在“图片辨认”性能中,能够开启鉴黄性能的应用状态。点击保留后,但凡要上传入以后图片空间(petimage)的新图片,都须要先通过鉴黄解决。万象优图会为每一张图片打分(0~100分),其中,超过91分的图片,会被零碎确定为是黄图,低于83分的,会被零碎确定为是失常图片。分值处于83~91之间的,零碎会判断为“疑似黄图”,但无奈确定,须要业务端通过人工审核的形式来断定是否为黄图。
业务端能够进一步设置回调阈值和回调URL,让腾讯云万象优图将“疑似黄图”的图片和相应的判断后果返回给业务端,以做进一步的解决。

如何在APP端将图片传送给万象优图?

万象优图为开发者提供了Android、iOS和服务器端的SDK和Demo示例,并封装好了相应的功能模块供灵便调用。如下是SDK的下载地址

以Android为例,点击下载“Android体验demo”,在QcloudImageActivity中能够看到要害的业务逻辑代码:
首先,由APP向业务端服务器发动申请,获取签名sign(即拜访腾讯云万象优图资源的权限)。

在获取签名sign后,就可结构图片上传申请:

在图片上传申请的回调接口onUploadSucceed中,能够设定图片上传胜利后对APP UI界面的操作,在onUploadProgress中可设定图片上传的进度显示,在onUploadFailed中可设定图片上传失败后的解决。

如何在服务器端结构签名sign?

以Java SDK为例,在咱们的业务服务器端,只需将万象优图Web控制台中提供的APP\_ID、Secret ID、Secret Key填写至下图中的对应地位:

而后调用对象PicCloud的getSign办法,即可失去屡次/单次无效签名。

将签名返回给APP端后,APP端即可将图片连同签名一起送至腾讯云万象优图,进行鉴黄解决。

业务服务器该如何解决腾讯云万象优图的回调后果?

在服务器端,须要监听在控制台中配置的回调URL接口。当万象优图发现APP上传的图片分值在阈值(83~90,疑似黄图)内时,会默认回调该URL,向其发送一个规范的HTTP POST告诉音讯。

HTTP的Response信息如下表:

参数名称

类型

必选

形容

url

String

上传后的资源url,包含域名

result

Int

供参考的辨认后果,0失常,1黄图,2疑似图片

forbid\_status

Int

封禁状态,0示意失常,1示意图片已被封禁(只有存储在万象优图的图片才会被封禁)

confidence

Double

辨认为黄图的置信度,范畴0-100;是normal, hot, porn的综合评分

normal

Double

图片为失常图片的评分

hot

Double

图片为性感图片的评分

porn

Double

图片为色情图片的评分

业务端通过判断Response中的参数,来决定向APP端发送对应的解决(比方,回绝此次UGC上传),或者转向人工审查等。

如何应用万象优图来实现图片解决(裁剪+缩放+水印)?

万象优图提供了如下的图片解决性能:

其中,根本图像处理(imageView2)即为对 图片的长和宽按约束条件来等比压缩。在把原图上传到万象优图的对象存储空间后,(如果鉴黄通过)万象优图会返回该图片的Url。当咱们再次申请该图片的Url时,能够在Url前面增加参数,来通知万象优图“请依照参数来等比缩放该图片,而后返回给我”。这样,APP端就能拿到指定长宽的图片,不仅便于UI排版,还能实现缩略图显示。

举个例子来阐明:
点击万象优图→老手指引→web端接入→样例,进入上面的试用界面:


上传一张图片keji.jpg,长宽为800x450,生成如上的下载链接。
拜访该链接能够看到原图。

而后,咱们在下载链接Url上增加根本图像处理(imageView2)的相应参数,含意为“调用根本图像处理imageView2接口,指明采纳模式2来等比缩放图片,并指定图片的宽的最大值为400”:
http://test2p-10000002.image.myqcloud.com//u/can/use/slash/sample1470281794?imageView2/2/w/400
在浏览器中关上该Url,即可看到万象优图将原图等比压缩后的处理结果:

根本图片解决中还提供了很多的等比缩放模式,以及指定图片格式、图片品质等等,大家能够按需设定参数。

但对于咱们的APP,仅仅实现图片的“等比缩放性能”还不够,因为在大多数状况下,用户上传的图片长宽不一,等比缩放很容易造成“顾得了长但顾不了宽”,使得原有的图片通过缩放后,要么在显示时产生留白,要么就是图片的要害局部(比方两头局部)被缩放到了边缘,变得很难看。所以,在理论应用时,咱们会采纳上图中的模式5,来指定在缩放时,先等比缩放,而后居中裁剪。举个例子:
http://test2p-10000002.image.myqcloud.com//u/can/use/slash/sample1470281794?imageView2/5/w/300

这样,即便通过了缩放和裁剪,也能够使得原图的两头局部失去保留。

对于万象优图提供的高级图像处理(imageMogr2)接口,能够依照九宫格来抉择更多的旋转、裁剪解决模式。

然而这种用Url传参数来指定图片解决形式的做法显得很笨呐有木有Orz,每次申请图片资源都须要做一次解决……别急,万象优图提供了另外一种省心的图片解决形式——在Web控制台中,对某个存储空间下的所有图片,设定对立的图片款式。

新增加一个款式,点击编辑。



以及图片水印(左上角的蝙蝠侠标记)

总结:

通过以上操作,就将腾讯云提供的音视频上传下载、万象优图图片存储以及解决(缩放、裁剪、水印)等性能集成到了APP和业务端服务器中。