在《Serverless 音视频转码 —— 芒果 TV 落地实践(上)》中,我们回顾了芒果 TV 吴坚强老师在 techo 大会的精彩分享,芒果TV 音视频编解码业务团队通过使用腾讯云 Serverless 音视频转码服务,成本降低 45% 以上,引起大家的广泛关注,小伙伴们都跃跃欲试!
本文我们将带领大家一起使用云函数 + COS + CLS + FFmpeg 构建高可用、并行处理、实时日志、高度自定义的视频转码服务。我们在此提供了两种方案,您可以直接用转码应用,一键部署,也可以通过 用函数的长运行方案来自己处理。
方案一:使用官网的流式音视频转码,一键部署。详情参考:https://cloud.tencent.com/document/product/583/51451
方案二:利用云函数的异步执行机制,自主研发。详情参考:https://cloud.tencent.com/document/product/583/51519
通过云函数创建 FFmpeg 任务进程,云函数进程与 FFmpeg 任务进程通过 pipe 和 FIFO 的方式进行数据传输。云函数进程中的两个任务线程分别接收 FFmpeg 任务进程向函数进程输出的 FFmpeg 日志流与转码后的文件流,从而实现流式读写 COS 和实时日志输出的转码应用场景。
前提条件
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
说明:
3. 配置转码需要的参数信息
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
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 的同时,调用引擎将并行下发事件到函数运行时,开启函数逻辑执行。进入异步执行状态后,执行日志将实时上报至日志服务,提供对异步执行事件运行情况的实时反馈。其原理如图所示:
函数高级配置启用状态追踪后,针对异步执行的事件,将开始记录并上报事件响应的实时状态,并提供事件状态的统计、查询及终止等事件管理相关服务。其原理如下图所示:
事件管理相关服务 API 通过云 API 的方式提供,详情参考官网:https://cloud.tencent.com/document/product/583/51519
你学会了吗?
立即体验腾讯云 Serverless Demo,获取 Serverless 新用户礼包,请在 PC 端访问: serverless.cloud.tencent.com/start?c=wx
欢迎进入千人 QQ 群 (537539545) 交流!
点击「阅读原文」了解详情!
本文分享自 ServerlessCloudNative 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!