Я новичок в FFmpeg и пытаюсь разобраться. Я нашел это дляПакетная обработкаи этот ответ дляротация видеоно мне нужно их собрать воедино.
Может ли кто-нибудь объяснить, как создать скрипт для этого действия в Windows?
решение1
По сути, вам просто нужно найти файлы (сохранить их в переменной), а затем передать найденные файлы в FFmpeg.
Конечно,Для этого было бы достаточно языка пакетной обработки Windows.. Но поскольку у меня в этом нулевой опыт, вот PowerShell-скрипт:
# 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-Console, тогда как без него каждый экземпляр ffmpeg будет открываться в новом окне консоли. Имеет смысл только с-Wait
.
Перед запуском скрипта вам придется удалить все двойные скобки (и их содержимое, если оно вам не нужно).
Кроме того, необходимо адаптировать следующие вещи:
C:\PATH_TO_FILES
Путь к вашим файлам, очевидно.C:\PATH_TO_FFMPEG\ffmpeg.exe
Путь к вашему ffmpeg.exe, очевидно.rotate=<x>
- вам нужно заменить<x>
на90
,180
, или270
. (Как объяснено в исходнике кода)
Если что-то требует дополнительных объяснений, я буду рад помочь.
решение2
Решение в одну линию
npx rotate-video --source=source_path --destination=destination_path --extension=MP4 --angel=270
Примечание:FFMPEG
Сначала вам нужно установить CLI.установить