使用ffmpeg转换而不使用exec

时间:2010-11-13 16:06:44

标签: php ffmpeg

我有Windows XP,Apache,PHP 5.3和ffmpeg正常工作。我需要在不使用exec()命令的情况下将flv转换为avi,反之亦然。这可能吗?

谢谢。

编辑: 我希望有人可以编辑ffmpeg源并在php扩展中实现exec函数,这样我们就可以将参数添加到函数中(ex $ fmpeg-> exec('exec parameters here');)所以exec直接执行从扩展......

并编译这些文件:p

8 个答案:

答案 0 :(得分:3)

PHP有一个ffmpeg版本:

http://ffmpeg-php.sourceforge.net/

答案 1 :(得分:3)

这是不可能的,至少似乎没有例子ffmpeg在没有来自PHP的某种类型的系统调用(例如execsystem)的情况下运行。

编辑:一个选项是使用可怕的safe_mode。请参阅manual on exec

  

注意:启用安全模式时,您   只能执行中的文件   safe_mode_exec_dir之。 ...

理论上,您可以将ffmpeg二进制文件放在任意目录中,并将该目录的路径提供给safe_mode_exec_dir。这样,用户只能在该目录中运行可执行文件。但你必须尝试在现实生活中看到这种设置的含义......

关于PHP扩展请求:PHP ffmpeg扩展只是一个信息扩展。如果您需要可以在实际文件上执行操作的文件,则需要基于ffmpeg库构建新扩展。

如果您计划在共享主机上执行此操作,则很可能是运气不好。标准问题共享托管服务提供商不会提供这样的视频功能。视频托管和处理最多需要专门的托管。

答案 2 :(得分:2)

如果您出于安全原因不想在网络服务器上使用exec()并且视频不必“实时”转换,您可以使用类似unix的cronjob来创建一个php-脚本并使用php-interpreter。

http://www.makeuseof.com/tag/bring-linux-cron-like-power-to-windows/http://www.visualcron.com/

a)用户上传视频,此视频将保存到临时路径。视频获取id和时间戳,并将其保存到数据库中。

b)每隔15分钟,调用一个与Web服务器无关的php脚本,jar文件或c#-executable来创建ffmpeg命令和必要的参数。然后文件被转换,移动到'转换'文件夹,原始文件被删除或移动到'archive'-folder并且数据库被更新。

答案 3 :(得分:1)

  

http://ffencoderd.sourceforge.net/index.html

     

使用作业队列和基于XML的   通讯,视频可以这样发送   它们是编码的。

听起来像是对我的计划。

答案 4 :(得分:0)

你需要在某个地方执行。如果你不能在你的主机上做另一个解决方案是让另一个系统下载转换,然后上传转换后的视频并重复。一个更有想法的解决方案是发布到另一个在线帐户转换和下载。在这些选项之间,第一个是可扩展的。

这些解决方案都不是我所知道的现成的。他们需要创建。

我认为在开放式PHP或Perl中未处理格式的原因是因为潜在的许可问题。 FLV不是一种开源格式。所以perl和php框架使用ffmpeg

制作一个exec请求来处理视频

答案 5 :(得分:0)

另一种选择是使用Suhosin。然后,您可以至少限制系统调用的确切位置,从而限制对该目录的访问。

这是vhost.conf配置的一个基本示例,其中除了使用Suhosin的ffmpeg-folder之外,域中的shell_exec被阻止了

<virtualhost *:80>
ServerName your.server
DocumentRoot "/var/your/public_html"
php_admin_value suhosin.executor.func.blacklist "shell_exec, passthru, show_source, system, pcntl_exec, popen, pclose, proc_open, proc_nice, proc_terminate, proc_get_status, proc_close, leak, apache_child_terminate, posix_kill, posix_mkfifo, posix_setpgid, posix_setsid, posix_setuid, escapeshellcmd, escapeshellarg, exec"

<Directory "/var/your/public_html/ffmpeg-folder">
php_admin_value suhosin.executor.func.blacklist "passthru, show_source, system, pcntl_exec, popen, pclose, proc_open, proc_nice, proc_terminate, proc_get_status, proc_close, leak, apache_child_terminate, posix_kill, posix_mkfifo, posix_setpgid, posix_setsid, posix_setuid, escapeshellcmd, escapeshellarg, exec"
</Directory>
</virtualhost>

答案 6 :(得分:0)

尝试使用pclose(popen($cmd, 'r'));代替exec()

答案 7 :(得分:-1)

也许你可以在php中连接到ssh并在那里执行命令。