智能多媒体服务

  • 智能多媒体服务 > 使用指南 > 开发指南 >工作流使用

    工作流使用

    最近更新时间: 2024-12-12 15:34:31

    本文将为您介绍 V2/V3版本工作流 的使用场景、设计、示例、使用方式。

    V1版本工作流 的使用,详情参见对象存储kodo推出的 数据工作流

    简介

    工作流旨在将大部分多媒体处理功能流程化、实例化,用户可提前编排任务处理流程,对多媒体文件按照特定工作流进行处理,避免用户重复、繁琐的调用接口,提供一站式的多媒体处理服务。同时,工作流提供了条件判断机制,可自定义下一节点处理的触发条件,便于灵活组建场景化处理流程。

    适用哪些场景?

    如果您有以下多媒体处理需求时,或者您期望实现一个 弹性、易用、低成本、灵活支持处理逻辑 的多媒体处理系统,那么工作流则是您期待的最佳解决方案。

    • 您有大量并发处理需求,需要同时对一批多媒体文件做多种处理。

      • 比如转码成不同规格的视频,适配不同终端设备播放。
    • 提供丰富的计算处理原子服务,如转码、拼接、截图、水印,后期将接入内容审核、智能标签等AI能力。

    • 支持串行化处理,上一步的输出作为下一步的输入,通过多个步骤的计算处理,从而将源文件转化成符合业务需求的输出。

      • 比如先锐智转码、加水印,再对转码后的文件添加固定的片头/片尾。
    • 您有更高级的自定义处理需求,条件判断机制的引入,可自定义下一节点处理的触发条件。

      • 比如仅对>=1080p的视频做转码,需要通过执行条件来判断对哪些视频做处理,从而减少不必要的处理。
      • 比如先对原视频进行内容审核,对审核结果正常的视频进行转码,对违规视频进行封禁,来规避风险和减少不必要的处理开销。
    • 对上传到 kodo 空间的文件,自动触发工作流,发起任务处理请求。

    • 工作流模板可固化工作流,减少重复工作,统一业务处理流程标准。

    工作流示例

    1. 创建多个并发处理的工作流

    img

    • 示例:普通转码 + 锐智转码 + 视频拼接 + 截图处理
      • 此流程表示:同时对源文件进行普通转码、锐智转码、视频拼接、截图处理。
    • 输入源说明:
      • 所有节点的输入源: 源文件

    2. 创建多个原子服务串联处理的工作流

    img

    • 示例:锐智转码 -> 视频拼接 -> 输出
      • 此流程表示:先对源文件进行锐智转码处理,然后对锐智转码后的结果进行视频拼接处理。
    • 输入源说明:
      • 锐智转码节点的输入源:源文件
      • 视频拼接节点的输入源:锐智转码后的处理结果

    3. 创建有条件判断的工作流

    1)示例:视频审核 -> 执行条件(结果违规) -> 封禁 、视频审核 -> 执行条件(结果正常)-> 普通转码 -> 输出

    img

    • 此流程表示:先对源文件进行内容审核,根据执行条件对【违规视频】进行封禁,对【正常视频】进行普通转码处理。
    • 输入源说明:
      • 视频审核节点的输入源是: 源文件
      • 执行条件节点的输入源是 : 视频审核后的处理结果
      • 普通转码节点的输入源是 :源文件

    2)示例:音视频元信息 -> 执行条件 -> 普通转码 -> 输出

    img

    • 此流程表示:先对源文件获取音视频元信息,判断原视频分辨率范围,在范围内的视频,进行普通转码处理;不在范围内的视频,不再流转到下一步处理。
    • 输入源说明:
      • 音视频元信息节点的输入源: 源文件
      • 执行条件节点的输入源 : 音视频元信息处理后的处理结果
      • 普通转码节点的输入源 :源文件

    4.串行工作流子节点输入源说明

    父节点类型 输入源 下一节点可选处理类型
    普通转码 默认处理结果,作为下一节点输入源
    注意:当转码格式为 m3u8 时,不支持继续添加处理节点
    - 普通转码
    - 锐智转码
    - 截图
    - 视频拼接
    锐智转码 默认处理结果,作为下一节点输入源
    注意:当转码格式为 m3u8 时,不支持继续添加处理节点
    - 普通转码
    - 锐智转码
    - 截图视频
    - 视频拼接
    - 截图
    视频拼接 默认处理结果,作为下一节点输入源 - 普通转码
    - 锐智转码
    - 截图视频
    - 视频拼接
    - 截图
    音视频信息 默认处理结果,作为下一节点输入源 - 条件判断
    - 输出
    视频审核 默认处理结果,作为下一节点输入源 - 条件判断
    - 输出
    - 封禁
    执行条件 作为下一节点处理的前置判断条件,当前支持的有:
    1、音视频元信息
    2、视频审核
    - 普通转码
    - 锐智转码
    - 截图视频
    - 视频拼接
    - 截图
    - 输出
    截图 当前版本,处理结果不支持作为下一节点的输入源 - 输出
    封禁 当前只适用于视频审核场景,为结束节点
    输出 为结束节点

    父节点为【音视频元信息】,执行条件介绍如下:

    条件 条件描述
    分辨率 判断视频分辨率范围,对范围内的视频做下一步处理。

    父节点为【视频审核】,执行条件介绍如下:

    执行条件 条件描述
    视频审核结果为【正常】 父节点审核结果为正常时,执行下一节点处理
    视频审核结果为【违规】 父节点审核结果为违规时,执行下一节点处理
    视频审核结果为【疑似】 父节点审核结果为疑似时,执行下一节点处理
    视频审核结果不是【正常】 父节点审核结果为【违规】或【疑似】,执行下一节点处理
    视频审核结果不是【违规】 父节点审核结果为【正常】或【疑似】,执行下一节点处理

    任务创建

    您可以通过以下几种方式来创建任务:

    方式一:登录 智能多媒体服务控制台,使用任务触发器

    • 对符合规则策略的上传文件自动触发:从导航栏进入任务触发器页面,点击新建 任务触发器;创建完成后,需要将状态设置为已启用,然后通过对象存储kodo控制台或 API/SDK 上传文件到触发器指定的输入路径;将对符合规则策略的上传文件自动触发多媒体处理,并将结果文件保存到目标路径。

      img

    方式二:登录 智能多媒体服务控制台,指定文件手动触发

    • 指定文件手动触发:指定单个文件创建任务,从导航栏进入任务页面,点击【新建任务】。

      img

    任务查询

    使用【智能多媒体服务控制台->工作流模板】创建的任务,您可以使用以下2种方式进行查询:

    1、通过 状态查询接口 发起查询请求,目前仅支持查询10天内创建的任务记录。

    2、登录 智能多媒体控制台 ,进入【导航栏->任务】页面,在任务列表中进行查询。

    img

    任务通知

    在创建工作流模板时,支持设置回调地址URL,支持对任务处理后的结果,及时进行消息通知。任务通知是异步进行的,不影响正常的操作。

    下面介绍的是使用 工作流模板(V3版本) 产生任务的回调内容,包括字段名称、类型、描述。

    注意:使用V2和V3工作流模板创建的任务,任务内容是不同的,如何升级回调版本,详情查看 回调升级

    • 基本属性

      是一个JSON对象。定义:{当前任务的基本属性},字段如下。

      字段名称 说明
      version 版本号,新版本统一都为“v3”
      id 任务ID
      reqid 云处理请求的请求id,主要用于七牛技术人员的问题排查。
      pipeline 默认使用队列为:default.sys
      created_at 任务创建的时间戳,单位为毫秒
    • 任务处理对象

      是一个JSON对象。定义:{input},字段如下。

      字段名称 说明
      bucket 输入文件,当前仅支持kodo文件,待处理文件所在存储空间
      key 待处理文件名
      hash 云处理结果保存在服务端的唯一hash标识
    • 任务结果

      是一个JSON对象。定义:{任务处理结果},字段如下。

      字段名称 说明
      code 返回码, 0成功、1等待处理、2处理中、3失败、5已取消(删除pipeline时,并且有任务还在等待中)
      desc 返回信息描述,例如: success
    • 工作流节点处理详情

      是一个JSON对象组,所有工作流节点处理的详情。定义:{ops},字段如下。

      "ops": [
            {
                "id": "<opid>", // 具体执行的操作,fop与cond只会有一个非空,fop为计算节点、cond为条件判断节点
                "fop": {                    // 表示具体的音视频计算节点信息
                    "cmd": "xxx",           // 计算的命令
                    "input_from": "<opid>", // 计算的输入文件,"__origin__"表示来源于触发的主输入文件,其它表示来源于某个节点的处理结果
                    "result": {             // 处理结果
                        "code": 0,          // 0成功、3处理失败、6跳过、7无效
                        "desc": "...",      // 处理结果描述
                        "has_output": true, // 表示是否存在输出文件,如果是中间临时节点为false
                        "kodo_file": {      // 具体输出文件信息
                            "bucket": "aaa",
                            "key": "abc.mp4",
                            "hash": "..."
                        }
                    }
                },
                "depends": ["<opid>",...] // 依赖的前置处理节点
            },
            {
                "id": "<opid>",
                "cond": {                              // 条件节点信息
                    "expression": "xxx",               // 条件表达式,当前为“go template expression”
                    "result": {                        // 条件表达式的执行结果
                        "code": 0,                     // 0成功、1等待处理、2处理中、3处理失败、5任务被取消、6跳过、7无效
                        "desc": "...",                 // 处理结果描述
                        "output": "<opid>,<opid>,..."  // 输出信息,为允许执行的后置节点名称列表
                    }
                },
                "depends": ["<opid>",...] // 依赖的前置处理节点
            },
            ...
        ],
    }
    

    示例

    如果请求成功,返回包含如下内容的JSON字符串(已格式化,便于阅读):

    {
        "version": "v3",
        "id": "z0.01z001c7n9d3q0nylt000001jm0001d4",
        "reqid": "zVcAAFE4Z742sE4W",
        "pipeline": "2002.default.sys",
        "input": {
            "kodo_file": {
                "bucket": "dora-async-test",
                "key": "upload.mp4"
            }
        },
        "code": 0,
        "desc": "successfully completed",
        "ops": [
            {
                "id": "A",
                "fop": {
                    "cmd": "avinfo",
                    "input_from": "__origin__",
                    "result": {
                        "code": 0,
                        "desc": "successfully completed",
                        "has_output": false
                    }
                }
            },
            {
                "id": "B",
                "cond": {
                    "expression": "C",
                    "result": {
                        "code": 0,
                        "desc": "successfully completed",
                        "output": "C"
                    }
                },
                "depends": [
                    "A"
                ]
            },
            {
                "id": "C",
                "fop": {
                    "cmd": "avthumb/mp4",
                    "input_from": "__origin__",
                    "result": {
                        "code": 3,
                        "desc": "failed to parse result",
                        "has_output": false
                    }
                },
                "depends": [
                    "B"
                ]
            },
            {
                "id": "D",
                "fop": {
                    "cmd": "saveas/ZG9yYS1hc3luYy10ZXN0OnVwbG9hZF9vdXRwdXQubXA0/jsonQuery/eyJidWNrZXQiOiJ7ey5idWNrZXR9fSIsImtleV90ZW1wbGF0ZSI6Int7LmZuYW1lfX1fb3V0cHV0e3suZXh0fX0ifQ==",
                    "input_from": "C",
                    "result": {
                        "code": 0,
                        "desc": "successfully completed",
                        "has_output": true,
                        "kodo_file": {
                            "bucket": "dora-async-test",
                            "key": "upload_output.mp4",
                            "hash": "FuBWVXNCdqNQxgrtSkERZqLDz5Yp"
                        }
                    }
                },
                "depends": [
                    "C"
                ]
            },
            {
                "id": "E",
                "fop": {
                    "cmd": "avthumb/mp4",
                    "input_from": "__origin__",
                    "result": {
                        "code": 6,
                        "desc": "skipped",
                        "has_output": false
                    }
                },
                "depends": [
                    "B"
                ]
            },
            {
                "id": "F",
                "fop": {
                    "cmd": "saveas/YWJjZDp1cGxvYWRfb3V0XzIubXA0/jsonQuery/eyJidWNrZXQiOiJhYmNkIiwia2V5X3RlbXBsYXRlIjoie3suZm5hbWV9fV9vdXRfMnt7LmV4dH19In0=",
                    "input_from": "E",
                    "result": {
                        "code": 6,
                        "desc": "skipped",
                        "has_output": false
                    }
                },
                "depends": [
                    "E"
                ]
            }
        ],
        "created_at": 1607415851017
    }
    

    常见问题

    Q1:回调超时,重试几次?重试间隔多久?

    A:重试次数:13;重试间隔依次为:1s 2s 4s 8s 16s 32s …. 最大不超过3600s;重试条件: 回调超时或者客户回调服务器返回 5xx。

    Q2:没有收到回调该如何排查?

    A:首先需要在 【控制台 -> 工作流】,进入工作流详情页面,查看是否填写了回调地址。

    如果填写了回调地址,还是没有收到回调,则排查回调地址接收服务是否有问题。或者 提交工单 给我们。

    计费说明

    多媒体处理能力由智能多媒体服务进行计费,费用详情请参见 计费项

    以上内容是否对您有帮助?
  • Qvm free helper
    Close