- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在使用 FFMpeg 转换视频,它在命令行下运行良好。我正在使用以下命令:
ffmpeg -i input.avi -ab 56 -ar 44100 -b 200 -r 15 -s 320x240 -f flv output.flv
但是,当我使用 PHP 脚本运行命令时,输出视频未编码。
exec("ffmpeg -i input.avi -ab 56 -ar 44100 -b 200 -r 15 -s 320x240 -f flv output.flv",$output, $returnvalue);
$returnvalue = 127;
FFMPEG安装路径:
[root@localhost ~]# which ffmpeg
/root/bin/ffmpeg
我的脚本路径:
www.domainname.com/core/foldername/ffmpeg.php
请尽快为我提供相同的解决方案。
谢谢。
最佳答案
从 PHP 脚本运行 ffmpeg
的自然方式是这样的:
<?php
echo "Starting ffmpeg...\n\n";
echo shell_exec("ffmpeg -i input.avi output.avi &");
echo "Done.\n";
?>
这里有几个问题需要指出。第一个是,虽然我们指定我们希望 ffmpeg
在后台执行(使用 & 符号运算符“&”),但 PHP 脚本将不会继续它的执行直到ffmpeg
已完成执行。这是因为在 PHP 的 exec()
函数的注释之一中提到:
If a program is started with this function, in order for it to continue running in the background, the output of the program must be redirected to a file or another output stream. Failing to do so will cause PHP to hang until the execution of the program ends.
不要对显示 shell_exec()
调用而不是 exec()
的示例感到困惑。所有 PHP 的程序执行函数都共享相似的代码库 和限制。
因此,要解决此问题,我们需要执行以下操作:
<?php
echo "Starting ffmpeg...\n\n";
echo shell_exec("ffmpeg -i input.avi output.avi >/dev/null 2>/dev/null &");
echo "Done.\n";
?>
">/dev/null" 部分会将 ffmpeg
实例的标准输出(stdout)重定向到 /dev/null
(有效地忽略输出)和 "2>/dev/null" 将标准 ERROR (stderr) 重定向到 /dev/null
(有效地忽略任何错误日志消息)。这两个可以组合成一个更短的表示:">/dev/null 2>&1"。如果愿意,您可以阅读有关 I/O 重定向的更多信息。
这里应该提到一个重要的注意事项。 ffmpeg
命令行工具使用 stderr
输出错误日志消息,stdout
保留用于可能使用管道(重定向输出媒体从 ffmpeg
生成的流到其他一些命令行工具)。也就是说,如果您在后台运行 ffmpeg
,您很可能希望将 stderr
重定向到日志文件,以便稍后检查。
需要注意的另一件事是标准输入 (stdin)。命令行 ffmpeg
工具被设计为一种交互式实用程序,它接受用户输入(通常来自键盘)并在用户当前屏幕/终端上报告错误日志。当我们在后台运行 ffmpeg
时,我们想告诉 ffmpeg
不应该接受(也不等待)来自 stdin
的输入。我们可以将此告诉 ffmpeg
,再次使用 I/O 重定向 ** “后台的 ffmpeg 命令行工具将与此类似:
<?php
echo "Starting ffmpeg...\n\n";
echo shell_exec("ffmpeg -y -i input.avi output.avi </dev/null >/dev/null 2>/var/log/ffmpeg.log &");
echo "Done.\n";
?>
“-y” 选项用于自动覆盖输出文件 (output.avi) 而无需请求 yes/no
确认。如果您需要相反的场景,在输出文件已经存在的情况下自动取消整个过程,请改用 "-n" 选项。
包装库
一些 PHP 库允许将 ffmpeg
调用包装到 PHP 对象中,如果您不喜欢使用命令行,则可以使用良好的语法。其中之一是积极维护 PHP-FFMpeg .除了安装 PHP 组件外,它只需要您下载最新的 ffmpeg
和 ffprobe
版本。然后你可以像这样运行 PHP 代码:
$ffmpeg = FFMpeg\FFMpeg::create();
$video = $ffmpeg->open('video.mpg');
$video
->filters()
->resize(new FFMpeg\Coordinate\Dimension(320, 240))
->synchronize();
$video
->save(new FFMpeg\Format\Video\X264(), 'export-x264.mp4')
当然,您需要注意在后台运行此类任务。图书馆如 GearmanClient促进这一点。
注意: ffmpeg-php是自 2007 年以来未开发的扩展(并且需要 “ffmpeg-0.4.9_pre1 或更高版本”),这意味着您只能使用非常旧的 ffmpeg 版本,无法更新它到最新版本。由于每天在 ffmpeg 的
代码中进行大量更改/改进,这使得 ffmpeg-php
与最新的 ffmpeg
不兼容。
阅读official documentation了解更多信息。
关于php - FFMpeg 在命令行中工作但不在 PHP 脚本中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26794297/
我在 JavaScript 文件中运行 PHP,例如...... var = '';). 我需要使用 JavaScript 来扫描字符串中的 PHP 定界符(打开和关闭 PHP 的 )。 我已经知道使
我希望能够做这样的事情: php --determine-oldest-supported-php-version test.php 并得到这个输出: 7.2 也就是说,php 二进制检查 test.
我正在开发一个目前不使用任何框架的大型 php 站点。我的大问题是,随着时间的推移慢慢尝试将框架融入应用程序是否可取,例如在创建的新部件和更新的旧部件中? 比如所有的页面都是直接通过url服务的,有几
下面是我的源代码,我想在同一页面顶部的另一个 php 脚本中使用位于底部 php 脚本的变量 $r1。我需要一个简单的解决方案来解决这个问题。我想在代码中存在的更新查询中使用该变量。 $name)
我正在制作一个网站,根据不同的情况进行大量 PHP 重定向。就像这样...... header("Location: somesite.com/redirectedpage.php"); 为了安全起见
我有一个旧网站,我的 php 标签从 因为短标签已经显示出安全问题,并且在未来的版本中将不被支持。 关于php - 如何避免在 php 文件中写入
我有一个用 PHP 编写的配置文件,如下所示, 所以我想用PHP开发一个接口(interface),它可以编辑文件值,如$WEBPATH , $ACCOUNTPATH和 const值(value)观
我试图制作一个登录页面来学习基本的PHP,首先我希望我的独立PHP文件存储HTML文件的输入(带有表单),但是当我按下按钮时(触发POST到PHP脚本) )我一直收到令人不愉快的错误。 我已经搜索了S
我正在寻找一种让 PHP 以一种形式打印任意数组的方法,我可以将该数组作为赋值包含在我的(测试)代码中。 print_r 产生例如: Array ( [0] => qsr-part:1285 [1]
这个问题已经有答案了: 已关闭11 年前。 Possible Duplicate: What is the max key size for an array in PHP? 正如标题所说,我想知道
我正在寻找一种让 PHP 以一种形式打印任意数组的方法,我可以将该数组作为赋值包含在我的(测试)代码中。 print_r 产生例如: Array ( [0] => qsr-part:1285 [1]
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 9 年前。 Improve this ques
我在 MySQL 数据库中有一个表,其中存储餐厅在每个工作日和时段提供的菜单。 表结构如下: i_type i_name i_cost i_day i_start i_
我有两页。 test1.php 和 test2.php。 我想做的就是在 test1.php 上点击提交,并将 test2.php 显示在 div 中。这实际上工作正常,但我需要向 test2.php
我得到了这个代码。我想通过textarea更新mysql。我在textarea中回显我的MySQL,但我不知道如何更新它,我应该把所有东西都放进去吗,因为_GET模式没有给我任何东西,我也尝试_GET
首先,我是 php 的新手,所以我仍在努力学习。我在 Wordpress 上创建了一个表单,我想将值插入一个表(data_test 表,我已经管理了),然后从 data_test 表中获取所有列(id
我有以下函数可以清理用户或网址的输入: function SanitizeString($var) { $var=stripslashes($var); $va
我有一个 html 页面,它使用 php 文件查询数据库,然后让用户登录,否则拒绝访问。我遇到的问题是它只是重定向到 php 文件的 url,并且从不对发生的事情提供反馈。这是我第一次使用 html、
我有一个页面充满了指向 pdf 的链接,我想跟踪哪些链接被单击。我以为我可以做如下的事情,但遇到了问题: query($sql); if($result){
我正在使用 从外部文本文件加载 HTML/PHP 代码 $f = fopen($filename, "r"); while ($line = fgets($f, 4096)) { print $l
我是一名优秀的程序员,十分优秀!