共计 4742 个字符,预计需要花费 12 分钟才能阅读完成。
在《Serverless 音视频转码——芒果 TV 落地实际(上)》中,咱们回顾了芒果 TV 吴刚强老师在 techo 大会的精彩分享,芒果 TV 音视频编解码业务团队通过应用腾讯云 Serverless 音视频转码服务,老本升高 45% 以上,引起大家的宽泛关注,小伙伴们都蠢蠢欲动!
本文咱们将率领大家一起应用云函数 + COS + CLS + FFmpeg 构建高可用、并行处理、实时日志、高度自定义的视频转码服务。咱们在此提供了两种计划,您能够间接用转码利用,一键部署,也能够通过
用函数的长运行计划来本人解决。
实现计划
计划一: 应用官网的流式音视频转码,一键部署。查看详情
计划二: 利用云函数的异步执行机制,自主研发。查看详情
流式音视频转码计划
通过云函数创立 FFmpeg 工作过程,云函数过程与 FFmpeg 工作过程通过 pipe 和 FIFO 的形式进行数据传输。云函数过程中的两个工作线程别离接管 FFmpeg 工作过程向函数过程输入的 FFmpeg 日志流与转码后的文件流,从而实现流式读写 COS 和实时日志输入的转码利用场景。
计划劣势
- 流式转码
采纳流式拉取源视频文件,流式上传转码文件的工作形式,冲破了本地存储的限度,且不须要额定部署 CFS 等产品。 - 实时日志
视频转码过程中,可通过 CLS 日志实时查看转码进度。同时反对输入 FFmpeg 利用的残缺日志。 - 长时运行
利用云函数的长时运行机制,反对 12h-24h 的运行时长,可笼罩大文件耗时较长的转码场景。 - 自定义参数
反对用户自定义配置 FFmpeg 命令参数。
前提条件
- 装置 Serverlesss Framework。
- 函数长时运行 白名单申请。
- 配置部署账号权限。参考 账号和权限配置
- 配置 运行角色 权限。
操作步骤
1. 下载转码利用
sls init transcode-app
进入我的项目目录 transcode-app
,将看到目录构造如下:
transcode-app
|- .env #环境配置
|- serverless.yml # 利用配置
|- log/ #log 日志配置
| └── serverless.yml
└──transcode/ #转码函数配置
|- src/
| |- ffmpeg #转码 FFmpeg 工具
| └── index.py
└── serverless.yml
log/serverless.yml
定义一个 CLS 日志集和主题,用于转码过程输入的日志保留,目前采纳腾讯云 CLS 日志存储。每个转码利用将会依据配置的 CLS 日志集和主题去创立相干资源,CLS 的应用会产生计费,具体参考 CLS 计费规定。transcode/serverless.yml
定义函数的根底配置及转码参数配置。transcode/src/index.py
转码性能实现。transcode/src/ffmpeg
转码工具 FFmpeg。
2. 配置环境变量和利用参数
- 利用参数,文件
transcode-app/serverless.yml
# 利用信息
app: transcodeApp # 您须要配置成您的利用名称
stage: dev # 环境名称,默认为 dev
- 环境变量,文件
transcode-app/.env
REGION=ap-shanghai # 利用创立所在区,目前只反对上海区
TENCENT_SECRET_ID=xxxxxxxxxxxx # 您的腾讯云 sercretId
TENCENT_SECRET_KEY=xxxxxxxxxxxx # 您的腾讯云 sercretKey
阐明:
- 您能够登录腾讯云控制台,能够在 API 密钥治理 中获取 SecretId 和 SecretKey。
- 如果您的账号为主账号,或者子账号具备扫码权限,也能够不配置 SercretId 与 SercretKey,间接扫码部署利用。更多详情参考 账号和权限配置。
3. 配置转码须要的参数信息
-
CLS 日志定义,文件
transcode-app/log/serverless.yml
# 组件信息 component: cls # 援用 component 的名称 name: cls-video # 创立的实例名称,请批改成您的实例名称 #组件参数 inputs: name: cls-log # 您须要配置一个 name,作为您的 cls 日志集名称 topic: video-log # 您须要配置一个 topic,作为您的 cls 日志主题名称 region: ${env:REGION} # 区域,对立在环境变量中定义 period: 7 # 日志保留工夫,单位天
-
云函数及转码配置,文件
transcode-app/transcode/serverless.yml
# 组件信息 component: scf # 援用 component 的名称 name: transcode-video # 创立的实例名称,请批改成您的实例名称 #组件参数 inputs: name: transcode-video-${app}-${stage} src: ./src handler: index.main_handler role: transcodeRole # 函数执行角色,已授予 cos 对应桶全读写权限 runtime: Python3.6 memorySize: 3072 # 内存大小,单位 MB timeout: 43200 # 函数执行超时工夫, 单位秒, 即本 demo 目前最大反对 12h 运行时长 region: ${env:REGION} # 函数区域,对立在环境变量中定义 asyncRunEnable: true # 开启长时运行,目前只反对上海区 cls: # 函数日志 logsetId: ${output:${stage}:${app}:cls-video.logsetId} # cls 日志集 cls-video 为 cls 组件的实例名称 topicId: ${output:${stage}:${app}:cls-video.topicId} # cls 日志主题 environment: variables: # 转码参数 REGION: ${env:REGION} # 输入桶区域 DST_BUCKET: test-123456789 # 输入桶名称 DST_PATH: video/outputs/ # 输入桶门路 DST_FORMATS: avi # 转码生成格局 FFMPEG_CMD: ffmpeg -i {inputs} -y -f {dst_format} {outputs} # 转码根底命令,您可自定义配置,但必须蕴含 ffmpeg 配置参数和格式化局部,否则会造成转码工作失败。FFMPEG_DEBUG: 0 # 是否输入 ffmpeg 日志 0 为不输入 1 为输入 TZ: Aisa/Shanghai # cls 日志输入工夫的时区 events: - cos: # cos 触发器 parameters: bucket: test-123456789.cos.ap-shanghai.myqcloud.com # 输出文件桶 filter: prefix: video/inputs/ # 桶内门路 events: 'cos:ObjectCreated:*' # 触发事件 enable: true
- 输入桶与函数倡议配置在同一区域,跨区域配置利用稳定性及效率都会升高,并且会产生跨区流量费用。
- 内存大小下限为 3072MB,运行时长下限为 43200s。如需调整,请 提交工单 申请配额调整。
- 转码利用必须开启函数长时运行 asyncRunEnable: true。
- 运行角色请依据 运行角色 创立并受权。
- 示例配置的 FFmpeg 指令仅实用于 AVI 转码场景,具体介绍参考 FFmpeg 指令。
4. 部署我的项目
在 transcode-app
我的项目目录下,执行 sls deploy
部署我的项目。
cd transcode-app && sls deploy
5. 上传视频文件
上传视频文件到曾经配置好的 cos 桶指定门路,则会主动转码。本示例中是 cos 桶 test-123456789.cos.ap-shanghai.myqcloud.com
下的/video/inputs/
转码胜利后,文件将保留在您配置的输入桶门路中。本示例中是 cos 桶 test-123456789.cos.ap-shanghai.myqcloud.com
下的/video/outputs/
6. 重新部署
如果须要调整转码配置,批改文件 transcode/serverless.yml
后,重新部署云函数即可:
cd transcode && sls deploy
监控与日志服务
批量文件上传到 COS 会并行触发转码执行。
- 登录 云函数控制台 的【函数服务】页面中,单击函数名进入函数治理页面。
- 单击【日志查问】,即可查看日志监控。
- 单击【函数治理】>【函数配置】,单击日志主题的链接,跳转至日志服务控制台。
- 在日志服务控制台的【检索剖析】页面中,抉择日志汇合日志主题,即可查看日志检索剖析。
借助函数异步运行能力自主研发计划
在音视频转码、ETL 大体量数据处理、AI 推理等单任务重计算的场景下,函数的单实例运行时须要更多算力及更长时间的稳固运行。若函数的调用端长时间阻塞期待执行后果,不仅会继续占用调用方资源,还会对调用链路的稳定性产生较高要求。
云函数 SCF 提供了一种全新的函数运行机制,您可通过 SCF 提供的函数异步执行模式,晋升执行超时工夫下限和解决现有运行机制的问题。
操作步骤
- 登录 云函数控制台,单击左侧导航栏的【函数服务】。
- 在主界面上方抉择冀望创立函数的地区,并单击【新建】,进入函数创立流程。
- 抉择应用【空白函数】或抉择应用【函数模板】来新建函数。
- 在“函数配置”页面,开展【高级设置】,并勾选【异步执行】。
- 单击【实现】即可创立函数。
运行机制原理
函数启用异步执行后,通过同步(例如 API 网关)或异步(例如 COS、CKafka、Timer 等)调用端进行事件调用,函数将以异步执行模式响应事件。
即实现事件调度后立刻返回事件的调用标识 RequestId,并完结调用操作,调用端无需阻塞期待。返回 RequestId 的同时,调用引擎将并行下发事件到函数运行时,开启函数逻辑执行。进入异步执行状态后,执行日志将实时上报至日志服务,提供对异步执行事件运行状况的实时反馈。其原理如图所示:
注意事项:
- 因为运行机制差别,暂不反对切换同步 / 异步执行模式。仅反对创立函数时抉择是否开启“异步执行”性能,函数创立后该配置将锁定,不提供批改更新操作。
- 事件调用胜利,返回信息只蕴含 RequestId。事件执行后果须要在函数代码逻辑中自行实现回调特定的 API 或者发送告诉音讯。
实时日志强依赖于日志服务,零碎将默认开启日志服务 CLS,您须要在函数高级配置中选定已有日志集及主题。
- 如果没有日志集或日志主题,则须要新建。
- 如果不开启日志服务 CLS,将无奈获取实时日志。
- 异步执行目前反对最长执行时长为 24 小时。如需更长运行时长,可 提交工单 申请。
- 如果通过函数运行角色获取对其余云服务组件的拜访权限,角色密钥有效期最长为 12 小时,须要思考缩短有效期策略或应用长期有效密钥。
状态追踪原理
函数高级配置启用状态追踪后,针对异步执行的事件,将开始记录并上报事件响应的实时状态,并提供事件状态的统计、查问及终止等事件治理相干服务。其原理如下图所示:
相干接口
事件治理相干服务 API 通过云 API 的形式提供,详情参考官网
舒适提醒
- 产生的事件状态数据仅保留 3 天,将以 3 天为工夫窗口滑动清理。如需保留全副记录,则须要定期拉取并保留至自有存储。
- 敞开状态追踪后,将进行提供异步执行事件相干记录、统计、查问、终止等事件治理相干服务,已产生的事件状态数据将在 3 天内清空。
- 异步运行函数的事件调用 QPS 限度为并发数量的十分之一,超出局部将被限度,造成响应失败。
- 因为申请 QPS 超限、账户欠费等起因,事件调用将由调度引擎间接返回对应异样,不会生成事件状态记录。
One More Thing
立刻体验腾讯云 Serverless Demo,支付 Serverless 新用户礼包 ???? serverless/start
欢送拜访:Serverless 中文网!