You need to enable JavaScript to run this app.
文档中心
AI 数据湖服务

AI 数据湖服务

复制全文
上手实践
上手实践:视频数据入湖与处理
复制全文
上手实践:视频数据入湖与处理

实践目标

遵循本文所述步骤,您可完整体验从视频数据入湖、视频数据集处理,到文搜图 / 图搜图的全流程端到端实践。通过该过程,您可以掌握以下技能:

  • 能够更清晰地理解基于 LAS 的视频处理场景核心逻辑,熟练掌握技术实现细节与操作步骤,并进一步拓展在实际客户业务场景中的需求拆解能力与解决方案设计思路。
  • 能够了解 LAS(Lakehouse Analytics Service,湖仓一体分析服务)的数据处理算子——在线算子、离线算子的调用流程。
  • 能够了解 LAS 核心功能模块使用基本流程,包括:数据集(创建数据集、读写数据)、队列资源、开发机。

相关知识

视觉大模型可理解视频中的视觉信息,完成如描述其中的物体、分析动作逻辑等视觉相关任务,可用于自动化视频内容审核、智能监控分析等,大幅节省人工成本,适用于智能安防、体育赛事分析、媒体内容管理等领域。
常见的基于 VLM 的业务系统构建思路如下。
Image
可将音视频内容可存储在火山引擎 TOS;通过 LAS 将音视频数据入湖(转为 Lance 格式数据)后,调用 LAS 数据处理算子对音视频数据进行处理,并对音视频内容进行内容理解/向量化,便于后续对音视频内容进行消费。

准备工作

准备实验数据

本次实践通过对视频文件进行关键内容抽帧作为示例,为您介绍视频数据入湖与处理的操作流程,您可准备一个 MP4, AVI, MOV 等常见视频格式的测试视频文件,跟随本实践操作步骤一步步完成操作。

开通并配置相关产品

TOS

您需要开通好火山引擎对象存储 TOS,并创建好 TOS bucket 用于本次实验过程中存储测试的视频数据。

准备工作

操作要点

参考文档

配置示例

创建 Bucket

  • 本次实践操作均使用 华北2(北京)地域 的资源,因此,您在创建 Bucket 时:
    • 需创建北京地域的 Bucket。
    • 其他参数保持默认配置即可。

创建存储桶

Bucket名:las-doctest
Image

访问控制(IAM)

您需要登录进去访问控制(IAM)控制台,准备一个用于后续使用 API 方式访问 TOS 、LAS 的 AK和SK。

准备工作

操作要点

参考文档

配置示例

获取AK、SK

为了确保访问 TOS/LAS 服务的安全性,您必须提供有效的访问密钥 (AK/SK),用于后续的鉴权。

  • 主账号的访问秘钥权限很大,您可以在访问控制(IAM)页面创建一个有TOS、LAS操作权限的子账号,并为子账号开通访问秘钥,后续即可使用子账号的访问秘钥。
  • 访问秘钥信息较为敏感,泄露可能会导致数据不安全,因此,建议在后续的开发环境中,将 AK、SK信息配置为环境变量。

查看 AKSK 信息

Image

LAS

您需要开通好 LAS 服务,并创建好用于本次实验的队列资源和开发机环境。

准备工作

操作要点

参考文档

配置示例

队列资源

  • 如果您已创建了 LAS 队列资源,可使用已有的队列资源。
  • 如果您此前没有创建过队列资源,您需要创建一个队列资源。创建实践的队列资源时:
    • 建议使用 华北2(北京)地域 的资源。
    • 进行实验实践时可选择最小CPU规格的资源,无需开通 GPU 资源。
    • 其他参数可保持默认。

队列管理

参见操作要点

LAS API Key

您调用 LAS 在线算子之前,您需要先生成 API Key 用于算子调用的鉴权。

  • 如果您已有 LAS API Key,可使用已创建的 LAS API Key,否则您需要创建一个 LAS API Key。
  • 因为 API Key 信息较为敏感,泄露 API Key 会导致您的模型用量被其他人花费,造成一定的损失,因此获取 API Key 后建议在后续的开发环境中,将 API Key 配置为环境变量的,方便您合理安全地使用API Key。

注意

LAS 的为您提供了离线和在线两类数据处理算子,仅在线算子需使用 LAS API Key 鉴权。

  • 在线算子为直接调用 算子API 的方式进行调用。
  • 离线算子使用 Daft 引擎进行算子调用,LAS 为您提供了 VeDaft 引擎,集成了离线算子调用的 SDK,可更高效地进行批量数据处理任务调度运行。

获取 API Key 并配置

参见操作要点

开发机

您调用 LAS 离线算子之前,您需要先准备好离线算子的调用开发环境。

  • LAS 为您提供了预置了veDaft引擎等开发环境镜像的开发机,您可直接创建 LAS 开发机,创建后即可远程登录开发机,进行离线算子的数据处理任务开发调试。创建开发机时:
    • 队列:选择上述准备好的队列资源即可。
    • 镜像:建议选择 内置镜像 > ve-daft的最新版本的镜像。本示例使用的版本为:0.7.2.post4-py3.11-ubuntu24.04
    • 创建开发机时,建议将上述TOS AK/SK、Endpoint、Region、LAS API Key同步配置为环境变量。如果创建开发机时没有配置,也可以后续登录开发机后再配置。
    • SSH 公钥可使用ssh-keygen -t rsa命令在本地生成后,配置到开发机后,即可便捷的在开发机页面直接获取远程登录指令。
    • 其他参数保持默认值即可。
  • 如果您希望在您自己的环境中开发调试离线算子,您需要先在环境中部署好 Daft 引擎,详情请参见:快速上手

Image

实践步骤

step1:创建视频数据集

注意

本实践步骤的主要目的是将视频上传至TOS Bucket中,并在 LAS 创建一个视频数据集,后续即可直接在 LAS 的视频数据集对视频进行预览、数据处理等操作。

上传视频至 TOS Bucket

登录至 TOS 产品控制台后,将待处理的视频上传至TOS Bucket中。

操作步骤

操作要点

参考文档

配置示例

上传视频

在准备好的 TOS Bucket 中上传待处理的视频。您可根据需要创建文件夹,将视频上传至文件夹中。
Image
上传完成后,您可单击“复制路径”,将当前视频数据所在的TOS 路径记录下来。

上传文件

TOS 路径为:tos://las-doctest/video

创建视频数据集

登录 LAS 控制台,单击左侧导航栏的 数据集 > 通用数据集,进入数据集页面后单击“创建数据集”。参考以下配置要点,配置数据集参数,完成后单击“创建”,完成视频数据集创建。

操作步骤

操作要点

参考文档

配置示例

创建视频数据集

Image

  • 数据集名称:自定义数据集名称。
  • 数据来源:选择 TOS,并设置 TOS 路径为上述步骤中上传待处理视频的 TOS 路径。
  • 数据集格式:选择“Video”。

创建数据集

  • 数据集名称:las_dataset_video。
  • 数据来源的 TOS 路径:tos://las-doctest/video

预览视频数据

数据集创建完成后,您可在数据集详情页面查看数据集基本信息,对于视频数据集,支持预览前十条视频。
Image

步骤总结/拓展知识

  • 数据集常用操作:
    • LAS 数据集创建完成后,支持对数据集进行权限管控,将数据集授权给同主账号下的其他子用户使用。
    • 也支持将数据集进行跨主账号分享,分享后,对应主账号或子账号即可拥有授予的数据集操作权限,详情请参见数据集共享
  • 至此,虽然我们有了视频数据集,但和存放TOS区别不大。如何体现数据集优势,可以更好,更快,更智能的消费视频数据,才是我们的目标,您可继续参考下文,进行视频数据入湖、数据处理等操作。

step2:视频数据入湖

注意

本实践步骤的主要目的是将视频数据集转为 Lance 数据集,实现视频数据入湖,便于后续对视频数据进行视频抽帧等数据处理操作。

创建 Lance 数据集的 TOS 路径

您需要先登录 TOS 控制台,准备好一个用于存储转换后 Lance 数据集数据的 TOS 路径。本示例的 Lance 数据集的 TOS 路径为:tos://las-doctest/video2lance/

配置环境变量

此步骤的操作主要在开发机中使用VeDaft调用SDK对数据集进行读写等操作,过程中涉及TOS Bucket的访问等,建议将一些鉴权参数、固定的路径参数配置为开发环境的环境变量,便于后续实际执行代码中引用。

  1. 您可参考下文准备好环境变量的配置。

    # 地域设置,本示例使用华北2-北京地域
    export REGION="cn-beijing"
    
    # 鉴权AK相关环境变量
    # 访问TOS、LAS的认证sk、ak
    export LAS_TOS_SECRET_KEY="<your_sk>"
    export LAS_TOS_ACCESS_KEY="<your_ak>"
    
    # TOS 访问相关环境变量
    # TOS的访问端点
    export LAS_TOS_ENDPOINT="https://tos-cn-beijing.ivolces.com"
    # TOS端点(用于TOSConfig)
    export TOS_ENDPOINT="https://tos-cn-beijing.ivolces.com"
    
  2. 在开发机环境中执行 source env.sh 命令,使环境变量生效。

视频数据集转 Lance 数据集

  1. 在开发机中运行以下Python脚本,创建一个新的 Lance 数据集,并将视频数据转为Lance 数据集的 Lance 格式写入新的 Lance 数据集,核心示例代码如下。
    # 请在 LAS 开发机中执行以下代码
    import os
    
    """
    转为 Lance 数据集
    """
    import daft
    from daft.io import CreateLasDatasetOptions, IOConfig, LanceWriteOptions
    from daft.las.io import TOSConfig
    
    # 您可以自定义您新数据集的路径
    dataset_name = "las_dataset_video"
    lance_tos_dir = f"tos://las-doctest/video2lance/{dataset_name}.lance"
    LANCE_DATASET_FORMAT = "lance"
    
    # 创建相关的配置
    io_config = IOConfig(s3=TOSConfig.from_env().to_s3_config())
    write_options = LanceWriteOptions(io_config=io_config, uri=lance_tos_dir)
    create_ds_options = CreateLasDatasetOptions(
        nick_name="daft_test_lance_write",
        privacy="public",
        description="This is my dataset",
    )
    
    # 读取原始数据
    df = daft.read_las_dataset(name=dataset_name)
    
    # 在这里进行创建
    new_dataset_name = dataset_name + "_lance"
    df.write_las_dataset(
        name=new_dataset_name,
        format=LANCE_DATASET_FORMAT,
        write_options=write_options,
        create_ds_options=create_ds_options,
    )
    
    # 读取转换后的新数据集
    df = daft.read_las_dataset(name=new_dataset_name)
    print("\n\nnew dataset:")
    df.show()
    

您需要修改以下参数。

  • dataset_name:设置为视频数据集名称,本示例为las_dataset_video
  • lance_tos_dir:设置上述步骤中准备好的转换后的新Lance数据集的TOS路径。

其他参数可保持示例值即可。

  1. 脚本执行完成后,页面会回显读取转换后的新Lance数据集详情,输出示例如下。
new dataset:
╭────────────────────────────────┬───────────┬──────────╮
│ video                          ┆ size      ┆ num_rows │
│ ---                            ┆ ---       ┆ ---      │
│ String                         ┆ Int64     ┆ Int64    │
╞════════════════════════════════╪═══════════╪══════════╡
│ s3://las-doctest/video/LAS AI… ┆ 225602609 ┆ None     │
╰────────────────────────────────┴───────────┴──────────╯

转换后的 Lance 数据集包含“video”、“size”、“num_rows”字段。其中:

  • video字段:为当前 Lance 数据集中每个视频数据所在的 TOS 路径(s3格式)。
  • size字段:为每个视频的大小。

回显中如果出现ERROR提示,但是正常返回了数据集数据,可忽略ERROR提示。

查看 Lance 数据集

完成转 Lance 数据集的操作后,您可登录 LAS 控制台,在数据集列表页面查看新创建的Lance数据集。
Image

步骤总结/拓展知识

  • 注册元数据:与上述步骤类似,转为 Lance 数据集后,您可以对数据集进行权限管控;除此之外,您还可以将此数据集注册至 LAS 的元数据(Catalog)中,后续您即可在 LAS Catalog 中查看到数据集的元数据详情,当数据集有字段变更时,Catalog 中的数据集元数据也会实时自动刷新。

step3:视频数据初步处理

注意

本实践步骤的主要目的是对视频进行简单处理,将视频二进制数据也写入入湖后的 Lance 数据集中,便于后续在 Lance 数据集中直接预览视频内容,以及为后续对视频数据进行视频内容理解、向量化等数据处理操作做准备。
本实践步骤的主要目的是调用 LAS 的数据处理算子,对视频进行数据增值处理:

  • 调用视频关键帧抽取算子:通过大模型对视频进行内容理解,将理解后的内容写入 Lance 数据集,便于后续消费视频数据(例如文搜图)的应用场景使用。

调用多模态向量化算子:二通过大模型将视频进行向量化,将向量化的结果写入 Lance 数据集,便于后续进消费视频数据(例如图搜图)的应用场景使用。

配置环境变量

  1. 您可参考下文准备好环境变量的配置。
# 地域设置,本示例使用华北2-北京地域
export REGION="cn-beijing"

# 鉴权AK相关环境变量
# 访问TOS、LAS的认证sk、ak
export LAS_TOS_SECRET_KEY="<your_sk>"
export LAS_TOS_ACCESS_KEY="<your_ak>"

# TOS 访问相关环境变量
# TOS的访问端点
export LAS_TOS_ENDPOINT="https://tos-cn-beijing.ivolces.com"
# TOS端点(用于TOSConfig)
export TOS_ENDPOINT="https://tos-cn-beijing.ivolces.com"

# DAFT执行器类型,设置为本地模式
export DAFT_RUNNER="native" 

本步骤新增了:

  • DAFT_RUNNER:设置处理视频数据算子的Daft执行器为本地模式。
  1. 在开发机环境中执行 source env.sh 命令,使环境变量生效。

视频数据处理:视频关键帧抽取算子

以下使用视频关键帧抽取作为示例,如何处理视频。处理时,会新建一个 Lance 数据集,并将原始视频所在的TOS路径、视频抽帧后的二进制结果/TOS路径等关键参数写入新建的 Lance 数据集中。

在开发机中执行以下脚本。

# 从未来版本导入特性,确保兼容性
from __future__ import annotations

# 导入必要的库
import base64  # 用于Base64编码和解码
import hashlib  # 用于生成SHA256哈希
import os  # 用于操作系统交互,如环境变量获取

import pyarrow as pa  # 用于处理列式数据

import daft  # 导入daft数据处理框架
from daft import DataType, col  # 导入数据类型和列操作工具
from daft.io import (
    CreateLasDatasetOptions,  # 用于创建LAS数据集的配置选项
    IOConfig,  # IO配置类
    LanceWriteOptions,  # Lance格式写入选项
)
from daft.io.object_store_options import io_config_to_storage_options  # 转换IO配置为存储选项
from daft.daft import IOConfig  # 再次导入IOConfig(可能是为了确保正确性)
from daft.las.functions.udf import las_udf  # 导入LAS用户定义函数装饰器
from daft.las.functions.video import VideoKeyframes  # 导入视频关键帧处理函数
from daft.las.io.tos import TOSConfig  # 导入TOS存储配置


# 设置视频源文件所在的TOS路径
TOS_TEST_DIR = "tos://las-doctest/video/LAS AI Product Introduction.mp4"
# 设置视频抽帧后的结果图片存储的TOS路径
TOS_TEST_OUTPUT_DIR = "tos://las-doctest/video/result/"

# 将视频抽帧结果创建为一个新的Lance数据集,以下参数用于配置新的Lance数据集参数
# 自定义新的Lance数据集名称
DATASET_NAME = "las_dataset_video_lance_kf"
# 设置新的Lance数据集的TOS路径
TOS_TEST_LANCE_DIR = "tos://las-doctest/video2lance/las_dataset_video_kf.lance"
# 抽帧后,写入Lance数据集中,自定义的视频路径列名
VIDEO_COLUMN = os.getenv("VIDEO_COLUMN", "video")
# 抽帧后,写入Lance数据集中,自定义的视频关键帧列名
VIDEO_KEYFRAMES_COLUMN = os.getenv("VIDEO_KEYFRAMES_COLUMN", "video_keyframes")
# 抽帧后,写入Lance数据集中,自定义的视频关键帧所在TOS路径列名
VIDEO_KEYFRAMES_TOS_COLUMN = os.getenv("VIDEO_KEYFRAMES_TOS_COLUMN", "video_keyframes_tos")


# 如果DAFT执行器是ray,则初始化ray
if os.environ['DAFT_RUNNER'] == 'ray':
    import ray  # 导入ray分布式计算框架


    ray.init(address='auto')  # 自动连接到ray集群


# 定义DAFT UDF:将Base64字符串转换为二进制数据
# ✅ 新写法:@daft.func 替代 @daft.udf(无状态函数)
@daft.func
def base64_to_binary(base64_str: DataType.string()) -> DataType.binary():
    import base64 as b64
    return b64.b64decode(base64_str)


# 定义DAFT UDF:生成SHA256哈希值
@daft.func
def generate_sha256_hash(s: DataType.string()) -> DataType.string():
    import hashlib
    return hashlib.sha256(str(s).encode()).hexdigest()


# 主函数入口
if __name__ == "__main__":
    # 从环境变量配置创建IO配置(适配TOS存储)
    io_config = IOConfig(s3=TOSConfig.from_env().to_s3_config())


    # 创建包含视频路径的样本数据
    samples = {VIDEO_COLUMN: [f"{TOS_TEST_DIR}"]}
    # 从字典创建daft数据集
    ds = daft.from_pydict(samples)
    
    # 创建视频关键帧提取器UDF
    extractor = las_udf(
        VideoKeyframes,  # 使用视频关键帧提取函数
        construct_args={
            "method": "I_frame",  # 提取方法:I帧
            "keyframes_cnt": 50,  # 提取的关键帧数量
            "output_tos_dir": f"{TOS_TEST_OUTPUT_DIR}",  # 输出到TOS的目录
        },
    )
    
    # 应用提取器,添加关键帧列到数据集
    ds = ds.with_column(VIDEO_KEYFRAMES_COLUMN, extractor(col(VIDEO_COLUMN)))


    # 从关键帧结果中提取TOS路径列
    ds = ds.with_column(VIDEO_KEYFRAMES_TOS_COLUMN, col(VIDEO_KEYFRAMES_COLUMN)["tos_paths"])


    # 从关键帧结果中提取base64编码的图像数据
    ds = ds.with_column(VIDEO_KEYFRAMES_COLUMN, col(VIDEO_KEYFRAMES_COLUMN)["base64"])
    # 对关键帧数据和对应的TOS路径进行展开(一行变多行)
    ds = ds.explode(col(VIDEO_KEYFRAMES_COLUMN), col(VIDEO_KEYFRAMES_TOS_COLUMN))
    # 将base64编码的图像数据转换为二进制
    ds = ds.with_column(VIDEO_KEYFRAMES_COLUMN, base64_to_binary(col(VIDEO_KEYFRAMES_COLUMN)))
    # 基于TOS路径生成数据项ID(SHA256哈希)
    ds = ds.with_column("__data_item_id", generate_sha256_hash(col(VIDEO_KEYFRAMES_TOS_COLUMN)))


    # 设置数据存储格式为lance
    format = "lance"
    # 配置Lance写入选项
    write_options = LanceWriteOptions(uri=TOS_TEST_LANCE_DIR, io_config=io_config)
    # 打印IO配置(用于调试)
    print(io_config)
    
    # 配置创建LAS数据集的选项
    create_ds_options = CreateLasDatasetOptions(
        nick_name=DATASET_NAME,  # 数据集昵称
        privacy="public",  # 隐私设置:公开
        description="This is test dataset"  # 数据集描述
    )
    
    # 将数据集写入LAS
    ds.write_las_dataset(
        name=DATASET_NAME,  # 数据集名称
        format=format,  # 存储格式
        write_options=write_options,  # 写入选项
        create_ds_options=create_ds_options,  # 创建数据集选项
    )
    
# 读取数据集
df = daft.read_las_dataset(name=DATASET_NAME)
df.show()    

您需要根据实际情况修改一些参数:

  • TOS_TEST_DIR:设置为需要处理的视频文件所在的TOS路径。
  • TOS_TEST_OUTPUT_DIR:设置为视频抽帧后,抽帧图片所在的TOS路径。
  • DATASET_NAME:设置为新建的视频抽帧结果的 Lance 数据集名称。
  • TOS_TEST_LANCE_DIR:新增的 Lance 数据集的 TOS 路径。
  • VIDEO_COLUMN/VIDEO_KEYFRAMES_COLUMN/VIDEO_KEYFRAMES_TOS_COLUMN:视频抽帧处理完成后,写入 Lance 数据的原始视频TOS路径/视频关键帧/视频关键帧所在TOS路径的列名。

您还可按需修改调用视频关键帧抽取算子的算子相关参数:

  • method:抽帧方法,本示例设置为I_frame。
  • keyframes_cnt:提取的关键帧数量,本示例设置为 50,提取50 张关键帧图片。

查看视频数据处理结果

在 LAS 的数据集中可以看到创建的视频抽帧结果数据集,点击“数据详情”可以查看到已经抽帧的视频结果图片以 Lance 格式存储在湖中。
Image

最近更新时间:2026.03.16 15:01:02
这个页面对您有帮助吗?
有用
有用
无用
无用