PHP exec使用ffmpeg转换目录中的所有文件

时间:2011-07-26 23:57:13

标签: php directory ffmpeg exec

如何在扩展名为.flv的目录中循环播放视频文件,并使用exec将每一个(一次一个)转换为mpg,使用ffmpeg -i original.avi final.mpg

当前文件正在转换时,数组中的下一个文件名应该等到exec进程完成后再继续并转换数组中的其他文件名。

我知道我可以使用scandir($dir)创建所有文件名的数组,然后可以使用split来仅定位.flv个文件。这是最好的方法吗?如果我使用while循环运行每个文件名并对其执行exec,我如何确保exec文件完全转换后再转到数组中的下一个文件。

1 个答案:

答案 0 :(得分:6)

$dir='/path/to/dir';
$bash_commands = 'cd "'. $dir .'"
for i in *.flv; do 
    OUTFILE=$(basename "$i" .flv).mpg
    ffmpeg -i "$i" -f mpg "$OUTFILE"
done';
exec($bash_commands);

BASH代码说明:

  1. 第一行使用命令cd更改当前工作目录 请参阅:Moving around the filesystem @ tldp.org
  2. 第二行启动for循环,重复其中的代码,而$i变量包含当前工作目录中具有以下模式的文件的名称:*.flv。每次迭代都会将$i的值更改为当前工作目录中的下一个文件名 请参阅:The for loop @ tldp.orgLoops @ tldp.org
  3. 第三行将值$(basename "$i" .flv).mpg指定给名为OUTFILE的变量。
    请参阅:Subshells @ tldp.orgbasename @ tlpd.orgCommand Substitution @ tlpd.org
  4. 第四行启动ffmpeg并告诉它将$i中的文件转换为名为$i的文件,但将其后缀更改为“mpg”而不是“flv”。 (“后缀更改”在第三行完成)
  5. 第五行结束for循环。
  6. 以下应该是PHP等价物:

    chdir('/path/to/current/working/dir');
    foreach (glob("*.flv") as $filename) {
        $OUTFILE = substr($filename, 0, -3) . 'mpg';
        exec('ffmpeg -i "'.$filename.'" -f mpg "'.$OUTFILE.'"');
    }
    

    请参阅:glob()chdir()substr()