PHP exec для преобразования всех файлов в каталоге с использованием ffmpeg - PullRequest
1 голос
/ 27 июля 2011

Как зациклить видеофайлы в каталоге с расширением .flv и использовать exec для преобразования каждого из них (по одному) в mpg, используя ffmpeg -i original.avi final.mpg

Во время преобразования текущего файла,следующее имя файла в массиве должно дождаться завершения процесса exec, прежде чем переходить к другому имени файла в массиве и преобразовывать его.

Я знаю, что могу использовать scandir($dir) для создания массива всех имен файлов, а затем, возможно, использовать split для целевых .flv файлов.Это лучший способ сделать это.Если я использую цикл while для запуска каждого имени файла и выполнения exec для него, как мне убедиться, что exec-файл полностью преобразован, прежде чем перейти к следующему файлу в массиве.

1 Ответ

6 голосов
/ 27 июля 2011
$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.
    См .: Перемещение по файловой системе @ tldp.org
  2. Вторая строка запускает цикл for, который повторяет код внутри него, а переменная $i содержит имя файла из текущего рабочего каталога следующего шаблона: *.flv. Каждая итерация изменяет значение $i на следующее имя файла в текущем рабочем каталоге.
    См. цикл for @ tldp.org и Loops @ tldp.org .
  3. Третья строка присваивает значение $(basename "$i" .flv).mpg переменной с именем OUTFILE.
    См. Subshells @ tldp.org , basename @ tlpd.org и Подстановка команд @ tlpd.org .
  4. Четвертая строка запускает ffmpeg и говорит ему преобразовать файл в $i в файл с именем, подобным $i, но с суффиксом, измененным на «mpg» вместо «flv». («Изменение суффикса» выполняется в третьей строке)
  5. Пятая строка завершает цикл 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.'"');
}

См .: glob () , chdir () и substr () .

...