Python中调用ffmpeg处理中文文件名称时出现报错如何解决
rtrt,现在用 python 命令调用 ffmpeg 提取视频里面的音频,英文文件名没用问题,中文文件名会报错。 命令行是这样的
command = "ffmpeg -i " + name_movie + " -ab 160k -ac 2 -ar 8000 -vn " + name_sound subprocess.call(command, shell=True)
其中文件名是 类似 [ 5-18 ] 学习 1 我是谁.mp4 这样的
头部用了 #--coding=utf-8-- 也不行
Python中调用ffmpeg处理中文文件名称时出现报错如何解决
这样提示:
ffmpeg version N-93933-geae251ead9 Copyright © 2000-2019 the FFmpeg developers
built with gcc 8.3.1 (GCC) 20190414
configuration: --enable-gpl --enable-version3 --enable-sdl2 --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libdav1d --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex
–enable-libxvid --enable-libaom --enable-libmfx --enable-amf --enable-ffnvcodec --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 --enable-avisynth --enable-libopenmpt
libavutil 56. 28.100 / 56. 28.100
libavcodec 58. 52.102 / 58. 52.102
libavformat 58. 27.103 / 58. 27.103
libavdevice 58. 7.100 / 58. 7.100
libavfilter 7. 54.101 / 7. 54.101
libswscale 5. 4.101 / 5. 4.101
libswresample 3. 4.100 / 3. 4.100
libpostproc 55. 4.100 / 55. 4.100
銆?-18 銆戝涔犺嚜鍔ㄩ┚椹舵苯杞︾殑姝g‘濮垮娍: Invalid argument
这个问题很常见,是因为Python的subprocess模块和系统默认编码与ffmpeg处理中文路径时的编码不匹配导致的。核心是确保文件路径字符串在传递过程中保持正确的编码。
最直接有效的解决方案是使用subprocess.run()并显式传递参数列表,同时确保路径字符串是Unicode。对于Windows系统,额外需要注意文件路径的格式。
解决方案代码示例:
import subprocess
import sys
def run_ffmpeg_with_chinese_path(input_file, output_file):
"""
安全调用ffmpeg处理含中文路径的文件
"""
# 构建ffmpeg命令参数列表,直接使用Unicode字符串
cmd = [
'ffmpeg',
'-i', input_file, # 输入文件路径
'-c:v', 'libx264',
'-c:a', 'aac',
output_file # 输出文件路径
]
try:
# 执行命令
result = subprocess.run(cmd,
capture_output=True,
text=True,
encoding='utf-8',
errors='ignore')
# 检查执行结果
if result.returncode == 0:
print("处理成功!")
else:
print(f"处理失败,错误信息:\n{result.stderr}")
except FileNotFoundError:
print("错误:未找到ffmpeg,请确保已安装并添加到系统PATH")
except Exception as e:
print(f"执行过程中发生错误:{e}")
# 使用示例
if __name__ == "__main__":
# 直接使用中文路径(确保文件存在)
input_path = r"C:\视频素材\测试视频.mp4" # Windows示例
# input_path = "/home/user/视频素材/测试视频.mp4" # Linux/Mac示例
output_path = r"C:\输出结果\处理后的视频.mp4"
run_ffmpeg_with_chinese_path(input_path, output_path)
关键点说明:
-
使用参数列表:将命令和每个参数作为列表元素传递,而不是拼接成单个字符串,这可以避免shell解释导致的编码问题。
-
编码设置:在
subprocess.run()中设置encoding='utf-8',确保输入输出使用UTF-8编码处理。 -
Windows特殊处理:如果是在Windows上遇到问题,可以尝试:
- 确保Python脚本文件本身以UTF-8编码保存
- 对于特别顽固的情况,可以将路径转换为短路径(8.3格式),但这通常不是必须的
-
路径格式:在字符串前加
r使用原始字符串,避免反斜杠被转义(Windows)。
如果你的原始代码是拼接字符串的方式,对比一下:
# ❌ 错误方式(容易出编码问题)
cmd = f'ffmpeg -i "{input_file}" -c:v libx264 -c:a aac "{output_file}"'
subprocess.call(cmd, shell=True)
# ✅ 正确方式(推荐)
cmd = ['ffmpeg', '-i', input_file, '-c:v', 'libx264', '-c:a', 'aac', output_file]
subprocess.run(cmd)
一句话总结:用参数列表传参,别用字符串拼接。
编码问题。字符串是 utf-8 的(�?-18 ] 学习自动驾驶汽车的正确姿势),打出来变成 gbk 了,怀疑你在用 windows。
在 cmd 下简单处理视频,中文字符 ffmpeg 处理的时候也是乱码,但是不影响结果
确实在用 Windows,然而这里: https://blog.csdn.net/jihengshan/article/details/44958315 说是编码的问题,python 不知道怎么处理。
现在是临时把文件改名,处理完了再改回去: https://blog.csdn.net/weixin_34417814/article/details/88261765
前两天我写这个,使用的是 linux 系统,所以没遇到这个问题,有个包 ffmpy,你去试试,看看有没有对这个问题做处理。
只是显示问题,因为 cmd 的默认代码页不是 Unicode (通常是 936 也就是 GBK ),所以为了正常显示,需要先 subprocess.call(‘chcp 65001’, shell=True) 把 cmd 的代码页改成 unicode。问题是这种乱七八糟的文件名是不是得多加个引号才能正常执行?
跟 python 关系不大,把文件路径加上 “”
同楼上,文件路径加上""应该就好了
win 加引号即可。。linux 如果没有中文包。你就需要安装一下。


