php exec ffmpeg 如何获取错误
Posted
技术标签:
【中文标题】php exec ffmpeg 如何获取错误【英文标题】:php exec ffmpeg how to get errors 【发布时间】:2011-03-17 09:38:08 【问题描述】:当我跑步时
exec("ffmpeg -i $flv -y -f mjpeg -ss 00:00:05 -s 120x90 -vframes 1 -an thumb.jpg",$error);
$error 返回空值 但是当我使用 cron 作业运行这个命令时 这一个向我发送一封通知电子邮件,其中包含诸如
之类的信息FFmpeg 版本 0.5.2,版权所有 (c) 2000-2009 Fabrice Bellard 等人。 配置: --prefix=/usr --libdir=/usr/lib64 --shlibdir=/usr/lib64 --mandir=/usr/share/man --incdir=/usr/include --disable-avisynth --extra -cflags=-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -fPIC --enable-avfilter -- enable-avfilter-lavf --enable-libdirac --enable-libfaac --enable-libfaad --enable-libfaadbin --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libtheora - -enable-libx264 --enable-gpl --enable-nonfree --enable-postproc --enable-pthreads --enable-shared --enable-swscale --enable-vdpau --enable-version3 --enable-x11grab libavutil 49.15。 0 / 49.15。 0 libavcodec 52.20。 1 / 52.20。 1 libav 格式 52.31。 0 / 52.31。 0 libavdevice 52. 1. 0 / 52. 1. 0 libavfilter 0. 4. 0 / 0. 4. 0 libswscale 0. 7. 1 / 0. 7. 1 libpostproc 51. 2. 0 / 51. 2. 0 建于 2010 年 6 月 13 日 23:44:18,gcc: 4.1.2 20080704 (Red Hat 4.1.2-48)
我需要能够在 php 中获取这些错误,这样我才能知道拇指是否已创建
谢谢。
【问题讨论】:
如何在ffmpeg中进行错误处理? 【参考方案1】:用2>&1
重定向输出
exec("ffmpeg -i $flv -y -f mjpeg -ss 00:00:05 -s 120x90 -vframes 1 -an thumb.jpg 2>&1",$error);
【讨论】:
我知道这是一个老问题,但我总是发现在运行某些命令时获取 FFMPEG 报告也很有用。因此我使用这样的东西:$cmd = 'ffmpeg -i ' . $task . $codec . $path . ' -report -hide_banner -loglevel error 2>&1'; $r = exec($cmd, $errors);
where -report 在根目录中生成一个广泛的报告。对于更大的项目,我总是会加入一个日志系统,例如:$log = file_put_contents($logFile, $cmd . PHP_EOL , FILE_APPEND | LOCK_EX);
,只是为了将所有内容集中在一个地方并得到很好的评论。【参考方案2】:
建立在 Mauro 的回答之上。一种检测错误的干净方法是添加以下选项-hide_banner
和-loglevel error
。
exec("ffmpeg -i $flv -y -f mjpeg -ss 00:00:05 -s 120x90 -vframes 1 -an thumb.jpg -hide_banner -loglevel error 2>&1", $errors);
exec()
在这种情况下总是将一个字符串数组分配给第二个参数$errors
,每个元素对应一个不同的错误,因此您可以使用循环简单地打印或处理每个错误:
foreach($errors as $next)
//handle error
echo $next;
【讨论】:
【参考方案3】:这个答案是在提问近 6 年后才出现的,但较新的版本有一个选项 -hide_banner
。
来自手册页
-hide_banner
禁止打印横幅。
所有 FFmpeg 工具通常都会显示版权声明、构建选项和库版本。此选项可用于禁止打印此信息。
您还可以使用选项-loglevel
来定义要显示的消息类型(错误、警告、信息、调试)。
【讨论】:
以上是关于php exec ffmpeg 如何获取错误的主要内容,如果未能解决你的问题,请参考以下文章
php-fpm linux环境使用exec函数调用ffmpeg,报错ffmpeg: command not found的解决方法