视频存储与处理服务解决方案是基于阿里云服务提供高可靠存储和实时自动化服务的一种视频存储和处理解决方案。根据企业业务需求,支持视频存储、水印、转码、点播等能力。帮助您优化和增强视频网站能力,为客户提供高质量的视频服务,体验本方案预计费用约为5元。
本方案通过视频点播VOD、消息服务MNS、函数计算FC、对象存储OSS、云服务器ECS实现视频上传、处理和存储服务。
解决问题1:视频处理效率低
通过使用视频点播VOD、消息服务MNS、函数计算FC,实现自动化的视频处理,从而提高视频的处理效率。
解决问题2:视频存储成本高
通过使用低成本的对象存储OSS,实现对上传的视频的存储和管理,从而降低视频的存储成本。
解决问题3:视频上传性能低
通过使用云服务器ECS和负载均衡ALB,实现视频上传服务的弹性和高性能,从而提高了视频上传性能。
1.高效稳定
基于云计算和大数据技术,可以实现快速、可靠的视频存储、处理、传输和分发,保证视频服务的高质量和高可用性。
2.弹性扩展
可以根据客户需求实现对视频存储、处理、传输和分发等各个环节的灵活配置和扩展,从而有效降低成本,提高服务效率。
3.安全可靠
提供数据安全、网络安全、系统安全等多个层面的保障,可以有效防范各类安全风险和威胁,保护用户数据的安全和隐私。
1.视频数据管理
视频点播应用于视频管理场景:上传、存储、转码、加密、发布、管理,全面管理视频生命周期,满足不同需求。
2.视频自动化处理
视频点播、函数计算、消息服务,结合实现视频自动化处理:上传视频,触发转码、审核任务,保存视频、发送通知,提高处理效率和质量。
3.视频数据冷热分层
通过将视频数据按照热度分成不同层次,并采用不同的OSS存储策略和技术手段,可以更加有效地管理数据,降低存储成本,提高数据利用效果。
部署流程简介:
1.部署准备
完成账号申请、账号充值、RAM用户创建和授权。
2.规划网络和资源
根据云上架构要求,规划博客网站的网络和资源。
3.部署操作
部署视频网站架构所需的云服务。
4.配置视频网站服务
使用部署的云服务配置视频网站服务。
5.完成及清理
提供验证方案是否部署成功的步骤。
视频存储与处理是指基于阿里云服务提供高可靠存储和实时自动化服务,能够满足用户对视频存储、转码、截图、播放、直播等功能的需求。本技术解决方案以搭建一个视频存储和处理服务为例,为您演示:
方案提供的默认设置完成部署后在阿里云上搭建的网站运行环境如下图所示。实际部署时您可以根据资源规划修改部分设置,但最终形成的运行环境与下图相似。
本方案的技术架构包括以下基础设施和云服务:
开始部署前,请按以下指引完成账号申请、账号充值、RAM用户创建和授权。
1.如果您还没有阿里云账号,请访问阿里云账号注册页面,根据页面提示完成注册。阿里云账号是您使用云资源的付费实体,因此是部署方案的必要前提。
2.开通以下云服务:MNS、OSS、VOD、FC、EventBridge。
3.一键授予VOD访问您在其他云产品中的资源的权限。
4.为阿里云账号充值。
产品 | 费用来源 | 规格 | 地域 | 预估费用参考 |
---|---|---|---|---|
应用型负载均衡ALB | ALB实例费 | 基础版 | 华东2(上海) | 0.042元/时 |
应用型负载均衡ALB | ALB容量费 | - | 华东2(上海) | 0.042元/LCU |
云服务器ECS | ECS1配置费 | 实例:ecs.c7.large (按量付费,2 vCPU 4 GiB) 系统盘:cloud_efficiency 40GiB |
华东2(上海) | 0.450元/时 |
云服务器ECS | ECS2配置费 | 实例:ecs.c7.large (按量付费,2 vCPU 4 GiB) 系统盘:cloud_efficiency 40GiB |
华东2(上海) | 0.450元/时 |
消息服务MNS | Queue占用费 | - | 华东2(上海) | 0.5元/日 |
消息服务MNS | API请求次数费 | - | 华东2(上海) | 2.0元/百万次 |
对象存储OSS | 标准存储(本地冗余)容量(Storage)费 | - | 华东2(上海) | 0.12元/GB/月 |
对象存储OSS | PUT类或GET类请求费 | - | 华东2(上海) | 0.01元/万次 |
函数计算FC | 函数调用次数费 | - | 华东2(上海) | 0.01元/万次 |
函数计算FC | GPU使用量费 | - | 华东2(上海) | 0.0007元/GB*秒 |
函数计算FC | 活跃vCPU使用量费 | - | 华东2(上海) | 0.000127元/vCPU*秒 |
函数计算FC | 内存使用量费 | - | 华东2(上海) | 0.0000127元/GB*秒 |
函数计算FC | 公网出流量费 | - | 华东2(上海) | 0.50元/GB |
视频点播VOD | 媒资管理费 | - | 华东2(上海) | 0.12元/GB/月 |
5.阿里云账号拥有操作所有资源的最高权限,为了安全起见,建议您使用RAM用户。RAM用户需要获得相关权限才能完成方案部署,详情如下:
涉及的云服务:视频点播服务VOD、消息服务MNS、函数计算FC、对象存储OSS、对象存储OSS、云服务器ECS、访问控制RAM、负载均衡SLB、专有网络VPC、资源编排服务ROS、运维编排服务OOS、配额Quotas、访问控制RAM、标签服务TAG。
权限策略参考:
云服务 | 需要的权限 | 描述 |
---|---|---|
视频点播服务VOD | AliyunVODFullAccess | 管理视频点播服务VOD的权限 |
消息服务MNS | AliyunMNSFullAccess | 管理消息服务MNS的权限 |
函数计算FC | AliyunFCFullAccess | 管理函数计算FC的权限 |
对象存储OSS | AliyunOSSFullAccess | 管理对象存储OSS的权限 |
云服务器ECS | AliyunECSFullAccess | 管理云服务器ECS的权限 |
访问控制RAM | AliyunRAMFullAccess | 管理访问控制台RAM的权限 |
负载均衡SLB | AliyunSLBFullAccess | 管理负载均衡ALB的权限 |
专有网络VPC | AliyunVPCFullAccess | 管理专有网络VPC的权限 |
资源编排服务ROS | AliyunROSFullAccess | 管理资源编排服务ROS的权限 |
运维编排服务OOS | AliyunOOSFullAccess | 管理运维编排服务OOS的权限 |
配额Quotas | AliyunQuotasFullAccess | 管理配额Quotas的权限 |
访问控制RAM | AliyunRAMFullAccess | 管理访问控制RAM的权限,即管理用户以及授权的权限 |
标签服务TAG | AliyunTagManagerAccess | 管理标签服务TAG的权限 |
一键部署基于阿里云资源编排服务ROS(Resource Orchestration Service)实现,ROS模板已定义好脚本,可自动化地完成云资源的创建和配置,提高资源的创建和部署效率。ROS模板完成的内容包括:
您可以通过下方提供的ROS一键部署链接,来自动化地完成这些资源的创建和配置:
1.一键部署资源。
单击一键部署,并选择地域。为避免因地域不支持云服务而导致部署失败,建议您参考本方案选择华东2(上海)地域进行部署测试。实际部署生产时,请确保您选择的地域已支持以上云服务。
在配置模板参数页面修改资源栈名称,配置ECS实例、OSS Bucket。填写完所有必选信息并确认后单击创建开始一键配置。
当资源栈信息页面的状态显示为创建成功时表示一键配置完成。
2.部署函数计算代码。
在资源栈页面选择事件页签,找到FcTrigger,在其右侧单击资源ID。
在函数 VideoWatermark 详情页面,选择函数代码页签。
-在函数代码页签下的index.py文件的内容,替换为以下代码示例,在替换代码示例时,将bucket_src替换为启用视频点播服务时配置的Bucket的名称,将bucket_target替换为存储处理后的视频使用的Bucket的名称。
示例代码如下:
# -*- coding: utf-8 -*-
import subp*ess
import oss2
import logging
import json
import os
import time
import base64
logging.getLogger("oss2.api").setLevel(logging.ERROR)
logging.getLogger("oss2.auth").setLevel(logging.ERROR)
LOGGER = logging.getLogger()
'''
1. function and bucket locate in same region
2. service's role has OSSFullAccess
3. event format
{
"bucket_name" : "test-bucket",
"object_key" : "a.mp4",
"output_dir" : "output/",
"vf_args" : "drawtext=fontfile=/usr/share/fonts/truetype/wqy/wqy-zenhei.ttc:text='hello函数计算':x=100:y=50:fontsize=24:fontcolor=red:shadowy=2",
"filter_complex_args": "overlay=0:0:1"
}
filter_complex_args 优先级 > vf_args
vf_args:
- 文字水印
vf_args = "drawtext=fontfile=/usr/share/fonts/truetype/wqy/wqy-zenhei.ttc:text='hello函数计算':x=50:y=50:fontsize=24:fontcolor=red:shadowy=1"
- 图片水印, 静态图片
vf_args = "movie=/code/logo.png[watermark];[in][watermark]overlay=10:10[out]"
filter_complex_args: 图片水印, 动态图片gif
filter_complex_args = "overlay=0:0:1"
'''
# a decorator for print the excute time of a function
def print_excute_time(func):
def wrapper(*args, **kwargs):
local_time = time.time()
ret = func(*args, **kwargs)
LOGGER.info('current Function [? excute time is ?f seconds' ? (func.__name__, time.time() - local_time))
return ret
return wrapper
def get_fileNameExt(filename):
(fileDir, tempfilename) = os.path.split(filename)
(shortname, extension) = os.path.splitext(tempfilename)
return fileDir, shortname, extension
@print_excute_time
def handler(event, context):
# 解析消息获取上传视频地址
evt = json.loads(event)
message = evt[0]["messageBody"]
parsed_message = message.encode("utf-8").decode("unicode_escape")
info_bytes = base64.urlsafe_b64decode(parsed_message)
infoData = json.loads(info_bytes)
fileUrl = infoData["FileUrl"]
oss_bucket_name = "bucket_src"
# 从上传视频地址fileUrl解析object key,fileUrl 如 bucketname.oss-cn-shanghai.aliyuncs.com/object-key.mp4
url_split_array = fileUrl.split('com/', 1)
object_key = url_split_array[1]
output_dir = "output/"
vf_args = "movie=/code/logo.png[watermark];[in][watermark]overlay=10:10[out]"
filter_complex_args = "overlay=0:0:1"
LOGGER.info('object_key:{}'.format(object_key))
if not (vf_args or filter_complex_args):
assert "at least one of 'vf_args' and 'filter_complex_args' has value"
# 初始化oss client
creds = context.credentials
auth = oss2.StsAuth(creds.accessKeyId,
creds.accessKeySecret, creds.securityToken)
oss_client = oss2.Bucket(
auth, 'oss-?internal.aliyuncs.com' ?ontext.region, oss_bucket_name)
e*st = oss_client.object_e*sts(object_key)
LOGGER.info('e*st:{}'.format(e*st))
if not e*st:
raise Exception("object {} is not e*st".format(object_key))
# 生成包含签名的url地址,允许ffmpeg命令临时访问视频
input_path = oss_client.sign_url('GET', object_key, 3600)
# 生成输出文件路径
fileDir, shortname, extension = get_fileNameExt(object_key)
dst_video_path = os.path.join("/tmp", "watermark_" + shortname + extension)
# 构造添加水印命令并执行
cmd = ["ffmpeg", "-y", "-i", input_path,
"-vf", vf_args, dst_video_path]
if filter_complex_args: # gif
cmd = ["ffmpeg", "-y", "-i", input_path, "-ignore_loop", "0",
"-i", "/code/logo.gif", "-filter_complex", filter_complex_args, dst_video_path]
LOGGER.info("cmd = {}".format(" ".join(cmd)))
try:
subp*ess.run(
cmd, stdout=subp*ess.PIPE, stderr=subp*ess.PIPE, check=True)
except subp*ess.CalledP*essError as exc:
LOGGER.error('returncode:{}'.format(exc.returncode))
LOGGER.error('cmd:{}'.format(exc.cmd))
LOGGER.error('output:{}'.format(exc.output))
LOGGER.error('stderr:{}'.format(exc.stderr))
LOGGER.error('stdout:{}'.format(exc.stdout))
video_key = os.path.join(output_dir, fileDir, shortname + extension)
# 初始化目标oss client,并上传带水印视频
oss_client2 = oss2.Bucket(
auth, 'oss-?internal.aliyuncs.com' ?ontext.region, "bucket_target")
oss_client2.put_object_from_file(video_key, dst_video_path)
LOGGER.info("Uploaded {} to {} ".format(dst_video_path, video_key))
# 移除本地文件
os.remove(dst_video_path)
return "ok"
部署云服务后,您可以测试上传视频文件并获取添加水印的视频文件来验证。
1.上传视频文件。
2.获取添加水印的视频文件。
在本方案中,您创建了2台云服务器ECS实例、1个应用型负载均衡ALB实例、2个交换机、1个专有网络VPC、1个云数据库PolarDB MySQL版实例。测试完方案后,您可以参考以下规则处理对应产品的实例,避免继续产生费用:
1.手动删除对象存储OSS Bucket。
登录OSS管理控制台,在左侧导航栏,选择Bucket列表,单击目标Bucket,在文件列表,选择目标文件,然后单击彻底删除。在左侧导航栏,选择删除Bucket,单击删除Bucket,根据页面提示删除Bucket。
2.手动删除FC服务。
登录函数计算控制台,在左侧导航栏,选择服务及函数,在服务列表页面,找到目标服务,在其右侧操作列,单击删除,根据页面提示删除服务。
3.手动删除VOD服务。
登录视频点播管理控制台,在左侧导航栏,选择配置管理 > 媒资管理配置 > 存储管理,在目标Bucket右侧操作列,单击删除,根据页面提示删除Bucket。
4.一键自动删除其他资源。
官网相关地址直达:
1.视频网站的存储与媒体处理方案:https://www.aliyun.com/solution/tech-solution/vsaps
2.阿里云服务器ECS相关活动:https://www.aliyun.com/daily-act/ecs/activity_selection
3.云小站(代金券发布平台):https://www.aliyun.com/minisite/goods