如何基于包含文件路径、起止时间的数据框使用ffmpeg批量生成视频片段
使用pandas配合ffmpeg批量裁剪视频片段
需求背景
现有记录了视频路径、行为标识、时间戳的结构化数据框,需要遍历每一行数据,调用ffmpeg裁剪出对应时间范围的视频片段。
数据框样例结构
Time File_path Behavior Status experiment_id Start_time Stop_time Duration 130 314.287 H:/My Drive/Katz-Lab_Otter-Data/Projects/Forag... Scrunch POINT K8_feed_111120_05 312.787 315.787 3.0 145 784.158 H:/My Drive/Katz-Lab_Otter-Data/Projects/Forag... Scrunch POINT K8_feed_111120_05 782.658 785.658 3.0 140 708.906 H:/My Drive/Katz-Lab_Otter-Data/Projects/Forag... Scrunch POINT K8_feed_111120_05 707.406 710.406 3.0 33 507.600 H:/My Drive/Katz-Lab_Otter-Data/Projects/Forag... Scrunch POINT K8_feed_111120_02 506.100 509.100 3.0 75 112.690 H:/My Drive/Katz-Lab_Otter-Data/Projects/Forag... Scrunch POINT K8_feed_111120_03 111.190 114.190 3.0 133 344.057 H:/My Drive/Katz-Lab_Otter-Data/Projects/Forag... Scrunch POINT K8_feed_111120_05 342.557 345.557 3.0 26 366.215 H:/My Drive/Katz-Lab_Otter-Data/Projects/Forag... Scrunch POINT K8_feed_111120_02 364.715 367.715 3.0 70 84.448 H:/My Drive/Katz-Lab_Otter-Data/Projects/Forag... Scrunch POINT K8_feed_111120_03 82.948 85.948 3.0 113 738.897 H:/My Drive/Katz-Lab_Otter-Data/Projects/Forag... Scrunch POINT K8_feed_111120_03 737.397 740.397 3.0 128 200.548 H:/My Drive/Katz-Lab_Otter-Data/Projects/Forag... Scrunch POINT K8_feed_111120_05 199.048 202.048 3.0
具体要求
- 输入:每行
File_path字段对应的原始视频文件 - 裁剪规则:按当前行的
Start_time作为起始时间,Duration作为片段时长裁剪 - 输出规则:文件保存到
output_path变量指定的目录,文件名包含experiment_id、Behavior、当前行号三个信息
可直接运行的实现代码
import subprocess import pandas as pd # 请先自行给output_path赋值为你要保存输出文件的目录路径 # sampled_data为你的原始数据框变量 # 遍历数据框的每一行 for row in sampled_data.index: # 拼接输出文件完整路径 output_file = ("%(path)s\%(experiment_id)s_%(behavior)s_%(index)s.MP4" % {"path" : output_path, "experiment_id" : sampled_data["experiment_id"][row], "behavior" : sampled_data["Behavior"][row], "index" : row}) # 调用ffmpeg执行裁剪 subprocess.check_call([ 'ffmpeg', '-ss', str(sampled_data["Start_time"][row]), '-i', str(sampled_data["File_path"][row]), '-t', str(sampled_data["Duration"][row]), '-c', 'copy', output_file])
实用优化建议
如果需要更高的稳定性和兼容性,可以做如下调整:
- 路径拼接改用
os.path.join或者pathlib处理,避免Windows和Linux/macOS的路径分隔符差异问题,跨平台可直接运行 - 给ffmpeg加上
-y参数,自动覆盖已存在的输出文件,不需要手动确认 - 增加异常捕获逻辑,某一行裁剪失败时跳过继续处理下一行,不会直接中断整个批量任务
- 可加上
-loglevel error参数减少ffmpeg的日志输出,只打印错误信息,控制台更整洁
内容的提问来源于stack exchange,提问作者K8Otter
相关产品推荐
相关产品推荐

