视频分辨率调整
输入列名 | 说明 |
|---|---|
video_paths | 视频文件路径列(本地、TOS、HTTP等),与video_binaries二选一 |
video_binaries | 视频二进制数据列,与video_paths二选一 |
video_formats | 视频格式字符串列,配合video_binaries使用 |
output_basenames | 输出文件基础名称列(不含扩展名) |
调整后的视频路径列
如参数没有默认值,则为必填参数
参数名称 | 类型 | 默认值 | 描述 |
|---|---|---|---|
output_tos_dir | str | 将分辨率调整后的视频保存到该TOS目录中,如果为空则不保存。 格式:"tos://bucket/path/" 默认值:"" | |
min_width | int | 1280 | 视频最小宽度,小于该值时将被调整。 单位:像素 默认值:1280 |
max_width | int | 2560 | 视频最大宽度,大于该值时将被调整。 单位:像素 默认值:2560 |
min_height | int | 1280 | 视频最小高度,小于该值时将被调整。 单位:像素 默认值:1280 |
max_height | int | 2560 | 视频最大高度,大于该值时将被调整。 单位:像素 默认值:2560 |
force_original_aspect_ratio_type | str | disable | 宽高比保持策略。 disable: 不强制保持原始宽高比,可能会拉伸变形 increase: 保持宽高比,调整到大于等于目标尺寸 decrease: 保持宽高比,调整到小于等于目标尺寸 可选值:["disable", "increase", "decrease"] 默认值:"disable" |
force_divisible_by | int | 2 | 像素对齐步长,确保宽高能被该值整除。 默认值:2 |
crf | float | 23.0 | libx264编码器的恒定质量因子。 适用:仅在CPU编码(libx264)时使用 范围:0.0-51.0,数值越小质量越高文件越大 推荐:18(高质量) 23(平衡) 28(压缩优先) 默认值:23.0 |
preset | str | medium | libx264编码器的编码速度预设。 适用:仅在CPU编码(libx264)时使用 权衡:速度 ↔ 压缩效率 可选值:["ultrafast", "superfast", "veryfast", "faster", "fast", "medium", "slow", "slower", "veryslow"] 推荐:"medium"(平衡) "fast"(速度优先) "slow"(质量优先) 默认值:"medium" |
cq | float | 0 | NVENC编码器的质量控制参数。 适用:仅在GPU编码(h264_nvenc)时使用 范围:0-51,0表示自动质量控制 推荐:0(自动) 或 18-28(手动控制) 默认值:0 |
rc | str | vbr | NVENC编码器的码率控制模式。 适用:仅在GPU编码(h264_nvenc)时使用 constqp: 恒定量化参数,质量稳定 vbr: 变码率,平衡质量和文件大小 cbr: 恒定码率,适合流媒体传输 推荐:"vbr"(通用) "cbr"(直播) 默认值:"vbr" |
rank | int or None | 指定使用的GPU设备编号(多卡环境有效)。 说明:0表示第一张GPU,1表示第二张GPU,None表示自动选择 适用:仅在GPU编码时有效 默认值:None |
下面的代码展示了如何使用 Daft(适用于分布式)运行算子对视频进行智能分辨率调整。
from __future__ import annotations import os import daft from daft import col from daft.las.functions.udf import las_udf from daft.las.functions.video import VideoResizeResolution if __name__ == "__main__": # 更改完分辨率的视频会保存到指定的TOS路径下,因此,需要设置好环境变量以保证有权限写入TOS,包括:ACCESS_KEY,SECRET_KEY,TOS_ENDPOINT,TOS_REGION,TOS_TEST_DIR TOS_DIR = os.getenv("TOS_TEST_DIR", "tos_bucket") output_tos_dir = f"tos://{TOS_DIR}/video/video_resize_resolution" if os.getenv("DAFT_RUNNER", "native") == "ray": import logging import ray def configure_logging(): logging.basicConfig( level=logging.INFO, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s", datefmt="%Y-%m-%d %H:%M:%S.%s".format(), ) logging.getLogger("tracing.span").setLevel(logging.WARNING) logging.getLogger("daft_io.stats").setLevel(logging.WARNING) logging.getLogger("DaftStatisticsManager").setLevel(logging.WARNING) logging.getLogger("DaftFlotillaScheduler").setLevel(logging.WARNING) logging.getLogger("DaftFlotillaDispatcher").setLevel(logging.WARNING) ray.init(dashboard_host="0.0.0.0", runtime_env={"worker_process_setup_hook": configure_logging}) daft.context.set_runner_ray() daft.set_execution_config(actor_udf_ready_timeout=600) daft.set_execution_config(min_cpu_per_task=0) tos_dir_url = os.getenv("TOS_DIR_URL", "las-cn-beijing-public-online.tos-cn-beijing.volces.com") samples = { "video_path": [ f"https://{tos_dir_url}/public/shared_video_dataset/eating_56.mp4" ] } ds = daft.from_pydict(samples) constructor_kwargs = { "output_tos_dir": output_tos_dir, "min_width": 1280, "max_width": 2560, "min_height": 720, "max_height": 1440, "force_original_aspect_ratio_type": "decrease", "rank": None, } ds = ds.with_column( "resized_video_path", las_udf(VideoResizeResolution, construct_args=constructor_kwargs, num_gpus=1, batch_size=1, concurrency=1)( col("video_path") ), ) ds.show() # ╭────────────────────────────────┬──────────────────────────────────╮ # │ video_path ┆ resized_video_path │ # │ --- ┆ --- │ # │ Utf8 ┆ Utf8 │ # ╞════════════════════════════════╪══════════════════════════════════╡ # │ https://las-cn-beijing-publi-… ┆ tos://tos_bucket/video_resize… │ # ╰────────────────────────────────┴──────────────────────────────────╯