php视频转码中文路径乱码通常是因为系统底层命令执行时编码不一致导致的,解决的核心方法是确保 php 脚本、操作系统终端以及 ffmpeg 进程使用的字符集统一为 utf-8。具体做法是在调用 `exec` 或 `shell_exec` 之前,通过 `putenv('lang=c.utf-8')` 设置环境变量,并对文件路径使用 `mb_convert_encoding` 转换为 gbk(windows)或保持 utf-8(linux),同时建议在 ffmpeg 命令中显式指定输入输出编码参数。

Windows环境下ffmpeg中文路径乱码原因
在 Windows 系统中,PHP 默认可能使用 ANSI 代码页(如 GBK)与 cmd.exe 交互,而现代 PHP 源码和路径字符串多为 UTF-8,这种编码错位导致 ffmpeg 无法识别中文文件名。解决方法是强制转换路径编码或在 PHP 初始化阶段统一环境编码。

$filePath = 'D:/测试/视频.mp4';
$encodedPath = mb_convert_encoding($filePath, 'GBK', 'UTF-8');
$command = "ffmpeg -i \"{$encodedPath}\" output.mp4";
exec($command, $output, $returnVar);
上述代码将 UTF-8 路径转为 GBK 后传给 ffmpeg,可解决 Windows 下的乱码问题。若路径包含空格,务必加双引号包裹。实际运行中,需检查 `$returnVar` 是否为 0 以确认转码成功。
立即学习“PHP免费学习笔记(深入)”;
Linux环境下ffmpeg中文路径乱码原因
Linux 系统默认使用 UTF-8,但某些旧版 PHP 或服务器配置可能未正确设置 locale,导致 ffmpeg 接收到的路径字节流被错误解析。解决方法是设置 `LANG` 环境变量为 `C.UTF-8` 或 `zh_CN.UTF-8`,并确保文件系统支持 UTF-8。

putenv('LANG=C.UTF-8');
$filePath = '/home/user/视频.mp4';
$command = "ffmpeg -i \"{$filePath}\" output.mp4";
exec($command, $output, $returnVar);
在 Linux 中,直接传递 UTF-8 路径即可,关键在于 `putenv` 确保子进程继承正确的语言环境。若仍乱码,检查服务器 locale 设置:`locale -a` 应包含 `zh_CN.UTF-8`。
基于ffmpeg返回状态码的具体问题排查
当 ffmpeg 因路径问题失败时,会返回非零状态码并输出错误信息到 `$output` 数组。通过检查 `$returnVar` 和 `$output` 中的错误提示,可精准定位是路径不存在、编码错误还是权限问题。例如,若 `$output` 包含 "No such file or directory",则可能是路径编码未转换;若包含 "Invalid data found",则可能是文件损坏或格式不支持。



















