关于腾讯云:Serverless-音视频转码-芒果-TV-落地实践下

7次阅读

共计 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 命令参数。

前提条件

  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: ./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 会并行触发转码执行。

  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/start

欢送拜访:Serverless 中文网!

正文完
 0