aws-samples / aws-serverless-video-streaming

Deployment Guide: https://aws-samples.github.io/aws-serverless-video-streaming/zh/
MIT No Attribution
38 stars 13 forks source link

基于无服务架构的直播和点播方案(En

该方案基于Amazon ECS,API Gateway,DynamoDB等托管服务,构建了包含视频推送,转码,水印,点播和分发等功能的一站式视频服务平台,具有服务可靠,资源弹性,部署简易等特点,方案涉及的所有服务通过Amazon CloudFormation实现一键部署,其中数据流向如下:

data-flow

功能:

方案应用场景:

方案特点:

image-feature

方案架构:

architecture

架构说明:

视频接入服务: 高可用代理服务器集群,通过ECS Service保证节点数量,提供RTMP推流地址和海量设备的接入,采用轻量级HAPoxy,提供统一的推流地址:

rtmp://<DNS Name>/stream/<stream key>

视频网关服务: 基于Node media server实现高性能轻量级RTMP server,支持RTMP/RTMPS推流接入,维护推流状态并将保存元数据信息,基于元数据模块的会话管理,基于事件回调维护推流客户端状态,检测客户端上下线,并根据状态调度ECS任务

元数据管理: 使用dynamodb管理视频流元数据,通过API gateway提供元数据的CRUD管理的Restful API;动态设置视频流处理参数;自动生成唯一推流channel;通过API得到推流和拉流URL

视频处理服务 基于Fargate实现视频转码,直播,录制,分片等功能,包括:

视频分发服务 基于Fargate和CloudFront实现频道寻址,视频加速,包括:

演示web:注意该web界面仅作演示用途,默认方案不会创建该web界面,需要在CloudFormation中的参数显式指定

console

演示web功能包括:

安装与部署:

先决条件:

点击这里跳转到对应的Amazon CloudFormation控制台(北京),点击下一步进行部署

console-snapshot

点击下一步进行部署选项配置,其中InstallDemoConsole配置是否部署用户演示的web界面,默认为false,CNAME配置CloudFront所关联的CNAMEs,大陆用户需要使用备案域名进行关联,海外用户无此要求,默认为www.example.cn

[可选]在方案部署完毕之后,如果您希望通过HTTPS方式分发视频流以进一步增强安全性,则可以按照下列步骤来额外配置您的CloudFront和Elastic Load Balancer服务

8ZCAA6XvwLKK3MiGLRufX1p0_gIHnT-****

按照提示“_acme-challenge.<your domain prefix>.aws.a2z.org.cn Route 53 TXT type entry and set the value to 8ZCAA6XvwLKK3MiGLRufX1p0_gIHnT-****”将对应字符串添加到您管理的域名记录中,然后点击确认您将获取到签名证书,mac用户证书存放在/etc/letsencrypt/live/目录下

* 步骤二,上传SSL证书到IAM

sudo aws iam upload-server-certificate \ --path '/cloudfront/' \ --server-certificate-name '+.rtmp-nx.keyi.solutions.aws.a2z.org.cn' \ --certificate-body file:///etc/letsencrypt/live/.aws.a2z.org.cn/cert.pem \ --private-key file:///etc/letsencrypt/live/.aws.a2z.org.cn/privkey.pem \ --certificate-chain file:///etc/letsencrypt/live/.aws.a2z.org.cn/chain.pem \ --profile xx --region cn-northwest-1


* 步骤三,打开CloudFront控制台,找到您的distribution,然后点击General -> Edit -> Custom SSL Certificate (example.com) in "SSL Certificate” -> 选择您在之前上传的SSL证书
![edit-cloudfront](./images/edit-cloudfront.png)

* 步骤四,打开EC2控制台找到Load Balancer,找到您的前缀为origin的Load Balancer,然后点击Add listener -> Default SSL certificate -> 选择您在之前上传的SSL证书
![edit-elb-1](./images/edit-elb-1.png)
![edit-elb-2](./images/edit-elb-2.png)

## 创建直播频道
方案通过API Gateway提供的Restful API来对视频频道的元数据进行管理并集成到自己的应用和管理界面中。在方案部署完毕之后,跳转到前缀为VideoMetadata的nest stack,查看output选项以获取所创建的API Gateway的URL地址。

![metadata-output](./images/metadata-output.png)

通过Curl或者Postman等工具对该URL地址进行POST操作以创建直播频道,其中request的主体内容如下所示

{"isFlv":true, "isHls":true, "isVideo":false, "isImage":true, "isMotion":false, "isOnDemand":false, "isCMAF":false, "video_time":"60", "image_time":"30", "hls_time":"2", "hls_list_size":"5", "outdate":"2022-12-09"}


通过Curl创建直播频道

curl -d '{"isFlv":true, "isHls":false, "isVideo":true, "isImage":false, "isMotion":false, "isOnDemand":false, "isCMAF":false, "video_time":"60", "image_time":"30", "hls_time":"2", "hls_list_size":"5", "outdate":"2022-12-09"}' -H "Content-Type: application/json" -X POST https://xxxxx.execute-api.cn-northwest-1.amazonaws.com.cn/Prod/videostream


通过Thunder Client创建直播频道,创建成功后会获取对应的返回信息

![metadata-create](./images/metadata-create.png)

登陆到DynamoDB控制台,查看名为video-metadata的表项,可以看到对应的channel信息已经创建,记录下如图所示的channel id和key两个字符串.

![metadata-channel-key](./images/metadata-channel-key.png)

将上述字符串按照如下格式进行拼接,用作后续视频推送的串流密钥

**串流密钥格式**
?sign= ``` **范例如下:** ``` 70ef9b07-adbe-478d-b098-d7c8efd84a98?sign=1670371200-5db080c8cdca8764de881bc04e61e2b1 ``` 从CloudFormation控制台输出面板中获取推流域名,推流地址(其中的LiveVideoPushStreamURL) ![cloudformation-output](./images/cloudformation-output.png) **推流网址:** 从CloudFormation控制台获取推流地址之后,按照以下方式拼接视频推送的RTMP地址: ``` rtmp:///stream/98724e64-bcd1-4887-af4a-60be440709aa?sign=1670544000-63497837275539bdb8e21800887e2db9 ``` 配置对应的推流软件如OBS来进行视频推送 ![obs](./images/obs.png) 其他配置如下所示: * 编码器:x264 * 速率控制:CBR * 比特率:1000 (或更低) * 关键帧间隔(秒,0=自动):2 * CPU Usage Preset (higher = less CPU) :veryfast, * Tune:zerolatency 通过视频播放器(ffplayer)或浏览器查看视频 ``` ffplay http:///98724e64-bcd1-4887-af4a-60be440709aa/live.flv http:///98724e64-bcd1-4887-af4a-60be440709aa/flv.html ``` ## (可选)演示web使用说明: **注意该web界面仅作演示用途,默认方案不会创建该web界面,需要在CloudFormation中的参数显式指定** **创建直播频道** 从CloudFormation控制台输出面板中,获取直播控制台地址,推流/拉流地址,拉流域名。 ![cloudformation-output](./images/cloudformation-output.png) 登陆进入直播控制台地址,点击“直播频道”右上角+创建直播频道,然后按照如下操作: * 输入直播频道名称,描述和过期时间 * 选择视频输出格式,例如:HLS,FLV,CMAF * 系统自动根据域名和过期时间生成签名推流地址 ![create-channel](./images/create-channel.png) **获取推流地址和播放地址** 按照如下步骤操作: * 点击箭头按钮,自动生成推流地址和播放地址 * 自动根据过期时间和私钥生成签名推流地址和推流二维码 * 自动生成HLS,FLV,CMAF拉流地址 * 点击对应输出的播放按钮,播放视频 ![get-address](./images/get-address.png) **在线预览直播视频流** 按照如下步骤操作: * 点击头像 按钮,显示直播视频浏览 * 自动生成视频流播放地址和二维码 * 根据不同的视频输出格式在线预览 * 直播推流成功后,大概需要35秒左右可在线看到直播流 **直播视频录制** 根据配置的录制规则对正在直播的视频进行录制和截图,按照如下步骤操作: * 操作:点击修改按钮,修改直播视频录制的参数 * 录制格式:录制文件的格式,支持“JPG”“MP4”和”HLS”格式 * 存储位置:存储在自动生成的S3存储桶中(video-streaming-assets-assetsbucket开头) * 参数:截图频率,MP4录制频率,HLS录制频率 * 任务类型:灵活选择转码任务类型,节省成本 ![record](./images/record.png) **直播水印** 原始流视频画面添加上各种预设好的标志图片和文字,包括如下功能: * 支持图片水印和文字水印 * 主要参数:包括水印位置和水印大小 ,文字及文字属性 * 图片水印参数:图片URL地址,图片高度,图片宽度,左右间距 ![watermark](./images/watermark.png) **直播视频转码:** 将推送的直播流转码成多种分辨率和码率规格的视频流,包括如下功能: * 适配不同播放终端;适配不同网络环境;降低分发成本 * 预置转码模板:支持选择视频画质,视频画质内置了常用的流畅,标清,高清和超清四种标准模板 * 任务类型:灵活选择转码任务类型,节省成本 转码模板的分辨率和码率如下所示: | | **视频画质** | **分辨率** | **码率(Kbps)** | | ---- | --------------------- | ---------- | -------------------- | | | 流畅 | 640*360 | 400 | | | 标清 | 854*480 | 600 | | | 高清 | 1280*720 | 1000 | | | 超清 | 1920*1080 | 2000 | ![codec](./images/codec.png) **直播中继:** 在直播视频流中继转发,包括如下功能: * 通过视频relay自动把原始视频流推送到其他视频直播平台 * 实现国内和海外同步直播 ![relay](./images/relay.png) ## Security See [CONTRIBUTING](CONTRIBUTING.md#security-issue-notifications) for more information. ## License This library is licensed under the MIT-0 License. See the LICENSE file.