PHP通过exec调用FFmpeg处理韩文文件名报错,转换视频返回退出码-1
PHP调用FFmpeg处理韩文文件名视频时的退出码问题解决方案
我来帮你拆解这两个退出码的问题,一步步排查解决:
首先先明确两个退出码的大致含义:
- 退出码-1:一般意味着进程被系统强制终止,或者FFmpeg根本没被正确调用起来(比如路径不对、权限不足)
- 退出码1:这是FFmpeg的通用错误码,大概率是命令语法错误、文件无法识别(尤其是韩文文件名的编码问题)、缺少解码/编码库导致的
核心解决步骤
1. 先处理韩文文件名的编码兼容问题
直接把韩文文件名丢进exec命令里,shell很可能因为编码不匹配识别错文件名。一定要用PHP的escapeshellarg()函数转义文件名,它会自动处理非ASCII字符和特殊符号,确保文件名被shell正确解析为单个参数:
$inputFile = '01.시대조감.wmv'; $outputFile = '0001.mp4'; // 转义文件名,避免编码或特殊字符导致的解析错误 $escapedInput = escapeshellarg($inputFile); $escapedOutput = escapeshellarg($outputFile); // 构造FFmpeg命令(建议用FFmpeg的绝对路径,避免环境变量找不到) $ffmpegPath = '/usr/bin/ffmpeg'; // Linux下的示例路径,Windows请换成类似C:\\ffmpeg\\bin\\ffmpeg.exe $command = "$ffmpegPath -i $escapedInput $escapedOutput -hide_banner 2>&1"; // 执行命令并获取输出 exec($command, $output, $exit_code); // 打印输出和退出码,方便排查 print_r($output); var_dump($exit_code);
2. 确保系统和PHP的字符编码一致
服务器系统的字符编码需要支持韩文,否则shell无法正确解析韩文文件名:
- Linux系统:在exec前设置环境变量,强制用UTF-8编码:
putenv('LANG=ko_KR.UTF-8'); putenv('LC_ALL=ko_KR.UTF-8'); - Windows系统:系统默认是CP949编码,需要把PHP里的UTF-8文件名转成CP949:
$inputFile = iconv('UTF-8', 'CP949', '01.시대조감.wmv'); $escapedInput = escapeshellarg($inputFile);
同时确保PHP的默认编码是UTF-8(在php.ini里设置default_charset = "UTF-8")。
3. 排查权限和路径问题
退出码-1很多时候是权限不足导致的:
- 确认FFmpeg的路径正确:用
which ffmpeg(Linux)或者直接找FFmpeg的安装路径,命令里一定要用绝对路径,避免PHP的环境变量找不到FFmpeg。 - 确认PHP运行的用户(比如Linux的www-data,Windows的IIS_IUSRS)对输入文件和输出目录有读写权限,可以用
chmod(Linux)或者右键设置文件权限(Windows)调整。
4. 查看FFmpeg的详细错误信息
你的命令里加了-hide_banner会隐藏很多关键错误,建议暂时去掉或者把stderr重定向到stdout(就是上面代码里的2>&1),这样$output里会显示FFmpeg的所有错误信息,比如“文件找不到”“缺少WMV解码库”等,能直接定位问题。
额外注意事项
如果是处理WMV文件,要确保你的FFmpeg编译时包含了WMV相关的解码库(比如libwmav2),可以用ffmpeg -codecs | grep wmv查看是否支持WMV解码。
内容的提问来源于stack exchange,提问作者Marc




