如何将ffmpeg命令适配为ffmpy可用格式以批量提取音频片段
ffmpy执行报错FFRuntime Exited With Status Code 1解决方案
核心问题成因
你遇到的报错核心是ffmpy的使用方式错误:
- 不要手动拼接字符串覆盖
ff.cmd属性,ffmpy执行命令时默认不走系统shell,你手动加的路径引号会被当成路径的一部分,导致ffmpeg找不到输入/输出文件,这就是同样的命令在终端能跑、代码跑不了的根本原因 - 初始化FFmpeg对象时传入的inputs、outputs参数完全未生效,属于冗余代码
正确实现代码
首先按照ffmpy的规范传参,同时可以用os.path处理路径避免跨平台问题:
import os from ffmpy import FFmpeg # 你的csv读取逻辑保留 for line in reader: print(line) # 拆分路径用os.path更稳妥,兼容不同系统的路径分隔符 path_parts = os.path.normpath(line[1]).split(os.sep) folder_name = path_parts[-2] file_name = path_parts[-1] file_stem = os.path.splitext(file_name)[0] audio_file_path = os.path.join("./audio_files", folder_name, f"{file_stem}.mp3") output_path = os.path.join("./audio_files", folder_name, f"{file_stem}_cut.mp3") start_time = line[2] end_time = line[3] # 按ffmpy规范传参,-ss放在输入参数位,实现快速跳转 ff = FFmpeg( inputs={audio_file_path: f"-ss {start_time}"}, outputs={output_path: f"-to {end_time} -c copy -async 1 -y"} ) # 打印生成的命令确认是否正确 print(ff.cmd) # 执行时加参数打印ffmpeg的输出和报错,方便后续排查问题 ff.run(print_stdout=True, print_stderr=True)
补充说明
- 输出参数加了
-y,会自动覆盖已存在的输出文件,避免ffmpeg等待用户输入确认导致卡住 -ss放在输入参数前,ffmpeg会直接跳转到起始时间点再解码,比放在-i后快很多- 如果需要保留原始的转码逻辑,去掉
-c copy即可,-c copy是流复制模式,剪辑速度极快但要求起始时间点落在关键帧上,如果你剪辑出来的片段开头有异常,去掉这个参数就行
内容的提问来源于stack exchange,提问作者Daveguy
相关产品推荐
相关产品推荐

