<!-- SPDX-FileCopyrightText: 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. SPDX-License-Identifier: MIT-0 License --> # åŸºäºŽæ— æœåŠ¡æž¶æž„çš„ç›´æ’和点æ’方案([En](./README_en.md)) 该方案基于Amazon ECS,API Gateway,DynamoDBç‰æ‰˜ç®¡æœåŠ¡ï¼Œæž„建了包å«è§†é¢‘推é€ï¼Œè½¬ç ,水å°ï¼Œç‚¹æ’和分å‘ç‰åŠŸèƒ½çš„一站å¼è§†é¢‘æœåŠ¡å¹³å°ï¼Œå…·æœ‰æœåŠ¡å¯é ,资æºå¼¹æ€§ï¼Œéƒ¨ç½²ç®€æ˜“ç‰ç‰¹ç‚¹ï¼Œæ–¹æ¡ˆæ¶‰åŠçš„所有æœåŠ¡é€šè¿‡Amazon CloudFormation实现一键部署,其ä¸æ•°æ®æµå‘如下:  ## 功能: * 推æµï¼šæ供推æµåœ°å€å’Œæµ·é‡è®¾å¤‡çš„接入,支æŒä¸»æµRTMPå议推æµï¼›æ”¯æŒOBSç‰å¸¸è§çš„第三方推æµè½¯ä»¶ï¼Œæ”¯æŒå¸¸è§çš„第三方RTMP推æµç¡¬ä»¶ï¼ˆç¼–ç 器或盒å); * 视频æ’放:支æŒHTTP-FLV(2秒延迟)和HLS/CMAF(大于10秒延迟)三ç§å›žæ”¾å议;支æŒå¸¸è§çš„第三方FLV,RTMP,HLSæ’放器VLC,FFPLAYï¼› * 视频处ç†åŠŸèƒ½ï¼šè§†é¢‘转ç ,视频录制,视频截图,直æ’æ°´å°ï¼Œç›´æ’ä¸ç»§ç‰ï¼› * 视频频å˜å‚¨å’Œç‚¹æ’:视频å˜å‚¨ï¼ˆå¯åšå†·/çƒåˆ†å±‚),支æŒå½•åˆ¶hls分片点æ’ï¼› * ç›´æ’控制å°ï¼šæä¾›API管ç†å’Œå›¾å½¢åŒ–管ç†ï¼› * 地å€ç®¡ç†ï¼šç»Ÿä¸€çš„推æµåŸŸå,æ’æµåŸŸå管ç†ï¼› * 安全:推æµé‰´æƒæ”¯æŒæŽ¨æµURL鉴æƒï¼Œæ’放鉴æƒåˆ©ç”¨CloudFrontç¾åURL支æŒæ’放URL防盗链以åŠæ’放鉴æƒï¼› ## 方案应用场景: * 普通/低延迟直æ’:满足ä¸ï¼Œå°åž‹å®¢æˆ·çš„普通和低延迟直æ’需求,如游æˆï¼Œç”µå•†ï¼Œåª’体,教育ç‰è¡Œä¸šçš„ç›´æ’ï¼› * 大并å‘上行视频云å˜å‚¨ï¼šå°†ç›‘æŽ§è®¾å¤‡ï¼Œæ™ºèƒ½è®¾å¤‡é€šè¿‡æ ‡å‡†åŒ–å议接入,在云端进行监控æµçš„收录å˜å‚¨ï¼Œåª’体处ç†ï¼› ## 方案特点: * æ— æœåŠ¡ï¼Œç«¯åˆ°ç«¯ï¼šåŸºäºŽäº‘åŽŸç”Ÿæ— æœåŠ¡æž¶æž„ï¼Œæ— éœ€è¿›è¡Œå®¹é‡è§„划,å‡å°‘è¿ç»´è´Ÿæ‹…,轻æ¾æ‰©å±•ï¼ŒæŒ‰éœ€ä»˜è´¹ï¼› * 简å•ï¼Œå¼€æ”¾ï¼Œé›†æˆï¼šæ–¹æ¡ˆä½¿ç”¨ç®€å•ï¼Œä¸ç”¨å¤æ‚çš„é…置,满足éžä¸“业客户直æ’推,转,拉的需求;具备很好的开放性,åŒAmazon托管æœåŠ¡æ— ç¼é›†æˆï¼› * 大容é‡ï¼Œé«˜è´Ÿè½½ï¼šåŸºäºŽECSå¼¹æ€§æž¶æž„ï¼Œæ ¹æ®æŽ¨æ‹‰æµçš„负载弹性伸缩,支æŒæµ·é‡çš„视频æµæŽ¥å…¥å’Œæ‹‰å–ï¼› * 自助化管ç†ï¼šå¯ä»¥é€šè¿‡æŽ§åˆ¶å°å’ŒAPI对直æ’æµå…ƒæ•°æ®è¿›è¡Œç®¡ç†ï¼Œä¹Ÿå¯ä»¥æ ¹æ®éœ€æ±‚设置适åˆæ‚¨ä¸šåŠ¡åœºæ™¯çš„ç›´æ’功能,如录制,转ç ,截图,水å°ç‰ * 一键部署:通过CloudFormation实现方案的一键部署(北京,å®å¤åŒºåŸŸï¼‰  ## 方案架构:  ### 架构说明: **视频接入æœåŠ¡ï¼š** 高å¯ç”¨ä»£ç†æœåŠ¡å™¨é›†ç¾¤ï¼Œé€šè¿‡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实现视频转ç ,直æ’,录制,分片ç‰åŠŸèƒ½ï¼ŒåŒ…括: * 高性能,基于Ngnix HTTP server * 视频æµè¿›è¡Œå®žæ—¶ç¼–ç ,转ç * 视频和图片分片和S3å˜å‚¨ï¼Œè‡ªå®šä¹‰åˆ†ç‰‡æ—¶é—´å’Œè½¬ç å‚数, * 支æŒHTTP-FLV(2秒延迟)和HLS\CMAF(10秒延迟) * 动æ€è°ƒæ•´å‚数,轻æ¾ä¸ŽAmazonæœåŠ¡é›†æˆ **视频分å‘æœåŠ¡** 基于Fargateå’ŒCloudFront实现频é“寻å€ï¼Œè§†é¢‘åŠ é€Ÿï¼ŒåŒ…æ‹¬ï¼š * 视频æµåˆ†å‘底层æœåŠ¡çš„弹性伸缩 * 通过自动寻å€å®žçŽ°å¤šè·¯è¾“å…¥æµåˆ°ä¸€è·¯è¾“出 * 内置Nginx缓å˜ï¼Œå°½å¯èƒ½å‡å°‘æœåŠ¡å™¨ä¸Šçš„负载,é¿å…惊群效应 * 利用CloudFront优化下行拉æµä½“验,通过signed URL实现视频的安全访问 **演示web:注æ„该webç•Œé¢ä»…作演示用途,默认方案ä¸ä¼šåˆ›å»ºè¯¥webç•Œé¢ï¼Œéœ€è¦åœ¨CloudFormationä¸çš„å‚数显å¼æŒ‡å®š**  演示web功能包括: * 域åé…ç½® * ç›´æ’ç®¡ç† * 视频录制 * æ°´å°é…ç½® * 视频ä¸ç»§ * 在线视频 ## 安装与部署: **先决æ¡ä»¶ï¼š** * ç¡®ä¿æ‚¨æœ‰ICP备案的域å,点击[**这里**](https://www.amazonaws.cn/support/icp/?nc1=h_ls)了解如何进行ICP备案。 点击[**这里**](https://cn-north-1.console.amazonaws.cn/cloudformation/home?region=cn-north-1#/stacks/create/template?stackName=AWSVideoStreamingPlatform&templateURL=https://aws-gcr-solutions.s3.cn-north-1.amazonaws.com.cn/serverless-video-streaming/v1.0.0/aws-serverless-video-streaming.main.template.yaml)跳转到对应的Amazon CloudFormation控制å°ï¼ˆåŒ—京),点击下一æ¥è¿›è¡Œéƒ¨ç½²  点击下一æ¥è¿›è¡Œéƒ¨ç½²é€‰é¡¹é…置,其ä¸InstallDemoConsoleé…置是å¦éƒ¨ç½²ç”¨æˆ·æ¼”示的webç•Œé¢ï¼Œé»˜è®¤ä¸ºfalse,CNAMEé…ç½®CloudFront所关è”çš„CNAMEs,大陆用户需è¦ä½¿ç”¨å¤‡æ¡ˆåŸŸå进行关è”ï¼Œæµ·å¤–ç”¨æˆ·æ— æ¤è¦æ±‚,默认为www.example.cn [**å¯é€‰**]在方案部署完毕之åŽï¼Œå¦‚果您希望通过HTTPSæ–¹å¼åˆ†å‘视频æµä»¥è¿›ä¸€æ¥å¢žå¼ºå®‰å…¨æ€§ï¼Œåˆ™å¯ä»¥æŒ‰ç…§ä¸‹åˆ—æ¥éª¤æ¥é¢å¤–é…置您的CloudFrontå’ŒElastic Load BalanceræœåŠ¡ * æ¥éª¤ä¸€ï¼ŒèŽ·å–您域å对应的SSLè¯ä¹¦ 安装certbot,执行如下命令(mac用户) ``` brew install certbot sudo certbot certonly --manual --preferred-challenges dns -d "*.<your domain prefix>.aws.a2z.org.cn" ``` 执行åŽç•Œé¢æ示类似信æ¯å¦‚下: ``` Please deploy a DNS TXT record under the name _acme-challenge.<your domain prefix>.aws.a2z.org.cn with the following value: 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/<your domain prefix>.aws.a2z.org.cn/cert.pem \ --private-key file:///etc/letsencrypt/live/<your domain prefix>.aws.a2z.org.cn/privkey.pem \ --certificate-chain file:///etc/letsencrypt/live/<your domain prefix>.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è¯ä¹¦  * æ¥éª¤å››ï¼Œæ‰“å¼€EC2控制å°æ‰¾åˆ°Load Balancer,找到您的å‰ç¼€ä¸ºoriginçš„Load Balancer,然åŽç‚¹å‡»Add listener -> Default SSL certificate -> 选择您在之å‰ä¸Šä¼ çš„SSLè¯ä¹¦   ## 创建直æ’é¢‘é“ æ–¹æ¡ˆé€šè¿‡API Gatewayæ供的Restful APIæ¥å¯¹è§†é¢‘频é“的元数æ®è¿›è¡Œç®¡ç†å¹¶é›†æˆåˆ°è‡ªå·±çš„应用和管ç†ç•Œé¢ä¸ã€‚在方案部署完毕之åŽï¼Œè·³è½¬åˆ°å‰ç¼€ä¸ºVideoMetadataçš„nest stack,查看output选项以获å–所创建的API Gatewayçš„URL地å€ã€‚  通过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创建直æ’频é“,创建æˆåŠŸåŽä¼šèŽ·å–å¯¹åº”çš„è¿”å›žä¿¡æ¯  登陆到DynamoDB控制å°ï¼ŒæŸ¥çœ‹å为video-metadata的表项,å¯ä»¥çœ‹åˆ°å¯¹åº”çš„channelä¿¡æ¯å·²ç»åˆ›å»ºï¼Œè®°å½•ä¸‹å¦‚图所示的channel idå’Œkey两个å—符串.  将上述å—ç¬¦ä¸²æŒ‰ç…§å¦‚ä¸‹æ ¼å¼è¿›è¡Œæ‹¼æŽ¥ï¼Œç”¨ä½œåŽç»è§†é¢‘推é€çš„串æµå¯†é’¥ **串æµå¯†é’¥æ ¼å¼** ``` <id>?sign=<key> ``` **范例如下:** ``` 70ef9b07-adbe-478d-b098-d7c8efd84a98?sign=1670371200-5db080c8cdca8764de881bc04e61e2b1 ``` 从CloudFormation控制å°è¾“出é¢æ¿ä¸èŽ·å–推æµåŸŸå,推æµåœ°å€ï¼ˆå…¶ä¸çš„LiveVideoPushStreamURL)  **推æµç½‘å€ï¼š** 从CloudFormation控制å°èŽ·å–推æµåœ°å€ä¹‹åŽï¼ŒæŒ‰ç…§ä»¥ä¸‹æ–¹å¼æ‹¼æŽ¥è§†é¢‘推é€çš„RTMP地å€ï¼š ``` rtmp://<LiveVideoPushStreamURL>/stream/98724e64-bcd1-4887-af4a-60be440709aa?sign=1670544000-63497837275539bdb8e21800887e2db9 ``` é…置对应的推æµè½¯ä»¶å¦‚OBSæ¥è¿›è¡Œè§†é¢‘æŽ¨é€  其他é…置如下所示: * ç¼–ç 器:x264 * 速率控制:CBR * 比特率:1000 (或更低) * 关键帧间隔(秒,0=自动):2 * CPU Usage Preset (higher = less CPU) :veryfast, * Tune:zerolatency 通过视频æ’放器(ffplayer)或æµè§ˆå™¨æŸ¥çœ‹è§†é¢‘ ``` ffplay http://<LiveVideoPullStreamURL>/98724e64-bcd1-4887-af4a-60be440709aa/live.flv http://<LiveVideoPullStreamURL>/98724e64-bcd1-4887-af4a-60be440709aa/flv.html ``` ## (å¯é€‰ï¼‰æ¼”示web使用说明: **注æ„该webç•Œé¢ä»…作演示用途,默认方案ä¸ä¼šåˆ›å»ºè¯¥webç•Œé¢ï¼Œéœ€è¦åœ¨CloudFormationä¸çš„å‚数显å¼æŒ‡å®š** **创建直æ’频é“** 从CloudFormation控制å°è¾“出é¢æ¿ä¸ï¼ŒèŽ·å–ç›´æ’控制å°åœ°å€ï¼ŒæŽ¨æµ/拉æµåœ°å€ï¼Œæ‹‰æµåŸŸå。  登陆进入直æ’控制å°åœ°å€ï¼Œç‚¹å‡»â€œç›´æ’频é“â€å³ä¸Šè§’+创建直æ’频é“,然åŽæŒ‰ç…§å¦‚下æ“作: * 输入直æ’频é“å称,æ述和过期时间 * é€‰æ‹©è§†é¢‘è¾“å‡ºæ ¼å¼ï¼Œä¾‹å¦‚:HLS,FLV,CMAF * ç³»ç»Ÿè‡ªåŠ¨æ ¹æ®åŸŸå和过期时间生æˆç¾å推æµåœ°å€  **获å–推æµåœ°å€å’Œæ’放地å€** 按照如下æ¥éª¤æ“作: * 点击ç®å¤´æŒ‰é’®ï¼Œè‡ªåŠ¨ç”ŸæˆæŽ¨æµåœ°å€å’Œæ’æ”¾åœ°å€ * è‡ªåŠ¨æ ¹æ®è¿‡æœŸæ—¶é—´å’Œç§é’¥ç”Ÿæˆç¾å推æµåœ°å€å’ŒæŽ¨æµäºŒç»´ç * 自动生æˆHLS,FLV,CMAF拉æµåœ°å€ * 点击对应输出的æ’放按钮,æ’放视频  **在线预览直æ’视频æµ** 按照如下æ¥éª¤æ“作: * ç‚¹å‡»å¤´åƒ æŒ‰é’®ï¼Œæ˜¾ç¤ºç›´æ’视频æµè§ˆ * 自动生æˆè§†é¢‘æµæ’放地å€å’ŒäºŒç»´ç * æ ¹æ®ä¸åŒçš„è§†é¢‘è¾“å‡ºæ ¼å¼åœ¨çº¿é¢„览 * ç›´æ’推æµæˆåŠŸåŽï¼Œå¤§æ¦‚需è¦35秒左å³å¯åœ¨çº¿çœ‹åˆ°ç›´æ’æµ **ç›´æ’视频录制** æ ¹æ®é…置的录制规则对æ£åœ¨ç›´æ’的视频进行录制和截图,按照如下æ¥éª¤æ“作: * æ“作:点击修改按钮,修改直æ’视频录制的å‚æ•° * å½•åˆ¶æ ¼å¼ï¼šå½•åˆ¶æ–‡ä»¶çš„æ ¼å¼ï¼Œæ”¯æŒâ€œJPGâ€â€œMP4â€å’Œâ€HLSâ€æ ¼å¼ * å˜å‚¨ä½ç½®:å˜å‚¨åœ¨è‡ªåŠ¨ç”Ÿæˆçš„S3å˜å‚¨æ¡¶ä¸ï¼ˆvideo-streaming-assets-assetsbucket开头) * å‚数:截图频率,MP4录制频率,HLS录制频率 * 任务类型:çµæ´»é€‰æ‹©è½¬ç 任务类型,节çœæˆæœ¬  **ç›´æ’æ°´å°** 原始æµè§†é¢‘ç”»é¢æ·»åŠ 上å„ç§é¢„è®¾å¥½çš„æ ‡å¿—å›¾ç‰‡å’Œæ–‡å—,包括如下功能: * 支æŒå›¾ç‰‡æ°´å°å’Œæ–‡å—æ°´å° * 主è¦å‚数:包括水å°ä½ç½®å’Œæ°´å°å¤§å° ,文å—åŠæ–‡å—属性 * 图片水å°å‚数:图片URL地å€ï¼Œå›¾ç‰‡é«˜åº¦ï¼Œå›¾ç‰‡å®½åº¦ï¼Œå·¦å³é—´è·  **ç›´æ’视频转ç :** 将推é€çš„ç›´æ’æµè½¬ç æˆå¤šç§åˆ†è¾¨çŽ‡å’Œç çŽ‡è§„æ ¼çš„è§†é¢‘æµï¼ŒåŒ…括如下功能: * 适é…ä¸åŒæ’放终端;适é…ä¸åŒç½‘络环境;é™ä½Žåˆ†å‘æˆæœ¬ * 预置转ç 模æ¿ï¼šæ”¯æŒé€‰æ‹©è§†é¢‘画质,视频画质内置了常用的æµç•…ï¼Œæ ‡æ¸…ï¼Œé«˜æ¸…å’Œè¶…æ¸…å››ç§æ ‡å‡†æ¨¡æ¿ * 任务类型:çµæ´»é€‰æ‹©è½¬ç 任务类型,节çœæˆæœ¬ 转ç 模æ¿çš„分辨率和ç 率如下所示: | | **视频画质** | **分辨率** | **ç 率(Kbps)** | | ---- | --------------------- | ---------- | -------------------- | | | æµç•… | 640*360 | 400 | | | æ ‡æ¸… | 854*480 | 600 | | | 高清 | 1280*720 | 1000 | | | 超清 | 1920*1080 | 2000 |  **ç›´æ’ä¸ç»§ï¼š** 在直æ’视频æµä¸ç»§è½¬å‘,包括如下功能: * 通过视频relay自动把原始视频æµæŽ¨é€åˆ°å…¶ä»–视频直æ’å¹³å° * 实现国内和海外åŒæ¥ç›´æ’  ## 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.