You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP通过exec调用FFmpeg时输出流编码器初始化失败问题(Apache切换至OpenLiteSpeed后出现)

解决OpenLiteSpeed下PHP exec调用FFmpeg转码失败的问题

你在把Web服务器从Apache换成OpenLiteSpeed后,碰到了PHP通过exec调用FFmpeg转码失败的情况——终端直接执行命令完全正常,但PHP调用就报错:

Error initializing output stream 0:0 -- Error while opening encoder for output stream #0:0 - maybe incorrect parameters such as bit_rate, rate, width or height

这种跨环境的问题大多和权限、环境变量或者服务器限制有关,下面是几个常见的排查方向和解决方法:

1. 检查PHP进程的权限问题

OpenLiteSpeed默认的PHP运行用户(通常是nobody或者lsadm)和你终端登录的用户权限不一样,很可能是它没有访问文件或目录的权限:

  • 输入/输出文件/目录权限:确保/home/api/test.mp4能被PHP用户读取,/home/api/和临时日志目录/home/api/tmp/unb2a/能被写入。
    可以用这两条命令调整权限(假设PHP运行用户是nobody):
    chown -R nobody:nobody /home/api/
    chmod -R 755 /home/api/
    
  • FFmpeg执行权限:确认FFmpeg二进制文件允许PHP用户执行,比如:
    chmod +x /usr/bin/ffmpeg # 替换成你实际的FFmpeg路径
    

2. 补全环境变量差异

终端里的环境变量和OpenLiteSpeed的PHP进程环境变量不一样,可能导致FFmpeg找不到编码依赖库(比如libx264):

  • 指定FFmpeg完整路径:不要只用ffmpeg,换成终端里which ffmpeg得到的完整路径,比如:
    $ffmpegPath = '/usr/bin/ffmpeg';
    $command = "$ffmpegPath -y -i '/home/api/test.mp4' -async 1 -metadata:s:v:0 start_time=0 -vcodec libx264 -acodec aac -b:v 1000k -refs 6 -coder 1 -sc_threshold 40 -flags +loop -me_range 16 -subq 7 -i_qfactor 0.71 -qcomp 0.6 -qdiff 4 -trellis 1 -b:a 128k -pass 1 -passlogfile '/home/api/tmp/unb2a/pass-62aeeac90d83c' '/home/api/Pre_zygJYg1.mp4' 2>&1";
    exec($command, $output, $returnVar);
    
  • 添加库路径环境变量:在OpenLiteSpeed的后台,找到Server Configuration > External App > 你的PHP LSAPI应用,在Environment里添加:
    LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu/
    
    这个路径要对应你系统里编码库的存放位置。

3. 排查临时目录问题

FFmpeg的-pass模式需要写入临时日志文件,如果临时目录/home/api/tmp/unb2a/权限不够或者磁盘满了,也会导致编码器初始化失败:

  • 先看磁盘空间:df -h
  • 检查目录权限:ls -ld /home/api/tmp/unb2a/
  • 如果权限不对,调整成PHP用户可写:
    chown nobody:nobody /home/api/tmp/unb2a/
    chmod 775 /home/api/tmp/unb2a/
    

4. 解除OpenLiteSpeed的安全限制

OpenLiteSpeed默认可能有一些限制,阻止PHP执行外部命令或者访问特定目录:

  • 检查open_basedir:在后台Server Configuration > PHP > 对应PHP版本里,修改open_basedir,确保包含你的项目目录、FFmpeg路径和临时目录:
    /home/api/:/usr/bin/:/tmp/
    
  • 检查disable_functions:同样在PHP配置里,看看disable_functions里有没有exec,如果有就删掉它。

5. 用简化命令定位问题

如果上面的方法都没解决,可以先跑一个简化版的FFmpeg命令,排除复杂参数的问题:

$command = "$ffmpegPath -y -i '/home/api/test.mp4' -c:v libx264 -c:a aac '/home/api/test_output.mp4' 2>&1";
exec($command, $output, $returnVar);
print_r($output);

如果简化命令成功,再一点点加回原命令的参数,就能找到具体导致失败的那个参数了。


内容的提问来源于stack exchange,提问作者Ali Akbar Azizi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 00:32:40