如何用FFmpeg无重新编码按时间戳文件分割视频?是否需Python脚本?
按CSV指定时间分割MP4视频的两种方案
一、用Shell脚本配合FFmpeg批量处理
FFmpeg本身无法直接解析CSV文件完成自动批量分割,但可以通过Shell脚本读取CSV规则,循环调用FFmpeg实现批量切割,这是效率最高的方案:
- 确认
input.mp4和split.csv文件在同一目录下 - 创建名为
split_video.sh的脚本,内容如下:
#!/bin/bash # 跳过CSV表头,逐行读取分割参数 tail -n +2 split.csv | while IFS=';' read -r start end name; do # 移除文件名两端的引号 clean_name=$(echo "$name" | tr -d '"') # 调用FFmpeg执行分割 ffmpeg -i input.mp4 -ss "$start" -to "$end" -c copy "$clean_name" done
- 给脚本添加执行权限并运行:
chmod +x split_video.sh ./split_video.sh
FFmpeg参数说明
-ss "$start":设置片段起始时间,放在-i前会先定位到对应时间点再解码,处理速度更快-to "$end":设置片段结束时间,与-ss配合截取指定时间区间-c copy:直接复制音视频流,不重新编码,无质量损失且速度极快
二、用Python脚本实现
如果更熟悉Python生态,也可以编写脚本读取CSV规则,调用FFmpeg完成分割:
脚本示例
import csv import subprocess # 读取CSV中的分割规则 with open('split.csv', 'r', encoding='utf-8') as csv_file: # 按分号分隔,通过表头对应列名读取参数 reader = csv.DictReader(csv_file, delimiter=';') for line in reader: start_time = line['start'].strip() end_time = line['end'].strip() output_filename = line['name'].strip().strip('"') # 构造FFmpeg命令 ffmpeg_command = [ 'ffmpeg', '-i', 'input.mp4', '-ss', start_time, '-to', end_time, '-c', 'copy', output_filename, '-y' # 自动覆盖已存在的同名文件,可根据需求移除 ] # 执行命令并捕获结果 try: subprocess.run(ffmpeg_command, check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) print(f"片段生成成功:{output_filename}") except subprocess.CalledProcessError as e: print(f"片段{output_filename}生成失败:{e.stderr.decode('utf-8')}")
注意事项
- 确保FFmpeg已安装并添加到系统环境变量,能在终端直接调用
- 如果遇到关键帧导致的切割不精确问题,可以移除
-c copy,替换为重新编码参数(如-c:v libx264 -c:a aac),但会增加处理时间 - 脚本中
-y参数用于自动覆盖同名文件,不需要交互确认,不需要的话可以删除
内容的提问来源于stack exchange,提问作者Basj
相关产品推荐
相关产品推荐

