V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
cevincheung
V2EX  ›  PHP

有木有玩过 ffmpeg 的童鞋?

  •  
  •   cevincheung · 2015-12-14 13:24:24 +08:00 · 3404 次点击
    这是一个创建于 3268 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    第 1 条附言  ·  2015-12-14 22:05:00 +08:00

    附上 code

    <?php
    $return = exec(__DIR__."/ffmpeg -i ".__DIR__."/in.flv",$output,$return_val);
    
    var_dump($return);
    var_dump($output);
    var_dump($return_val);
    
    18 条回复    2015-12-15 08:11:52 +08:00
    skydiver
        1
    skydiver  
       2015-12-14 13:37:40 +08:00
    这个跟 ffmpeg 没关系。
    你需要的是仔细看看 php 的文档 https://secure.php.net/manual/zh/function.exec.php
    cevincheung
        2
    cevincheung  
    OP
       2015-12-14 16:53:37 +08:00
    @skydiver

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

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

    额外一个问题,处理命令输出输入是不是不能进行交互?比如回答 yes 等。 proc_open 的管道 fwrite 进去 y?
    sitiao
        16
    sitiao  
       2015-12-14 23:30:28 +08:00
    用 C/C++写一个 PHP 的扩展,在扩展里面掉 ffmpeg ,应该就可以实现交互了。
    cxbig
        17
    cxbig  
       2015-12-15 00:07:28 +08:00 via iPhone
    @cevincheung 一般命令行交互都有相关参数屏蔽 prompt ,你要查。
    wxg4net
        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 那么表示这个命令运行遇到错误了 所以就要查看你的执行命令了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2640 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 10:58 · PVG 18:58 · LAX 02:58 · JFK 05:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.