Я новичок в FFmpeg и пытаюсь понять это. Я нашел это для пакетной обработки и этот ответ для ротации видео, но мне нужно собрать их вместе.
Может кто-нибудь объяснить, как создать сценарий для этого действия в Windows?
Я новичок в FFmpeg и пытаюсь понять это. Я нашел это для пакетной обработки и этот ответ для ротации видео, но мне нужно собрать их вместе.
Может кто-нибудь объяснить, как создать сценарий для этого действия в Windows?
По сути, вам просто нужно посмотреть файлы (сохранить их в переменной) и затем передать эти найденные файлы в 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
. (Как объяснено в источнике кода)Если что-то требует большего объяснения, я с радостью помогу.