视频帧采样
更新时间:2026-05-18
视频帧采样
简介
视频帧采样算子,基于 OpenCV 实现,支持多种采样模式从视频中提取帧。
功能描述
从视频中按指定规则采样帧,支持多种采样模式:等间隔采样、按帧数均匀采样、按 FPS 采样、按时间戳采样、按帧间隔采样。可选输出帧数据、Base64 编码或上传到 BOS 存储。
算子参数
输入
| 输入 | 含义 |
|---|---|
| video_paths | 视频文件路径列表 |
| video_binaries | 视频二进制数据列表 |
| video_formats | 视频格式列表 |
| video_durations | 视频时长列表 |
输出
| 输出 | 含义 |
|---|---|
| frames | 帧数据(四维数组) |
| base64 | Base64 编码的帧图片 |
| timestamps | 帧对应的时间戳(秒) |
| frame_indices | 帧索引列表 |
| bos_paths | BOS 存储路径 |
参数
| 参数名称 | 类型 | 默认值 | 描述 |
|---|---|---|---|
| sample_mode | str | "by_count_uniform" | 采样模式 |
| start_time_sec | float | 0.0 | 起始时间(秒) |
| end_time_sec | float | None | 结束时间(秒) |
| count_k | int | None | 采样帧数(by_count_uniform模式) |
| interval_sec | float | None | 采样间隔(秒,by_interval_time模式) |
| interval_frames | int | None | 帧间隔(by_interval_frames模式) |
| target_fps | float | None | 目标帧率(by_fps模式) |
| timestamps_sec | list[float] | None | 指定时间戳列表(by_timestamps模式) |
| img_type | str | ".jpg" | 输出图片格式 |
| output_bos_dir | str | "" | BOS 输出目录 |
| max_frames | int | None | 最大采样帧数 |
| seed | int | 42 | 随机种子 |
| output_frames | bool | True | 是否输出帧数据 |
| output_base64 | bool | True | 是否输出 Base64 编码 |
采样模式
| 模式 | 说明 |
|---|---|
| by_count_uniform | 等间隔均匀采样指定帧数 |
| by_interval_time | 按时间间隔采样 |
| by_interval_frames | 按帧间隔采样 |
| by_fps | 按指定 FPS 采样 |
| by_timestamps | 按指定时间戳采样 |
调用示例
Plain Text
1from __future__ import annotations
2
3import os
4
5import daft
6from daft import col
7
8from daft.aihc.common.udf import aihc_udf
9from daft.aihc.functions.video.video_frame_sampler import VideoFrameSampler
10
11if __name__ == "__main__":
12 if os.getenv("DAFT_RUNNER", "native") == "ray":
13 import ray
14 ray.init(dashboard_host="0.0.0.0", ignore_reinit_error=True)
15 daft.set_runner_ray()
16 daft.set_execution_config(actor_udf_ready_timeout=6000, min_cpu_per_task=0)
17
18 samples = {
19 "video_path": ["/tmp/test_video.mp4", "/tmp/test_video2.mp4"]
20 }
21 ds = daft.from_pydict(samples)
22
23 constructor_kwargs = {
24 "sample_mode": "by_count_uniform",
25 "count_k": 10,
26 "output_base64": True,
27 }
28 ds = ds.with_column(
29 "frames",
30 aihc_udf(
31 VideoFrameSampler,
32 construct_args=constructor_kwargs,
33 num_cpus=1,
34 concurrency=4,
35 )(col("video_path"), None, None, None),
36 )
37 ds.show()
评价此篇文章
