阿里云最新上云解决方案:视频网站的存储与媒体处理解决方案

2024-04-29  本文已影响0人  阿里云最新优惠和活动汇总

视频存储与处理服务解决方案是基于阿里云服务提供高可靠存储和实时自动化服务的一种视频存储和处理解决方案。根据企业业务需求,支持视频存储、水印、转码、点播等能力。帮助您优化和增强视频网站能力,为客户提供高质量的视频服务,体验本方案预计费用约为5元。

一、方案介绍

视频网站的存储与媒体处理方案

本方案通过视频点播VOD、消息服务MNS、函数计算FC、对象存储OSS、云服务器ECS实现视频上传、处理和存储服务。

方案优势

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 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.部署函数计算代码。

-在函数代码页签下的index.py文件的内容,替换为以下代码示例,在替换代码示例时,将bucket_src替换为启用视频点播服务时配置的Bucket的名称,将bucket_target替换为存储处理后的视频使用的Bucket的名称。

示例代码如下:

# -*- coding: utf-8 -*-
import subprocess
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 [%s] excute time is %.2f 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-%s-internal.aliyuncs.com' % context.region, oss_bucket_name)

    exist = oss_client.object_exists(object_key)
    LOGGER.info('exist:{}'.format(exist))
    if not exist:
        raise Exception("object {} is not exist".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:
        subprocess.run(
            cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, check=True)
    except subprocess.CalledProcessError 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-%s-internal.aliyuncs.com' % context.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

上一篇 下一篇

猜你喜欢

热点阅读