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处理中文文件名称时出现报错如何解决

11 回复

这样提示:
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)

关键点说明:

  1. 使用参数列表:将命令和每个参数作为列表元素传递,而不是拼接成单个字符串,这可以避免shell解释导致的编码问题。

  2. 编码设置:在subprocess.run()中设置encoding='utf-8',确保输入输出使用UTF-8编码处理。

  3. Windows特殊处理:如果是在Windows上遇到问题,可以尝试:

    • 确保Python脚本文件本身以UTF-8编码保存
    • 对于特别顽固的情况,可以将路径转换为短路径(8.3格式),但这通常不是必须的
  4. 路径格式:在字符串前加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。

1.调用 ffmpeg 的时候能否把编码换成 utf8 ;
2.文件名里面包含了空格,最好用双引号包起来;

在 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 如果没有中文包。你就需要安装一下。

回到顶部