PHP exec使用ffmpeg转换目录中的所有文件
如何循环浏览扩展名为.flv的目录中的视频文件,并使用exec使用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
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
参考:
$i
变量包含当前工作目录中的文件名,该文件的模式如下:*.flv
。每次迭代都会将$i
的值更改为当前工作目录中的下一个文件名。参考:和
$(basename“$i”.flv).mpg
分配给名为OUTFILE
的变量请参阅:、和
$i
中的文件转换为名为$i
的文件,但其后缀改为“mpg”而不是“flv”。(后缀更改在第三行完成)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
参考:
$i
变量包含当前工作目录中的文件名,该文件的模式如下:*.flv
。每次迭代都会将$i
的值更改为当前工作目录中的下一个文件名。参考:和
$(basename“$i”.flv).mpg
分配给名为OUTFILE
的变量请参阅:、和
$i
中的文件转换为名为$i
的文件,但其后缀改为“mpg”而不是“flv”。(后缀更改在第三行完成)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值),并在需要时终止该进程。但这是另一个话题的问题(我想是系统管理员的问题)