Python遍历文件夹批量裁剪视频前30秒代码无法运行问题求助
批量裁剪视频代码问题排查与修正
现有代码核心问题列表
- 字符串未正确格式化:使用
"{path}.mpg"语法时没有加f前缀作为f-string解析,变量不会被替换,同时path本身已经是包含后缀的完整文件路径,额外拼接.mpg会导致路径变成xxx.mpg.mpg,找不到目标输入文件。 - 输出文件名配置错误:
mice = ["022, 90"]是单元素列表,mice[0]的值为"022, 90",不是预期的两个独立编号targetname参数传入的是包含逗号的整数字符串,会导致输出文件名非法,且循环中所有输出文件重名,前一个处理结果会被后一个覆盖
- 裁剪结束时间写死:固定写120秒,如果原视频时长不足120秒会直接报错,剪掉开头30秒应该取视频实际总时长作为结束时间
- 冗余无效代码:循环内定义的
input = ffmpeg.input(path)完全没被使用,且input是Python内置函数名,用作变量名存在潜在风险
修正后可运行的批量裁剪代码
import os from moviepy.video.io.ffmpeg_tools import ffmpeg_extract_subclip from moviepy.editor import VideoFileClip def batch_time_crop(): directory = "/Users/documents/lab/video/ProccessedVideo" # 输出文件保存目录,可自行修改 output_dir = os.path.join(directory, "cropped") os.makedirs(output_dir, exist_ok=True) count = 1 for filename in os.listdir(directory): if filename.endswith(".mpg") or filename.endswith(".mp4"): # 拼接输入文件完整路径 input_path = os.path.join(directory, filename) print(f"正在处理第{count}个文件:{input_path}") # 获取视频总时长 clip = VideoFileClip(input_path) total_duration = clip.duration # 跳过时长不足30秒的视频 if total_duration <= 30: print(f"文件{filename}时长不足30秒,跳过处理") count += 1 continue # 构造输出文件名,沿用原文件名加_cropped后缀避免重名,也可改用count编号命名 file_suffix = filename.split('.')[-1] output_name = f"{os.path.splitext(filename)[0]}_cropped.{file_suffix}" output_path = os.path.join(output_dir, output_name) # 裁剪从30秒到视频结束 ffmpeg_extract_subclip(input_path, 30, total_duration, targetname=output_path) count += 1 print(f"处理完成,共处理{count-1}个文件") if __name__ == "__main__": batch_time_crop()
内容的提问来源于stack exchange,提问作者reksapj
相关产品推荐
相关产品推荐

