You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动