Решение в одну линию

Решение в одну линию

Я новичок в 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.установить

Связанный контент