Как вы вращаете весь каталог видео с помощью ffmpeg?

558
ThirteenthMonth

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

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

3
Какая операционная система? 8bittree 6 лет назад 4
Используйте команду `for` с командой ffmpeg. Но синтаксис команды `for` может варьироваться в зависимости от ОС. Biswapriyo 6 лет назад 0
Привет, спасибо за ответы. Чтобы уточнить, я пытаюсь сделать это на Windows. ThirteenthMonth 6 лет назад 0

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

2
flolilolilo

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

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

Спасибо за помощь! Я получил его после некоторых проб и ошибок, удалив текст "-File". Итак, это выглядело так: [массив] $ FilesToRotate = Get-ChildItem -Path "C: \ PATH_TO_FILES" ThirteenthMonth 6 лет назад 0
Не могли бы вы сказать мне, что должен был делать "-File"? Я только удалил это после того, как он допустил ошибку и заставил это работать. ThirteenthMonth 6 лет назад 0
`-File` не позволит Get-ChildItem включать папки в переменную. Без `-File` (и / или` -Filter`) `$ FilesToRotate` будет включать даже подпапки, поэтому PowerShell попытается передать ваши подпапки в качестве входного файла для FFmpeg. Обратите внимание, что мы говорим о самой папке; мы не говорим о рекурсивном поиске здесь. [Документацию по Get.-ChildItem можно найти здесь.] (Https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/get-childitem?view=powershell-5.1) flolilolilo 6 лет назад 0
@ThirteenMonth Не могли бы вы сказать мне, какую ошибку он выдает? Когда я пробую это с `-File`, это работает безупречно. Кроме того, не могли бы вы сказать мне версию PS, которую вы используете? (Просто введите `$ PSVersionTable` в консоль и нажмите Enter - это первое значение.) Большое спасибо! flolilolilo 6 лет назад 0
Ввод $ PSVersionTable Я получил все это: "" PS C: \ Users \> $ PSVersionTable Имя Значение ---- ----- CLRVersion 2.0.50727.8669 BuildVersion 6.1.7601.17514 PSVersion 2.0 WSManStackVersion 2.0 PSCompatibleVersions SerializationVersion 1.1.0.1 PSRemotingProtocolVersion 2.1 "" Да, я удалил -Recurse, -Filter для тестирования без, а затем, как только -File был удален, все заработало. Это мой первый раз с этим, так что причина. ThirteenthMonth 6 лет назад 0
Ах, в PowerShell <версия 3 параметр `-File` не был включен. Если вы действительно хотите его использовать, я бы посоветовал вам обновить вашу PowerShell-установку, хотя было бы немного излишним просто конвертировать несколько файлов. ;-) В любом случае, я добавил эту информацию в скрипт в качестве комментария. flolilolilo 6 лет назад 1