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

PHP exec使用ffmpeg转换目录中的所有文件,php,directory,ffmpeg,exec,Php,Directory,Ffmpeg,Exec,如何循环浏览扩展名为.flv的目录中的视频文件,并使用exec使用ffmpeg-i original.avi final.mpg 在转换当前文件时,阵列中的下一个文件名应等待exec进程完成,然后再继续转换阵列中的其他文件名 我知道我可以使用scandir($dir)创建一个所有文件名的数组,然后可能使用split只针对.flv文件。这是最好的方法吗。如果我使用while循环来遍历每个文件名并对其执行exec,那么在转到数组中的下一个文件之前,如何确保exec文件已完全转换 $dir='/pat

如何循环浏览扩展名为.flv的目录中的视频文件,并使用exec使用
ffmpeg-i original.avi final.mpg

在转换当前文件时,阵列中的下一个文件名应等待exec进程完成,然后再继续转换阵列中的其他文件名

我知道我可以使用
scandir($dir)
创建一个所有文件名的数组,然后可能使用split只针对
.flv
文件。这是最好的方法吗。如果我使用while循环来遍历每个文件名并对其执行exec,那么在转到数组中的下一个文件之前,如何确保exec文件已完全转换

$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代码解释:

  • 第一行使用命令
    cd

    参考:
  • 第二行启动一个for循环,重复其中的代码,而
    $i
    变量包含当前工作目录中的文件名,该文件的模式如下:
    *.flv
    。每次迭代都会将
    $i
    的值更改为当前工作目录中的下一个文件名。
    参考:和
  • 第三行将值
    $(basename“$i”.flv).mpg
    分配给名为
    OUTFILE
    的变量
    请参阅:、和
  • 第四行启动ffmpeg并告诉它将
    $i
    中的文件转换为名为
    $i
    的文件,但其后缀改为“mpg”而不是“flv”。(后缀更改在第三行完成)
  • 第五行结束for循环
  • 以下内容应与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.'"');
    }
    
    请参阅:、和

    BASH代码解释:

  • 第一行使用命令
    cd

    参考:
  • 第二行启动一个for循环,重复其中的代码,而
    $i
    变量包含当前工作目录中的文件名,该文件的模式如下:
    *.flv
    。每次迭代都会将
    $i
    的值更改为当前工作目录中的下一个文件名。
    参考:和
  • 第三行将值
    $(basename“$i”.flv).mpg
    分配给名为
    OUTFILE
    的变量
    请参阅:、和
  • 第四行启动ffmpeg并告诉它将
    $i
    中的文件转换为名为
    $i
    的文件,但其后缀改为“mpg”而不是“flv”。(后缀更改在第三行完成)
  • 第五行结束for循环
  • 以下内容应与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.'"');
    }
    

    请参阅:、和。

    谢谢,这看起来很棒,但我对linux bash命令不太熟悉。您能否解释bash命令是如何工作的,特别是OUTFILE=part。*.flv后的分号正确吗。该命令如何知道一次只处理一个文件,从而不会同时对所有文件执行ffmpeg。我们可以用纯php实现这一点吗bash命令解决方案给出了一个php语法错误。php解决方案非常有效。我用一个包含50个视频的文件夹尝试了php解决方案。我以为通过关闭浏览器窗口,循环浏览视频的过程将被终止,但它最终转换了所有50个视频。你知道一种简单的方法来杀死整个过程吗?@Pinkie:给你的php语法错误是什么?为了终止该进程,我建议将整个BASH命令解决方案的进程ID(aka PID)存储在数据库中(通过将其设置为后台进程并使用
    $!
    获取PID值),并在需要时终止该进程。但这是另一个主题的问题(我认为是系统管理员的问题)谢谢,这看起来很棒,但我对LinuxBash命令不太熟悉。您能否解释bash命令是如何工作的,特别是OUTFILE=part。*.flv后的分号正确吗。该命令如何知道一次只处理一个文件,从而不会同时对所有文件执行ffmpeg。我们可以用纯php实现这一点吗bash命令解决方案给出了一个php语法错误。php解决方案非常有效。我用一个包含50个视频的文件夹尝试了php解决方案。我以为通过关闭浏览器窗口,循环浏览视频的过程将被终止,但它最终转换了所有50个视频。你知道一种简单的方法来杀死整个过程吗?@Pinkie:给你的php语法错误是什么?为了终止该进程,我建议将整个BASH命令解决方案的进程ID(aka PID)存储在数据库中(通过将其设置为后台进程并使用
    $!
    获取PID值),并在需要时终止该进程。但这是另一个话题的问题(我想是系统管理员的问题)