部署流式转码应用

最近更新时间:2024-09-09 14:21:14

我的收藏

应用简介

通过使用 COS + 云函数 + CLS + FFmpeg,您可以快速构建高可用、并行处理、实时日志、高度自定义的视频转码服务。

架构原理

通过云函数创建 FFmpeg 任务进程,云函数进程与 FFmpeg 任务进程通过 pipe 和 FIFO 的方式进行数据传输。云函数进程中的两个任务线程分别接收 FFmpeg 任务进程向函数进程输出的 FFmpeg 日志流与转码后的文件流。实时日志线程将日志流输出,上传任务负责缓存文件流并上传至用户定义的输出 COS。

1608278445413



应用优势

流式转码 采用流式拉取源视频文件,流式上传转码文件的工作方式,突破了本地存储的限制,且不需要额外部署 CFS 等产品。
实时日志 视频转码过程中,可通过 CLS 日志实时查看转码进度。同时支持输出 FFmpeg 应用的完整日志。
长时运行 利用云函数的 长时运行机制,支持 12h-24h 的运行时长,可覆盖大文件耗时较长的转码场景。
自定义参数 支持用户自定义配置 FFmpeg 命令参数。

应用资源

转码应用部署后,将为您创建以下资源:
云函数 : 流式读取 COS 文件,使用 FFmpeg 转码后流式输出回 COS 中,并将转码过程的实时日志输出到 CLS。
CLS 日志 :存储转码过程的实时日志。CLS 日志可能会产生一定计费,详情参考 CLS 计费规则

注意事项

转码应用需要依赖云函数长时运行能力,详情请参考 异步执行
转码输出桶与函数建议配置在同一区域,因为跨区域配置转码应用稳定性及效率都会降低,并且会产生跨区流量费用。
需要为转码应用的云函数创建运行角色,并授权cos读写权限。详细配置参考 运行角色
FFmpeg 不同转码场景下指令配置参数不同,因此需要您具有一定的 FFmpeg 使用经验 。 本文中仅提供几个样例作为参考,更多 FFmpeg 指令参考 FFmpeg 官网

前提条件

2. 配置部署账号权限。详情见 账号和权限配置
3. 配置 运行角色 权限。

操作步骤

1. 下载转码应用

scf 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 # 您的腾讯云 secretId
TENCENT_SECRET_KEY=xxxxxxxxxxxx # 您的腾讯云 secretKey
说明:
您可以登录腾讯云控制台,可以在 API 密钥管理 中获取 SecretId 和 SecretKey。
如果您的账号为主账号,或者子账号具有扫码权限,也可以不配置 SercretId 与 SercretKey,直接扫码部署应用。更多详情参考 账号和权限配置

3. 配置转码需要的参数信息

CLS 日志定义,文件 transcode-app/log/serverless.yml
#组件信息全量配置参考 https://github.com/serverless-components/tencent-cls/blob/master/docs/configure.md
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
#组件信息 全量配置参考https://github.com/serverless-components/tencent-scf/blob/master/docs/configure.md
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_FORMAT: avi # 转码生成格式
FFMPEG_CMD: ffmpeg -i {input} -y -f {dst_format} {output} # 转码基础命令,您可自定义配置,但必须包含 ffmpeg 配置参数和格式化部分,否则会造成转码任务失败。
FFMPEG_DEBUG: 1 # 是否输出 ffmpeg 日志,0 为不输出,1 为输出
TZ: Asia/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 项目目录下,执行 scf deploy 部署项目。
cd transcode-app && scf 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 && scf deploy

监控与日志

批量文件上传到 COS 会并行触发转码执行。
1. 登录 Serverless 控制台函数服务页面中,单击函数名进入函数管理页面。
2. 单击日志查询,即可查看日志监控。
3. 单击函数管理 > 函数配置,单击日志主题的链接,跳转至日志服务控制台。


4. 在日志服务控制台的检索分析页面中,选择日志集合日志主题,即可查看日志检索分析 。



FFmpeg 工具

FFmpeg 指令

yml 文件 transcode-app/transcode/serverless.ymlDST_FORMATFFMPEG_CMD 指定了转码应用的转码指令,您可根据应用场景自定义配置。
例如:转码 MP4 格式视频,可以将 FFMPEG_CMD 配置如下:
DST_FORMAT: mp4
FFMPEG_CMD: ffmpeg -i {input} -vcodec copy -y -f {dst_format} -movflags frag_keyframe+empty_moov {output}
说明:
FFMPEG_CMD 必须包含 FFmpeg 配置参数和格式化部分,否则会造成转码任务失败。
FFmpeg 不同转码场景下指令配置参数不同,因此需要您具有一定的 FFmpeg 使用经验。以上提供的指令仅是针对这几个应用场景的指令。更多 FFmpeg 指令参考 FFmpeg 官网

自定义 FFmpeg

转码应用场景中提供了默认的 FFmpeg 工具,如果您想自定义 FFmpeg,执行以下操作:
1. 将样例中的 FFmpeg 替换成您自定义的 FFmpeg。
2. transcode-app/transcode 目录下再次执行 scf deploy 部署更新。
cd transcode && scf deploy
说明:
自行编译的 FFmpeg 环境与云函数运行环境如果不同,可能会导致 FFmpeg 权限问题。我们提供了云函数执行环境的官方镜像,请使用 官方镜像环境 编译您的 FFmpeg。

运行角色

转码函数运行时需要读取 COS 资源进行转码,并将转码后的资源写回 COS,因此需要给函数配置一个授权 COS 全读写的运行角色。更多参考 函数运行角色
1. 登录 访问管理控制台,单击新建角色
2. 角色载体选择腾讯云产品服务
3. 在“输入角色载体信息”步骤中勾选云函数(scf),并单击下一步
4. 在“配置角色策略”步骤中,您可以直接选择 QcloudCOSFullAccess 对象存储(COS)全读写访问权限,如果需要更细粒度的权限配置,请根据实际情况配置选择。单击下一步
5. 在“配置角色标签”步骤中,设置不同维度的标签,使用如职位、部门、籍贯等,标签对用户进行分类管理。
6. 在“审阅”步骤中,输入角色名称,完成创建角色及授权。该角色将作为函数的运行角色,配置在文件 transcode-app/transcode/serverless.yml 中。
说明:
由于运行角色密钥最长有效期为12小时,因此函数配置的超时时间不能大于12小时。如果您需要更长的函数执行时长,可以通过改造 transcode-app/transcode/src/index.py 中的访问 COS 方式,配置永久密钥去读写访问 COS。但这样会暴露您的密钥在代码中,请谨慎使用。