更新时间:2023-10-30 GMT+08:00
分享

实施步骤

前提条件

  1. 创建依赖包。

    1. 登录FunctionGraph控制台,在依赖包管理页面点击“创建依赖包”

    2. 填写相关参数,完成依赖包创建。

  2. 在“函数列表”页面单击“创建函数”完成函数创建。

    其中委托需要创建能够授权工作流FunctionGraph访问OBS的权限,创建方式参考创建委托

  3. 函数创建成功后进入函数详情页添加依赖包。

    1. 在“代码依赖包”模块点击“添加依赖包”。

    2. 选择私有依赖包,添加步骤1中创建好的依赖包

  4. 依赖添加成功后,在FunctionGraph控制台添加算子代码并保存部署。参考示例如下:

    # -*- coding:utf-8 -*-
    import json
    # 引入模块
    from obs import ObsClient
    import os
    import time
    import urllib.parse
     
     
    def handler(event, context):
        print(context)
        print(event)
        obsClient = ObsClient(
            access_key_id=context.getAccessKey(),
            secret_access_key=context.getSecretKey(),
            server='https://obs.cn-north-4.myhuaweicloud.com' #OBS的endpoint,不同region的OBS Endpoint不同
        )
        bucketName = event['Records'][0]['obs']['bucket']['name']
        objectKey = urllib.parse.unquote(event['Records'][0]['obs']['object']['key'])  # a/b/c
        frame = event["dynamic_source"]["f"] #截取的秒数
        height = event["dynamic_source"]["h"]
        width = event["dynamic_source"]["w"]
        # 使用访问OBS
        start = time.time()
        resp = obsClient.getObject(bucketName, objectKey, "/tmp/" + objectKey)
        end = time.time() - start
        # print(resp)
        print("download test.jpg run :" + str(end - start))
        start = time.time()
        cmd = "/opt/function/code/ffmpeg -i /tmp/" + objectKey + " -ss {f} -vframes 1 -vf scale={w}:{h} -y /tmp/{f}.jpg".format(
            f=frame, w=width, h=height)
        print(cmd)
        os.system(cmd)
        dsObjectKey = "{}.jpg".format(frame)
        start = time.time()
        out_obj = "output/{obj}/{file}".format(obj=objectKey, file=dsObjectKey)
        resp = obsClient.putFile(bucketName, out_obj,
                                 "/tmp/" + dsObjectKey)
        end = time.time() - start
        print(" upload run :" + str(end - start))
        # 关闭obsClient
        obsClient.close()
        tasks = [
            {
                "output": {
                    "bucket": bucketName,
                    "object": out_obj,
                    "location": "cn-north-4"
                }
            }
        ]
        event["dynamic_source"] = {
            "tasks": tasks
        }
        return event

  5. 函数保存成功后,进入到数工坊DWR控制台工作流界面,点击“创建工作流”

  6. 在工作流编排界面选择自定义算子并完成连线。其中基本属性部分的函数唯一标识选择步骤4创建好的自定义函数。

    加入动态参数f(截图秒数frame),h(输出图片高度height),w(输出图片宽度width)。

  7. 点击保存工作流。可选择同步并支持匿名访问

  8. 保存成功后通过url方式触发工作流。其中可以指定参数f(截图秒数frame),h(输出图片高度)获得截帧结果。

    https://test-workflow-bj4.obs.cn-north-4.myhuaweicloud.com/VCG42N1291956568.mp4?x-workflow-graph-name=vframe/f_0,h_100

相关文档