脚本如何批量转换视频帧格式

wen 实用脚本 21

本文目录导读:

脚本如何批量转换视频帧格式

  1. 使用 FFmpeg(最通用,跨平台)
  2. Python 脚本(更灵活,可处理复杂逻辑)
  3. 高级批量处理(带参数调整)
  4. 常见格式转换参数
  5. 批量处理脚本(带进度显示)
  6. 安装要求
  7. 注意事项

使用 FFmpeg(最通用,跨平台)

批量提取帧并转换格式(如 PNG→JPEG)

Windows (批处理):

@echo off
mkdir converted_frames
for %%f in (*.png) do (
    ffmpeg -i "%%f" -q:v 2 "converted_frames\%%~nf.jpg"
)

Linux/Mac (Bash):

#!/bin/bash
mkdir -p converted_frames
for f in *.png; do
    ffmpeg -i "$f" -q:v 2 "converted_frames/${f%.png}.jpg"
done

从视频批量提取帧并转换

提取所有帧为指定格式:

# 从 input.mp4 提取所有帧,每秒1帧,保存为 JPEG
ffmpeg -i input.mp4 -vf fps=1 frame_%04d.jpg
# 参数说明:
# fps=1    : 每秒提取1帧
# %04d     : 4位数字序号 (0001, 0002...)

Python 脚本(更灵活,可处理复杂逻辑)

import os
import subprocess
from pathlib import Path
def batch_convert_frames(input_dir, output_dir, input_ext='.png', output_ext='.jpg', quality=2):
    """
    批量转换帧格式
    """
    Path(output_dir).mkdir(parents=True, exist_ok=True)
    for file in Path(input_dir).glob(f'*{input_ext}'):
        output_file = Path(output_dir) / f"{file.stem}{output_ext}"
        # FFmpeg 命令
        cmd = [
            'ffmpeg',
            '-i', str(file),
            '-q:v', str(quality),  # 质量控制 (2-31, 越小质量越高)
            '-y',                   # 覆盖已存在文件
            str(output_file)
        ]
        try:
            subprocess.run(cmd, check=True, capture_output=True)
            print(f"Converted: {file.name} -> {output_file.name}")
        except subprocess.CalledProcessError as e:
            print(f"Error converting {file.name}: {e}")
# 使用示例
batch_convert_frames('input_frames', 'converted_frames', '.png', '.jpg')

高级批量处理(带参数调整)

批量转换并调整分辨率

#!/bin/bash
# convert_frames.sh
input_dir="./frames"
output_dir="./converted"
mkdir -p "$output_dir"
for f in "$input_dir"/*.png; do
    filename=$(basename "$f")
    name="${filename%.*}"
    ffmpeg -i "$f" \
        -vf "scale=1920:1080" \       # 调整分辨率
        -q:v 2 \                       # JPEG质量
        -pix_fmt yuv420p \           # 像素格式
        "$output_dir/${name}.jpg"
done

批量转换不同格式(自动识别)

import os
import subprocess
SUPPORTED_INPUT = {'.png', '.jpg', '.jpeg', '.bmp', '.tiff', '.webp'}
OUTPUT_FORMAT = '.png'  # 目标格式
def smart_convert(input_dir, output_dir):
    for file in os.listdir(input_dir):
        ext = os.path.splitext(file)[1].lower()
        if ext not in SUPPORTED_INPUT:
            continue
        input_path = os.path.join(input_dir, file)
        output_path = os.path.join(output_dir, f"{os.path.splitext(file)[0]}{OUTPUT_FORMAT}")
        subprocess.run([
            'ffmpeg', '-i', input_path,
            '-y', output_path
        ])
smart_convert('./input', './output')

常见格式转换参数

源格式 目标格式 额外参数
PNG JPEG -q:v 2 (2-31, 越小质量越高)
BMP PNG 无需额外参数
JPEG PNG 无需额外参数
WebP PNG 无需额外参数
TGA JPEG -q:v 2

批量处理脚本(带进度显示)

import os
import subprocess
from tqdm import tqdm
from concurrent.futures import ThreadPoolExecutor
def convert_single(args):
    input_file, output_file, format_args = args
    cmd = ['ffmpeg', '-i', input_file, '-y'] + format_args + [output_file]
    subprocess.run(cmd, capture_output=True)
    return os.path.basename(input_file)
def batch_convert_parallel(input_dir, output_dir, input_ext='.png', output_ext='.jpg', max_workers=4):
    os.makedirs(output_dir, exist_ok=True)
    files = [f for f in os.listdir(input_dir) if f.endswith(input_ext)]
    tasks = []
    for file in files:
        in_path = os.path.join(input_dir, file)
        out_path = os.path.join(output_dir, f"{os.path.splitext(file)[0]}{output_ext}")
        tasks.append((in_path, out_path, ['-q:v', '2']))
    with ThreadPoolExecutor(max_workers=max_workers) as executor:
        results = list(tqdm(executor.map(convert_single, tasks), total=len(tasks)))
    print(f"Converted {len(results)} files")
# 使用
batch_convert_parallel('frames', 'output', '.png', '.jpg')

安装要求

  • FFmpeg: 下载安装
  • Python 依赖: pip install tqdm (如使用并行版本)

注意事项

  1. 备份原始文件: 转换前建议备份
  2. 质量平衡: JPEG质量参数 -q:v 2 为最佳(2-5常用)
  3. 色彩空间: PNG到JPEG转换可能改变色彩空间
  4. 大文件处理: 考虑使用并行处理提高效率

选择适合你操作系统和需求的脚本即可,FFmpeg 是最推荐的工具,功能强大且跨平台。

抱歉,评论功能暂时关闭!