PHP 和 FFmpeg : works on terminal but ffmpeg error when in shell_exec

标签 php ffmpeg shell-exec

我面临一个我无法解决的问题!

我尝试使用 ffmpeg 转换视频工具。当我将命令粘贴到服务器终端(ssh root)时,它工作正常。但是,当我在我的 PHP 脚本中尝试使用 shell_exec ,它返回错误“打开编码器时出错...”。

这是我使用的命令:

ffmpeg -y -i VIDEOIN.mov -preset medium -strict -2 -c:v libx264 -b:v 1000k -pass 1 -f mp4 VIDEOOUT.mp4 </dev/null 1>logfile.txt 2>&1 &

还有我的 PHP 脚本:
$dir = 'videos/'.$uuid;
$out = $dir.'video.mp4';
$log = $dir.'transcoding_log.txt';
$preset = 'medium';
$bitrate = 1000;

$cmd = "ffmpeg -y -i ".$in." -preset ".$preset." -strict -2 -c:v libx264 -b:v ".$bitrate."k -pass 1 -f mp4 ".$out." </dev/null 1>".$log." 2>&1 &";
@file_put_contents($dir.'cmd.log', $cmd); // to debug
shell_exec($cmd);

这是在 PHP 脚本中创建的日志文件:
ffmpeg version 1.0.8 Copyright (c) 2000-2013 the FFmpeg developers
built on Sep 12 2013 11:57:09 with gcc 4.7 (Debian 4.7.2-5)
configuration: --prefix=/usr --extra-cflags='-g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security ' --extra-ldflags='-Wl,-z,relro' --cc='ccache cc' --enable-shared --enable-libmp3lame --enable-gpl --enable-nonfree --enable-libvorbis --enable-pthreads --enable-libfaac --enable-libxvid --enable-postproc --enable-x11grab --enable-libgsm --enable-libtheora --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libx264 --enable-libspeex --enable-nonfree --disable-stripping --enable-libvpx --enable-libschroedinger --disable-encoder=libschroedinger --enable-version3 --enable-libopenjpeg --enable-librtmp --enable-avfilter --enable-libfreetype --enable-libvo-aacenc --disable-decoder=amrnb --enable-libvo-amrwbenc --enable-libaacplus --libdir=/usr/lib/x86_64-linux-gnu --disable-vda --enable-libbluray --enable-libcdio --enable-gnutls --enable-frei0r --enable-openssl --enable-libass --enable-libopus --enable-fontconfig --enable-libfdk-aac --enable-libdc1394 --disable-altivec --dis  libavutil      51. 73.101 / 51. 73.101
  libavcodec     54. 59.100 / 54. 59.100
  libavformat    54. 29.104 / 54. 29.104
  libavdevice    54.  2.101 / 54.  2.101
  libavfilter     3. 17.100 /  3. 17.100
  libswscale      2.  1.101 /  2.  1.101
  libswresample   0. 15.100 /  0. 15.100
  libpostproc    52.  0.100 / 52.  0.100
Input #0, matroska,webm, from 'videos/18352678af96ecb5/origin.webm':
  Metadata:
    creation_time   : 2010-05-20 08:21:12
  Duration: 00:00:32.48, start: 0.000000, bitrate: 533 kb/s
    Stream #0:0(eng): Video: vp8, yuv420p, 640x360, SAR 1:1 DAR 16:9, 25 fps, 25 tbr, 1k tbn, 1k tbc (default)
    Stream #0:1(eng): Audio: vorbis, 44100 Hz, mono, s16 (default)
[libx264 @ 0x19c05a0] using SAR=1/1
[libx264 @ 0x19c05a0] using cpu capabilities: MMX2 SSE2Fast SSEMisalign LZCNT
[libx264 @ 0x19c05a0] ratecontrol_init: can't open stats file
Output #0, mp4, to 'videos/18352678af96ecb5/video.mp4':
    Stream #0:0(eng): Video: h264, yuv420p, 640x360 [SAR 1:1 DAR 16:9], q=-1--1, pass 1,     90k tbn, 25 tbc (default)
    Stream #0:1(eng): Audio: none, 44100 Hz, mono, s16, 128 kb/s (default)
Stream mapping:
  Stream #0:0 -> #0:0 (vp8 -> libx264)
  Stream #0:1 -> #0:1 (vorbis -> libfaac)
Error while opening encoder for output stream #0:0 - maybe incorrect parameters such as     bit_rate, rate, width or height

编辑1:

我用最新版本编译了ffmpeg,但问题仍然存在。

最佳答案

我在 Synology 服务器上得到了相同的 pb。这是对 /usr/syno/etc/codec/activation.conf 的读取权限当从 PHP 调用 ffmpeg 时,这是不允许的。

响应位于/var/log/messages 日志文件中:

Jan 25 19:00:11 MySpher-Serv synocodectool: G1HttpSend.cpp:198 SaveResponseToFile failed
Jan 25 19:00:11 MySpher-Serv synocodectool: G1Licence.cpp:40 Failed to read file [/usr/syno/etc/codec/activation.conf]
Jan 25 19:00:11 MySpher-Serv synocodectool: G1Licence.cpp:66 read json file [/usr/syno/etc/codec/activation.conf] error
Jan 25 19:00:11 MySpher-Serv synocodectool: SYNOCodecPatentG1.cpp:223 ValidateG1Licence failed

一个简单的chmod 777 /usr/syno/etc/codec/activation.conf (和子目录)确实解决了这个问题。

关于PHP 和 FFmpeg : works on terminal but ffmpeg error when in shell_exec,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19537249/

相关文章:

javascript - Google柱形图mysql php不显示

PHP mysqlnd/MySQL 版本

ffmpeg - 使用 ffmpeg 从电影文件创建的 GIF 尺寸非常大

PHP 通知 : Array to string conversion Error

javascript - PHP重定向头不是重定向吗?

c++ - ffmpeg c/c++ 获取帧数或时间戳和 fps

python - 从 Windows 中的子进程检索标准输出

php - PHP 的 Shell_exec 问题

Php 检查 shell_exec 命令是否成功

php - PHP 中上传视频的持续时间