Python调用ffmpeg失败:subprocess/os.system无法执行视频处理任务
问题分析与解决步骤
你的代码存在几处关键错误,导致ffmpeg执行失败(返回值1通常表示命令语法错误或执行异常),以下是具体问题和修复方案:
1. 第二个subprocess调用的参数错误
你在第二个ffmpeg调用中,把变量拼接写在了字符串字面量里:
"'FR' + str(c) + '.mp4'"
这会被当作字面文件名,而不是动态生成的FR0.mp4/FR1.mp4等,ffmpeg找不到这个文件,自然报错。正确写法是直接生成变量:
f'FR{c}.mp4' # 或者 'FR' + str(c) + '.mp4'
2. 循环范围错误
range(0, len(b)-1)会直接跳过文本文件的最后一行,应该改用enumerate遍历每行,既获取索引又避免漏行:
for c, line in enumerate(b):
3. 未处理文本行的换行符与多余空格
readlines()读取的每行末尾会带有\n换行符,直接split会导致空字符串元素,需要先strip处理:
line = line.strip() if not line: # 跳过空行 continue words = line.split(" ")
4. 原ffmpeg命令的语法错误
文本文件中的-a copy是错误参数,ffmpeg中音频流复制的正确参数是-c:a copy或-acodec copy,原命令本身就无法执行,这也是返回值1的原因之一。
5. 未捕获ffmpeg的错误输出
建议改用subprocess.run并捕获stderr,方便排查具体错误:
result = subprocess.run(cmd, shell=True, capture_output=True, text=True) if result.returncode != 0: print(f"命令执行失败: {result.stderr}")
修复后的完整代码
import subprocess import os os.chdir('/home/Downloads/SRs/') with open('SRt.txt', 'r') as a: lines = a.readlines() for c, line in enumerate(lines): line = line.strip() if not line: continue # 替换输出文件为临时文件FRx.mp4 words = line.split(" ") original_output = words[-1] temp_output = f'FR{c}.mp4' crop_cmd = line.replace(original_output, temp_output) # 执行裁剪命令 print(f"执行裁剪命令: {crop_cmd}") crop_result = subprocess.run(crop_cmd, shell=True, capture_output=True, text=True) if crop_result.returncode != 0: print(f"裁剪失败,错误信息: {crop_result.stderr}") continue # 执行缩放命令 scale_cmd = [ 'ffmpeg', '-i', temp_output, '-vf', 'scale=320:240', original_output ] print(f"执行缩放命令: {' '.join(scale_cmd)}") scale_result = subprocess.run(scale_cmd, capture_output=True, text=True) if scale_result.returncode != 0: print(f"缩放失败,错误信息: {scale_result.stderr}") else: # 缩放成功后删除临时文件 os.remove(temp_output)
额外注意事项
- 确保
/home/Downloads/SRs/目录存在且有读写权限 - 确保系统已正确安装ffmpeg,且在PATH环境变量中
- 大数量文件处理时,可以考虑添加进度提示,避免无响应
内容的提问来源于stack exchange,提问作者confused
相关产品推荐
相关产品推荐

