应用简介
通过使用 COS + 云函数 + CLS + FFmpeg,您可以快速构建高可用、并行处理、实时日志、高度自定义的视频转码服务。
架构原理
通过云函数创建 FFmpeg 任务进程,云函数进程与 FFmpeg 任务进程通过 pipe 和 FIFO 的方式进行数据传输。云函数进程中的两个任务线程分别接收 FFmpeg 任务进程向函数进程输出的 FFmpeg 日志流与转码后的文件流。实时日志线程将日志流输出,上传任务负责缓存文件流并上传至用户定义的输出 COS。
应用优势
流式转码
采用流式拉取源视频文件,流式上传转码文件的工作方式,突破了本地存储的限制,且不需要额外部署 CFS 等产品。
实时日志
视频转码过程中,可通过 CLS 日志实时查看转码进度。同时支持输出 FFmpeg 应用的完整日志。
长时运行
利用云函数的 长时运行机制,支持 12h-24h 的运行时长,可覆盖大文件耗时较长的转码场景。 自定义参数
支持用户自定义配置 FFmpeg 命令参数。
应用资源
转码应用部署后,将为您创建以下资源:
云函数:流式读取 COS 文件,使用 FFmpeg 转码后流式输出回 COS 中,并将转码过程的实时日志输出到 CLS。
CLS 日志:存储转码过程的实时日志。CLS 日志可能会产生一定计费,详情参考 CLS 计费规则。 注意事项
转码应用需要依赖云函数长时运行能力,详情请参考 异步执行。 转码输出桶与函数建议配置在同一区域,因为跨区域配置转码应用稳定性及效率都会降低,并且会产生跨区流量费用。
需要为转码应用的云函数创建运行角色,并授权cos读写权限。详细配置参考 运行角色。 FFmpeg 不同转码场景下指令配置参数不同,因此需要您具有一定的 FFmpeg 使用经验 。 本文中仅提供几个样例作为参考,更多 FFmpeg 指令参考 FFmpeg 官网。 前提条件
操作步骤
1. 下载转码应用
进入项目目录 transcode-app
,将看到目录结构如下:
transcode-app
|- .env
|- serverless.yml
|- log/
| └── serverless.yml
└──transcode/
|- src/
| |- 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
环境变量,文件transcode-app/.env
REGION=ap-shanghai
TENCENT_SECRET_ID=xxxxxxxxxxxx
TENCENT_SECRET_KEY=xxxxxxxxxxxx
说明:
您可以登录腾讯云控制台,可以在 API 密钥管理 中获取 SecretId 和 SecretKey。 如果您的账号为主账号,或者子账号具有扫码权限,也可以不配置 SercretId 与 SercretKey,直接扫码部署应用。更多详情参考 账号和权限配置。 3. 配置转码需要的参数信息
CLS 日志定义,文件 transcode-app/log/serverless.yml
:
component: cls
name: cls-video
inputs:
name: cls-log
topic: video-log
region: ${env:REGION}
period: 7
云函数及转码配置,文件 transcode-app/transcode/serverless.yml
:
component: scf
name: transcode-video
inputs:
name: transcode-video-${app}-${stage}
src: ./src
handler: index.main_handler
role: transcodeRole
runtime: Python3.6
memorySize: 3072
timeout: 43200
region: ${env:REGION}
asyncRunEnable: true
cls:
logsetId: ${output:${stage}:${app}:cls-video.logsetId}
topicId: ${output:${stage}:${app}:cls-video.topicId}
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_DEBUG: 1
TZ: Asia/Shanghai
events:
- 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 会并行触发转码执行。
1. 登录 云函数控制台 的函数服务页面中,单击函数名进入函数管理页面。 2. 单击日志查询,即可查看日志监控。
3. 单击函数管理 > 函数配置,单击日志主题的链接,跳转至日志服务控制台。
4. 在日志服务控制台的检索分析页面中,选择日志集合日志主题,即可查看日志检索分析 。
FFmpeg 工具
FFmpeg 指令
yml 文件 transcode-app/transcode/serverless.yml
中 DST_FORMAT
与FFMPEG_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
目录下再次执行 sls deploy
部署更新。
cd transcode && sls deploy
说明:
自行编译的 FFmpeg 环境与云函数运行环境如果不同,可能会导致 FFmpeg 权限问题。我们提供了云函数执行环境的官方镜像,请使用 官方镜像环境 编译您的 FFmpeg。 运行角色
转码函数运行时需要读取 COS 资源进行转码,并将转码后的资源写回 COS,因此需要给函数配置一个授权 COS 全读写的运行角色。更多参考 函数运行角色。 2. 在“输入角色载体信息”步骤中勾选云函数(scf),并单击下一步。
3. 在“配置角色策略”步骤中,选择函数所需策略并单击下一步。
说明:
您可以直接选择 QcloudCOSFullAccess
对象存储(COS)全读写访问权限,如果需要更细粒度的权限配置,请根据实际情况配置选择。
4. 输入角色名称,完成创建角色及授权。该角色将作为函数的运行角色,配置在文件 transcode-app/transcode/serverless.yml
中。
说明:
由于运行角色密钥最长有效期为12小时,因此函数配置的超时时间不能大于12小时。如果您需要更长的函数执行时长,可以通过改造 transcode-app/transcode/src/index.py
中的访问 COS 方式,配置永久密钥去读写访问 COS。但这样会暴露您的密钥在代码中,请谨慎使用。
本页内容是否解决了您的问题?