有木有玩过 ffmpeg 的童鞋?

2015-12-14 13:24:24 +08:00
 cevincheung

使用 exec 命令调用 ffmpeg 。无论怎么设置参数(可能有隐藏参数没看到)都无法获取到返回值,因为要获取视频的信息所以一定要能获取到 metadata 。- -#

调用 exec 命令 ffmpeg 直接输出了,并没有任何返回值- -

3429 次点击
所在节点    PHP
18 条回复
skydiver
2015-12-14 13:37:40 +08:00
这个跟 ffmpeg 没关系。
你需要的是仔细看看 php 的文档 https://secure.php.net/manual/zh/function.exec.php
cevincheung
2015-12-14 16:53:37 +08:00
@skydiver

output 始终是 array(0) {}
return 始终是 string(0) ""
&$return_var 唯独这个有用。但是无法获取 ffmepg 强制输出的内容。
skydiver
2015-12-14 16:57:53 +08:00
@cevincheung 直接在命令行里运行是什么结果?
cxbig
2015-12-14 17:01:26 +08:00
先把你的 code 贴出来好吧,不然怎么知道你的问题在哪?
wxg4net
2015-12-14 17:13:52 +08:00
$return_var 返回的值是什么 这个值代表了程序是否成功执行
simon7
2015-12-14 18:43:22 +08:00
ffmpeg 的输出,好像是输出到 error 那个流里面的
snailsir
2015-12-14 18:46:57 +08:00
当年为了将 m4a 转为 MP3 格式的,光安装就废了半天劲,后台终于勉强转换成功了,但貌似音质有损,不知是哪的问题。。。。
juice
2015-12-14 22:03:29 +08:00
2 > &1
cevincheung
2015-12-14 22:05:16 +08:00
@cxbig code 附上了
cevincheung
2015-12-14 22:05:57 +08:00
@juice 不行,这样获取不到任何输出了。难道一定要把转换放到后台然后把输出扔到一个随机文件里?
cxbig
2015-12-14 22:22:10 +08:00
语法错误,-i <filename>是指定输入文件,除非你要给输出的文件名。的确可以用这个命令来单纯查看文件信息,不过,输出都在 stderr 里,你要去“ 2 ”里取出来
所以命令要加一个错误信息转向:
ffmpeg -i input.flv 2>&1
这样$output 就能收到了
cxbig
2015-12-14 22:23:52 +08:00
补一下相关 bash 知识, stdin, stdout, stderr, 2>&1 这些东西的含义
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;

?>
cevincheung
2015-12-14 23:02:24 +08:00
@wheat input 哪里来的?
cevincheung
2015-12-14 23:09:22 +08:00
@cxbig
@wheat

额外一个问题,处理命令输出输入是不是不能进行交互?比如回答 yes 等。 proc_open 的管道 fwrite 进去 y?
sitiao
2015-12-14 23:30:28 +08:00
用 C/C++写一个 PHP 的扩展,在扩展里面掉 ffmpeg ,应该就可以实现交互了。
cxbig
2015-12-15 00:07:28 +08:00
@cevincheung 一般命令行交互都有相关参数屏蔽 prompt ,你要查。
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 那么表示这个命令运行遇到错误了 所以就要查看你的执行命令了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/243405

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX