版权声明:本文由腾讯云原创文章,转载请注明出处:
文章原文连接:https://www.qcloud.com/community/article/196html
来源:腾云阁 https://www.qcloud.com/community前端
产品的整个技术实现架构由Android/iOS APP、业务服务器以及腾讯云服务组成。其中,APP负责和用户进行交互,包含的功能模块有:web
考虑到咱们的业务类型和开发团队的技术基础,咱们选用的后台技术架构是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内容的版权,咱们还须要防盗链和水印功能。
因而咱们采用腾讯云的万象优图来实现上述的图片处理功能。整个使用过程能够分为:
首先,在腾讯云Web控制台中点击进入“万象优图”。在以前已经建好的项目PetUGC中新建一个图片空间petimage。
而后,点击“管理”,进入对图片空间的配置界面。
在“图片识别”功能中,能够开启鉴黄功能的使用状态。点击保存后,凡是要上传入当前图片空间(petimage)的新图片,都须要先通过鉴黄处理。万象优图会为每一张图片打分(0~100分),其中,超过91分的图片,会被系统肯定为是黄图,低于83分的,会被系统肯定为是正常图片。分值处于83~91之间的,系统会判别为“疑似黄图”,但没法肯定,须要业务端经过人工审核的方式来断定是否为黄图。
业务端能够进一步设置回调阈值和回调URL,让腾讯云万象优图将“疑似黄图”的图片和相应的判别结果返回给业务端,以作进一步的处理。
万象优图为开发者提供了Android、iOS和服务器端的SDK和Demo示例,并封装好了相应的功能模块供灵活调用。以下是SDK的下载地址
以Android为例,点击下载“Android体验demo”,在QcloudImageActivity中能够看到关键的业务逻辑代码:
首先,由APP向业务端服务器发起请求,获取签名sign(即访问腾讯云万象优图资源的权限)。
在获取签名sign后,就可构造图片上传请求:
在图片上传请求的回调接口onUploadSucceed中,能够设定图片上传成功后对APP UI界面的操做,在onUploadProgress中可设定图片上传的进度显示,在onUploadFailed中可设定图片上传失败后的处理。
以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和业务端服务器中。