3

Я новичок в FFmpeg и пытаюсь понять это. Я нашел это для пакетной обработки и этот ответ для ротации видео, но мне нужно собрать их вместе.

Может кто-нибудь объяснить, как создать сценарий для этого действия в Windows?

1 ответ1

2

По сути, вам просто нужно посмотреть файлы (сохранить их в переменной) и затем передать эти найденные файлы в FFmpeg.

Конечно, пакетного языка Windows было бы достаточно для этого. Но так как у меня с этим нет опыта, вот сценарий PowerShell-Script:

# Searching for files with the Get-ChildItem cmdlet and saving their relevant properties in an array:
# NOTE: -File will only work with PowerShell-versions >= 3.
[array]$FilesToRotate = Get-ChildItem -Path "C:\PATH_TO_FILES" ((-Filter *.mp4)) ((-Recurse)) -File | ForEach-Object {
    # NOTE: This part is a bit tricky - I just added it so I'm able to save the parent-path of each file in an object.
    # NOTE: One could also omit the whole ForEach-Object and use the Split-Path cmdlet inside the output-file's specification in FFmpeg's code.
    [PSCustomObject]@{
        InFullName = $_.FullName
        # Will put the output-file in the same folder as the input-file and add "_ROTATION" as suffix in its name.
        OutFullName = "$(Split-Path -Parent -Path $($_.FullName))\$($_.BaseName)_ROTATE$($_.Extension)"
    }
}

# Processing the files with FFmpeg using PowerShell's Start-Process cmdlet:
for($i=0; $i -lt $FilesToRotate.Length; $i++){
    Start-Process -FilePath "C:\PATH_TO_FFMPEG\ffmpeg.exe" -Argumentlist " -i `"$($FilesToRotate[$i].InFullName)`" -c copy -metadata:s:v:0 rotate=<x> `"$($FilesToRotate[$i].OutFullName )`" " ((-Wait)) ((-NoNewWindow))
}

Этот скрипт запустит FFmpeg с предоставленным вами кодом (я его не проверял, но вы все равно можете легко его заменить) и сохраните полученный файл в той же папке с именем-суффиксом "_ROTATE" - так что MyMovie2017.mov будет стать "MyMovie2017_ROTATE.mov". (Если вы хотите отобразить их в совершенно новую папку, замените $($FilesToRotate[$i].ParentPath) с путем, который вам нравится.)

Примечания: в двойных скобках (( )) необязательно:

  • -Filter будет адресован только (одному) конкретному типу файлов, например, * .mp4 найдет только MP4-файлы. Если у вас есть более одного типа файлов, но многие файлы вам не нужно преобразовывать (например, текстовые файлы), вы можете либо- -Exclude все форматы, которые вы не хотите преобразовывать, либо -Include только те, которые должны быть преобразованы (-Include похож на -Filter - он медленнее, но может включать более одного формата.)
  • -Recurse также рассмотрит подпапки. Вы также можете использовать -Depth с PowerShell v 5+.
  • -Wait будет открывать один экземпляр ffmpeg за раз - без него все экземпляры будут открываться параллельно.
  • -NoNewWindow покажет выходные данные вашего экземпляра ffmpeg на консоли PowerShell, а без него каждый экземпляр ffmpeg откроется в новом окне консоли. Имеет смысл только с -Wait .

Вам придется удалить все двойные скобки (и их содержимое, если вы этого не хотите) перед запуском скрипта.

Также эти вещи нужно адаптировать:

  • C:\PATH_TO_FILES Путь к вашим файлам, очевидно.
  • C:\PATH_TO_FFMPEG\ffmpeg.exe Путь к вашему ffmpeg.exe, очевидно.
  • rotate=<x> - вам нужно заменить <x> на 90 , 180 или 270 . (Как объяснено в источнике кода)

Если что-то требует большего объяснения, я с радостью помогу.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .