使用 exec 命令调用 ffmpeg 。无论怎么设置参数(可能有隐藏参数没看到)都无法获取到返回值,因为要获取视频的信息所以一定要能获取到 metadata 。- -#
调用 exec 命令 ffmpeg 直接输出了,并没有任何返回值- -
附上 code
<?php
$return = exec(__DIR__."/ffmpeg -i ".__DIR__."/in.flv",$output,$return_val);
var_dump($return);
var_dump($output);
var_dump($return_val);
1
skydiver 2015-12-14 13:37:40 +08:00
这个跟 ffmpeg 没关系。
你需要的是仔细看看 php 的文档 https://secure.php.net/manual/zh/function.exec.php |
2
cevincheung OP |
3
skydiver 2015-12-14 16:57:53 +08:00
@cevincheung 直接在命令行里运行是什么结果?
|
4
cxbig 2015-12-14 17:01:26 +08:00 via iPhone
先把你的 code 贴出来好吧,不然怎么知道你的问题在哪?
|
5
wxg4net 2015-12-14 17:13:52 +08:00
$return_var 返回的值是什么 这个值代表了程序是否成功执行
|
6
simon7 2015-12-14 18:43:22 +08:00 via iPhone
ffmpeg 的输出,好像是输出到 error 那个流里面的
|
7
snailsir 2015-12-14 18:46:57 +08:00
当年为了将 m4a 转为 MP3 格式的,光安装就废了半天劲,后台终于勉强转换成功了,但貌似音质有损,不知是哪的问题。。。。
|
8
juice 2015-12-14 22:03:29 +08:00
2 > &1
|
9
cevincheung OP @cxbig code 附上了
|
10
cevincheung OP @juice 不行,这样获取不到任何输出了。难道一定要把转换放到后台然后把输出扔到一个随机文件里?
|
11
cxbig 2015-12-14 22:22:10 +08:00
语法错误,-i <filename>是指定输入文件,除非你要给输出的文件名。的确可以用这个命令来单纯查看文件信息,不过,输出都在 stderr 里,你要去“ 2 ”里取出来
所以命令要加一个错误信息转向: ffmpeg -i input.flv 2>&1 这样$output 就能收到了 |
12
cxbig 2015-12-14 22:23:52 +08:00
补一下相关 bash 知识, stdin, stdout, stderr, 2>&1 这些东西的含义
|
13
wheat 2015-12-14 22:54:30 +08:00
<?php
$cmd = "/usr/local/bin/ffmpeg -i ~/Downloads/laji.mp4" $proc = proc_open($cmd, array(array('pipe', 'r'),array('pipe', 'w'),array('pipe', 'w')), $pipes); fwrite($pipes[0], $input); fclose($pipes[0]); $stdout = stream_get_contents($pipes[1]); fclose($pipes[1]); $stderr = stream_get_contents($pipes[2]); fclose($pipes[2]); $return_code = (int)proc_close($proc); echo $stderr; ?> |
14
cevincheung OP @wheat input 哪里来的?
|
15
cevincheung OP |
16
sitiao 2015-12-14 23:30:28 +08:00
用 C/C++写一个 PHP 的扩展,在扩展里面掉 ffmpeg ,应该就可以实现交互了。
|
17
cxbig 2015-12-15 00:07:28 +08:00 via iPhone
@cevincheung 一般命令行交互都有相关参数屏蔽 prompt ,你要查。
|
18
wxg4net 2015-12-15 08:11:52 +08:00
@cevincheung @wheat 给出了一个很 NB 的例子。 参考 http://php.net/manual/zh/function.proc-open.php (proc_open — 执行一个命令,并且打开用来输入 /输出的文件指针) 帮助你理解。
另外 参数的意义要充分了解。比如 return_var 如果为非 0 那么表示这个命令运行遇到错误了 所以就要查看你的执行命令了。 |