在 《Serverless 音视频转码——芒果 TV 落地实践(上)》中,我们回顾了芒果 TV 吴坚强老师在 techo 大会的精彩分享,芒果TV 音视频编解码业务团队通过使用腾讯云 Serverless 音视频转码服务,成本降低 45% 以上,引起大家的广泛关注,小伙伴们都跃跃欲试!

本文我们将带领大家一起使用云函数 + COS + CLS + FFmpeg 构建高可用、并行处理、实时日志、高度自定义的视频转码服务。我们在此提供了两种方案,您可以直接用转码应用,一键部署,也可以通过 用函数的长运行方案来自己处理。

实现方案

方案一: 使用官网的流式音视频转码,一键部署。查看详情 方案二: 利用云函数的异步执行机制,自主研发。查看详情

流式音视频转码方案

通过云函数创建 FFmpeg 任务进程,云函数进程与 FFmpeg 任务进程通过 pipe 和 FIFO 的方式进行数据传输。云函数进程中的两个任务线程分别接收 FFmpeg 任务进程向函数进程输出的 FFmpeg 日志流与转码后的文件流,从而实现流式读写 COS 和实时日志输出的转码应用场景。

方案优势

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

前提条件

  1. 安装 Serverlesss Framework。
  2. 函数长时运行 白名单申请。
  3. 配置部署账号权限。参考 账号和权限配置
  4. 配置 运行角色 权限。

操作步骤

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: ./srchandler: index.main_handler role: transcodeRole # 函数执行角色,已授予cos对应桶全读写权限runtime: Python3.6 memorySize: 3072 # 内存大小,单位MBtimeout: 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 会并行触发转码执行。

  1. 登录 云函数控制台 的【函数服务】页面中,单击函数名进入函数管理页面。
  2. 单击【日志查询】,即可查看日志监控。
  3. 单击【函数管理】>【函数配置】,单击日志主题的链接,跳转至日志服务控制台。
  4. 在日志服务控制台的【检索分析】页面中,选择日志集合日志主题,即可查看日志检索分析 。

借助函数异步运行能力自主研发方案

在音视频转码、ETL 大体量数据处理、AI 推理等单任务重计算的场景下,函数的单实例运行时需要更多算力及更长时间的稳定运行。若函数的调用端长时间阻塞等待执行结果,不仅会持续占用调用方资源,还会对调用链路的稳定性产生较高要求。 云函数 SCF 提供了一种全新的函数运行机制,您可通过 SCF 提供的函数异步执行模式,提升执行超时时间上限和解决现有运行机制的问题。

操作步骤

  1. 登录 云函数控制台,单击左侧导航栏的【函数服务】。
  2. 在主界面上方选择期望创建函数的地域,并单击【新建】,进入函数创建流程。
  3. 选择使用【空白函数】或选择使用【函数模板】来新建函数。
  4. 在“函数配置”页面,展开【高级设置】,并勾选【异步执行】。
  5. 单击【完成】即可创建函数。

运行机制原理

函数启用异步执行后,通过同步(例如 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 音视频转码 —— 芒果 TV 落地实践(下)相关推荐

  1. Serverless 音视频转码 —— 芒果 TV 落地实践(上)

    本文整理自芒果 TV 吴坚强在 Techo 大会的分享.下面,让我们一起回顾下吴老师在 Techo 大会的精彩演讲内容. 原文作者:吴坚强 整理编辑:王天云:@Aceyclee 大家好,我叫吴坚强,来 ...

  2. Serverless 在线教育解决方案:豌豆思维落地实践

    在线教育蓬勃发展 技术保障面临新挑战 2020年的互联网市场中,受疫情影响,在线教育用户增长幅度大幅领先于其它互联网应用,行业增长趋势明显.在教育部"停课不停学"的指导下,原来线下 ...

  3. 音视频转码器产品规格

    音视频转码器产品规格 QQ:16614119 一.            产品简介: 音视频转码器是一套商业级的实时.非实时转码产品.提供常用编码格式之间的转换:支持远程控制转码任务:支持多种输入输出 ...

  4. 音视频转码FFmpeg

    前言 音视频转码主要指这样的概念: 容器格式的转换,比如MP4转换为MOV 容器中音视频数据编码方式转换,比如H264编码转换成MPEG4编码,MP3换为AAC 音视频码率的转换,比如4M的视频码率降 ...

  5. 基于ffmpeg实现音视频转码

    一.背景 偶然的机会接触了ffmpeg,当时是从B站下载的视频转移到笔记本上看.使用b站手机客户端下载的视频格式为m4s的两个文件(video.m4s和audio.m4s),需要转成普通播放器支持的m ...

  6. JAVA调用FFmpeg实现音视频转码加水印功能

    目录 目录 写在前面 MAVEN引用 获取音视频基本信息 音频转码成Mp3格式 视频转码成Mp4格式 视频转码成Mp4并添加文字水印 视频转码成Mp4并添加图片水印 测试代码 写在前面 如今各大云厂商 ...

  7. ffmpeg学习(13)音视频转码(2)使用filter

    ffmpeg学习(10)音视频文件muxer(1)封装格式转换 中介绍了媒体文件的封装格式转换,ffmpeg学习(11)音视频文件muxer(2)多输入混流 中介绍了音视频的混流,本文介绍基于ffmp ...

  8. 音视频转码技术指南:国内主流云转码服务提供商对比测评

    摘要: 随着大量视频产生,怎样才能够高效精准地对视频进行云端转码和处理,来适配多终端展示需求和应对复杂的网络情况,是我们视频行业开发人员工作的重中之重.作为从业者,我们会经常接触各大云转码服务商,对音 ...

  9. 软件合码器-驾考-驾驶员考试-音视频合成-四合一-多路视频合成一路技术开发-音视频合码器

    本技术以实际开发实施案例为基础(驾驶员路考系统用的音视频监控合成) 软件合码器-驾考-驾驶员考试-音视频合成-四合一-多路视频合成一路技术开发-音视频合码器 软件效果: 设计流程: 简介 视频合成软件 ...

最新文章

  1. Only tensors or tuples of tensors can be output from traced functions
  2. 安装Kubernetes-Dashboard插件
  3. android 开发 时间选择器TimePicker的使用
  4. Matplotlib基础(part2)--图形对象
  5. CM: How is attachment version implemented
  6. 3706 teradata 语句报错_Teradata SQL
  7. 树,森林,二叉树的互相转换
  8. WIN10的IE错误代码inet_e_resource_not_found解决办法
  9. 第五——十三章的作业
  10. python计算运动会某个参赛选手的得分。数据保存在文件中_成绩计算电脑程序的使用说明...
  11. DBUtils 主要结果集说明
  12. 北大信科学院实验室_从实验室科学家到开放科学软件开发人员
  13. java linux 时间戳转时间_SpringMVC全局参数转换——linux时间戳转换LocalDateTime
  14. python画指数函数图像_如何使用python的matplotlib模块画指数函数图像
  15. jenkins编译java项目时无法读取pom.xml文件
  16. 《现代操作系统(中文第三版)》课后习题——第九章 安全
  17. 片上总线Wishbone 学习—— 转载请注明出处:http://blog.csdn.net/ce123
  18. 在IPCam上搭建WEB服务并通过CGI交互的相关问题
  19. 公众号欢迎各位大佬投稿
  20. 有哪些地图编辑平台?制作地图软件哪个最好?

热门文章

  1. python学习之数据类型(dic)
  2. JavaScript之一个简单的loading效果
  3. router.beforeEach方法用法
  4. Android读取SD卡.TXT文本内容
  5. 嘀嗒即使成为出行第一股,也恐怕依然是个锤子!
  6. 【WinForm】设置控件里面的所有TextBox只能输入数字
  7. 刷recovery运行linux,Ubuntu 手机版刷机简明教程(通过 recovery 刷机)【更新刷机体验视频】...
  8. 【详细教程】将Kail Linux安装入U盘并随身携带
  9. oracle 发票核销 接口,ebs r12.1.3收款核销发票LOV个性化?
  10. 给大家分享龙舞蹈的一次专访实录