资讯详情

基于 Amazon Lambda 的无服务器视频转码方案

afb3eefbc7df21f800db529f45cff79f.gif

在 re:Invent 2020 上,Amazon Lambda推出大函数支持。Amazon Lambda客户可以设置Amazon Lambda函数的最大内存为 10,240 MB(10GB),最大内存3008MB限制增加了三倍多。Amazon Lambda函数配置较大的内存有助于更快地实施批处理、提取、转换、加载等大规模内存密集型操作(ETL)媒体音视频文件的作业和处理。

由于Amazon Lambda根据配置的内存大小按比例分配函数CPU因此,客户现在可以访问多达6个vCPU。这有助于更快地实施机器学习、建模、基因组学和高性能计算(HPC)计算密集型应用程序,如应用程序。本文将介绍基于无服务器架构的视频转码方案的设计,并在大内存中展示其设计Amazon Lambda函数中的性能。

视频转码是一项计算密集型任务。 c5.large例如,1小时1080p h264视频转码为720p h264视频可能需要计算近2个小时。Amazon Lambda函数的最大超时时间是15分钟,似乎是单个Amazon Lambda函数似乎不适合作为视频转码的计算平台。

但是,因为顾客特别喜欢Amazon Lambda函数的快速扩展,根据使用量付费,不需要管理自己的服务器,许多客户找到了自己的使用Amazon Lambda运行并行视频转码系统的函数创新方法。2017年,Revvel 为Verizon构建无服务器视频转码系统,可在不到10分钟内完成视频转码任务[1]。2017年,斯坦福大学Sadjad Fouladi设计了一个名字ExCamera该系统可以低延迟编辑、转换和编码视频。ExCamera5000个并行运行Amazon Lambda时长为14分48秒的44秒可在2分36秒内使用k原始视频@20dB编码到VP8编解码器[2]。2020年6月,来自A Cloud Guru的Peter Sbarski使用Amazon Lambda函数、Step Functions工作流和Amazon EFS文件系统构建了无服务器视频转码演示。Peter演示系统可在3分钟内完成1GB MKV 的视频转码 [3]。

基于这些成功案例的证据Amazon Lambda无服务器视频转码函数不仅可行,而且非常实用。本博客将介绍一个简单的无服务器视频转码方案。

无服务器视频转码是一种典型的并行视频转码系统: 将输入视频分成15分钟内完成的视频片段,并行处理每个视频片段,并将处理后的视频片段合并成完整的输出视频。它由4个Amazon Lambda函数、1个Step Functions 用于输入和输出视频的工作流和工作流Amazon S三储物桶组成。Amazon Lambda无服务器计算平台,Amazon Step Functions工作流负责协调多个视频转码Amazon Lambda函数函数。Amazon S3用于长期存储视频文件。整个解决方案不需要用户管理Amazon EC2实例。

解决方案如下: 用户通过命令或Web控制台将视频上传到输入Amazon S3桶,Amazon S3调用TriggerWorkflow lambda函数。TriggerWorkflow lambda函数启动Step Function转码输入视频文件频文件。工作流包括三个步骤:

  1. 通过分析原始视频文件生成下一步操作所需的控制数据,如输入视频将分为多少个视频片段、每个视频片段的长度和每个视频片段的开始位置。

  2. Step Functions并发启动工作流Transcoder lambda函数并传输到每个视频片段的开始时间和持续时间。每个转码器将从Amazon S读取其分配的输入视频片段并转码并保存结果Amazon S3桶。

  3. 当所有Transcoder lambda函数完成后,Step Functions 启动MergeVideo Lambda函数。MergeVideo Lambda函数将从Amazon S读取所有转码的视频片段,将其合并成完整的视频,最后上传到Amazon S3输出桶。

Amazon lambda开源使用函数FFmpeg来检查和处理视频文件。您可以从无服务器应用程序存储库部署ffmpeg-lambda-layer或者建立自己的层包装 FFmpeg 静态构建。

在控制函数功能中,我们能 ffprobe 命令检查输入视频文件。video_file_url”是 Amazon S3 输入视频的预签名 url。

ffprobe -v error -show_format -show_streams -of json video_file_url

这允许我们在不下载整个文件的情况下获取原始视频文件的元数据。控制函数可以使用元数据来确定视频片段的数量和每个视频片段的持续时间。控制器函数戳每个视频片段的开始时间(start_ts)并将连续时间传递给转码函数。

我们使用以下转码函数ffmpeg命令将从start_ts时间戳剪切start_ts duration,并将分辨率缩小到 720p。我们还添加了-x264opts stitchable允许最终视频合并,这样我们就可以毫无问题地将多个转码完成的视频片段合并成一个完整的视频。假如音频流是aac我们只需要将编码复制到输出。

fmpeg-verror-ssstart_ts-1-ivideo_file_url-ss1-tduration -vfscale=-1:720-x264optsstitchable-c:acopy-youtput_filename

*左滑查看更多

“video_file_url输入视频Amazon S3预签名网站。这允许转码器Amazon Lambda函数并行处理视频的一小部分,而无需下载整个视频文件。将存储分段转码的输出视频文件Amazon S下一步将使用3桶。

在 在合并视频函数中,它将读取转码的视频片段文件列表并写入 segmentlist.txt在文件中操作以下内容ffmpeg命令将所有部分合并成完整的视频文件。

ffmpeg -v error -f concat -safe 0 -i segmentlist.txt -c copy video_filename

视频文件合并操作完成后,函数将上传完整的输出视频文件Amazon S3原始视频的位置output目录。

我们使用Step Functions 协调视频转码工作流程。并行处理是加速转码的关键。Step Functions Dynamic Parallelism 允许我们以输入数组为输入并行启动Amazon lambda函数。但是MAP状态当前限制最多只能有40个并发的tasks。为了实现更高的并发性,我们增加了3个并行状态MAP分支。这允许最多120个并发。如果我们需要更高的并发性,我们可以MAP另一个嵌套在状态中MAP它能达到状态 1600 个并发。

我们用这个测试视频测试了这个没有服务器的视频转码器方案。这个视频是1小时4小时K(3840×2160)mp4视频。采用视频流h264解码器编码,音频流aac编解码器编码。帧速为25fps。文件大小为6.8GB。

在测试中,我们将视频分为30个片段,每个片段持续约2分钟,并将视频转换为720p(1080×720)的mp4文件。同时启动30个并发视频转码Amazon Lambda并行运行函数进行视频转码。除Transcoder除了功能,一切lambda功能均配置为10GB内存。我们将Transcoder功能的内存从1GB增加到10GB,增量为1GB。下图显示了转码工作流程的总持续时间和相应时间Amazon Lambda成本。

可见当Transcoder当函数内存增加时,转码时间减少。在10GB转码在内存下 119秒内完成。Amazon Lambda成本为 0.293 美元。每分钟0输出视频.0049美元。当Amazon Lambda内存从1GB增加到10GB性能会提高,而且Amazon Lambda成本保持不变。

部署完成后,提供计划api gateway restful接口/transcode 提供用户调用,用户首先需要将原始视频上传到方案部署region所在的Amazon S同时,需要提供转码方案所在账户的读写Amazon S3对应的bucket的权限,因为视频转码Amazon Lambda函数需要读取原始视频并在原始视频的目录中创建output将转码的视频文件放在目录中output目录中。

部署完成后,使用可以通过transcode的api进行转码,采用Post调用,下面是post消息结构体样例

{ "bucket": "ffmpeg-layer-eu", //原始视频所在S3 Bucket
  "key": "waterdrop.mp4",      //原始视频对应的S3 key
  "options": {                 //视频转码对应的参数
    "resolution": "360",       //目标视频分辨率
    "bitrate": "ORIGINAL",     //目标视频码率
    "codec": "ORIGINAL",       //目标视频codec
    "manualOptions": "",       //ffmpeg特定的参数,
    "segment_time": 30 ,       //视频分片的时间长短,默认是60秒,可以通过这个参数修改
    "aws_region" : "eu-central-1" //视频源文件所在的S3 Bucket对应的region,如果不指定的话转吗方案会使用转吗方案部署的region去读取S3文件
    }
}
api 会启动视频转码的Step-Function,返回视频转码Step-Function对应的Arn,比如下面的例子:

{
 "statusCode": 200,
 "body": "\"arn:aws-cn:states:cn-north-1:065717342743:execution:MainStateMachine-ShPWBXk9mwX5:3f1fc607-b585-41ba-b3b3-fe68f1ac58fd\""
}

*左滑查看更多

api会启动视频转码的Step-Function,返回视频转码Step-Function对应的Arn,比如下面的例子:

{
 "statusCode": 200,
 "body": "\"arn:aws-cn:states:cn-north-1:065717342743:execution:MainStateMachine-ShPWBXk9mwX5:3f1fc607-b585-41ba-b3b3-fe68f1ac58fd\""
}

*左滑查看更多

用户可以通过aws cli stepfunction describe-execution来获取这个转码任务的状态,比如下面的样例输出:

describe-execution —execution-arn arn:aws-cn:states:cn-north-1:xxxxxx:execution:MainStateMachine-ShPWBXk9mwX5:3f1fc607-b585-41ba-b3b3-fe68f1ac58fd
{
"executionArn": "arn:aws-cn:states:cn-north-1:065717342743:execution:MainStateMachine-ShPWBXk9mwX5:3f1fc607-b585-41ba-b3b3-fe68f1ac58fd",
"stateMachineArn": "arn:aws-cn:states:cn-north-1:065717342743:stateMachine:MainStateMachine-ShPWBXk9mwX5",
"name": "3f1fc607-b585-41ba-b3b3-fe68f1ac58fd",
"status": "SUCCEEDED",
"startDate": 1636356418.774,
"stopDate": 1636356426.48,
"input": "{\"job_id\": \"146d8d6b-b0bb-4dd6-8111-06b72f9b77b6\", \"bucket\": \"test-api-minggu-20211029\", \"key\": \"video/waterdrop.mp4\", \"object_prefix\": \"video/\", \"object_name\": \"waterdrop.mp4\", \"segment_time\": 30, \"create_hls\": \"0\", \"options\": {\"resolution\": \"360\", \"bitrate\": \"ORIGINAL\", \"codec\": \"ORIGINAL\", \"manualOptions\": \"\", \"segment_time\": 30, \"aws_region\": \"cn-north-1\"}}",
"inputDetails": {
"included": true
},
"output": "{\"input_segments\": 1, \"merged_video\": \"s3://test-api-minggu-20211029/video/output/waterdrop.mp4\", \"create_hls\": 0, \"output_bucket\": \"test-api-minggu-20211029\", \"output_key\": \"video/waterdrop.mp4\"}",
"outputDetails": {
"included": true
},
"traceHeader": "Root=1-6188d142-e9953a2b8b88c142e69d84d7;Sampled=1"
}

*左滑查看更多

如果想尝试使用这个方案进行转码操作,可以使用下面的步骤进行Amazon cloudformation一键式部署:

1. 登陆到亚马逊云科技的账户控制面板。

2. 点击下面的链接跳转到Amazon cloudformation的控制台进行部署

使用Quickstart/templates目录下的Amazon CloudFormation模版,可以快速完成部署。这个模版会新建带有两个公有子网的VPC, Amazon S3和DynamoDB Endpoints, Amazon S3存储桶,DyanomDB表,Amazon EFS文件系统, Amazon Lambda函数和Step Functions状态机。

借助Amazon Lambda大型函数支持,客户可以立即访问每个亚马逊云科技区域的6000个vCPU。这种巨大的计算能力可以在Amazon Lambda上实现更多的计算密集型和内存密集型工作负载。

我们还展示了我们可以使用Amazon Lambda、Amazon Step Functions构建并行视频转码器。它可以快速且廉价地转码视频。无服务器视频转码器代码可在此处的GitHub上找到。

[1] November 27, 2017, Greg Femec, Revvel, Building a Serverless Pipeline to Transcode a Two-Hour Video in Minutes (SRV314, Amazon re:Invent 2017)

[2] 2017, Encoding, Sadjad Fouladi, Stanford University, Fast and Slow: Low-Latency Video Processing Using Thousands of Tiny Threads (USDI 2017)

https://www.usenix.org/conference/nsdi17/technical-sessions/presentation/fouladi

[3] (https://medium.com/@sbarski?source=post_page—–96575bc85157——————————–), A Cloud Guru, How I used Amazon Lambda and Amazon EFS for massively parallel processing

https://acloudguru.com/blog/engineering/how-i-used-lambda-and-efs-for-massively-parallel-compute

亚马逊云科技资深解决方案架构师

负责设计和研发亚马逊云科技解决方案,在通信行业和电商行业具有超过十五年的研发经验,的在Serverless, DevOps,Data Analysis等方向有丰富的实践经验。

亚马逊云科技资深无服务器产品专家

在过去的20多年一直从事软件架构、程序开发以及技术推广等领域的工作。他擅长Web领域应用、SaaS系统和云呼叫中心开发,也从事过多个大型软件项目的设计、开发与项目管理。目前他专注与云计算以及互联网等技术领域,致力于帮助中国的 开发者构建基于云计算的新一代的互联网应用。

标签: d142对射式光电传感器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台