Команда PowerShell для ffmpeg для рекурсивной обработки элементов в папке

783
user260467

Я пытаюсь выяснить, какая команда PowerShell [или сценарий, если необходимо] может позволить ffmpegрекурсивно пройти по каталогу, извлекать кадры через -vfфлаг и помещать все кадры в папку без каких-либо конфликтов имен файлов, которые могут привести к перезаписи.

Итак, я знаю, что это прекрасно работает для отдельного файла:

ffmpeg -i input.mov -vf fps=10/60 still%04d.jpg 

Файлы генерироваться начинаются с still0001.jpgи сосчитать до still0002.jpg, still0003.jpgи т.д.

У меня есть каталог, который выглядит так, с видеофайлами на разных уровнях:

  • topFolder1
    • midFolder1
      • video1.mov
      • video2.mov
    • midFolder2
      • video3.mov
      • video4.mov

Я пытаюсь использовать команду PowerShell, которая может вытащить кадры из всех видео video1.mov, video2.mov, video3.mov, и video4.movи падение их в одну папку.

Я нашел команду PowerShell, которая подразумевает, что ffmpeg рекурсивно пересекает каталог, но когда я пытаюсь его адаптировать, он не работает.

Я бегу:

PS T:\Exports\1 - Dailies\stills test> for /F "tokens=*" "%G" IN ('dir "T:\Exports\1 - Dailies" *.mov') do ffmpeg -i "%G" -vf fps=10/60 still%05d.jpg 

Но я получаю эту ошибку:

At line:1 char:4 + for /F "tokens=*" "%G" IN ('dir "T:\Exports\1 - Dailies" *.mov') do f... + ~ Missing opening '(' after keyword 'for'. + CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException + FullyQualifiedErrorId : MissingOpenParenthesisAfterKeyword 

Куда я иду не так?

1
Команда, которую вы запускаете, предназначена для запуска cmd.exe или пакетного файла. Не PowerShell. Чтобы преобразовать это в powershell, исследуйте следующие команды: `Get-ChildItem`,` foreach` и `Invoke-Expression`. EBGreen 5 лет назад 0
@EBGreen ОК. Запуск его в `cmd.exe` возвращает:` "% G" в это время было неожиданным. Есть идеи? user260467 5 лет назад 0
Ссылка, которую вы указали, буквально говорит о том, что вам нужно удвоить символы%. Команда в этой ссылке также цитируется иначе, чем команда, которую вы запускаете. EBGreen 5 лет назад 0
@ user260467 Попробуйте преобразовать свою логику рутинной итерации в команды PS, отредактируйте свой вопрос в соответствии с тем, что вы пытаетесь сделать с помощью кода, чтобы потенциально привлечь больше внимания при необходимости. Просто возьмите несколько минут и отметьте меня позже. В противном случае запустите вашу зацикленную команду из `cmd.exe`, а не` powershell.exe` и посмотрите, что произойдет, потому что по крайней мере ошибка `В строке: 1 символ: 4` не должна возникать. Pimp Juice IT 5 лет назад 0
@EBGreen Да, это не пакетный файл `.bat`. Кроме того, я _am_ пробую другую команду. user260467 5 лет назад 0

1 ответ на вопрос

1
John Stewien

Вот пример команды powershell для преобразования всех файлов в каталоге в mp4 и изменения размера до 1280x720:

dir *.* | foreach-object { $newname = $_.Name.Remove($_.Name.Length - $_.Extension.Length) + ".mp4"; .\ffmpeg.exe -i "$_" -s 1280x720 $newname }