сжать видео с помощью ffmpeg, затем переместиться в соответствующую папку - PullRequest
0 голосов
/ 16 февраля 2019

У меня есть структура каталогов с необработанными видео .avi, которые находятся внутри этих каталогов.Я пытаюсь создать скрипт, который будет:

  1. Скопировать структуру каталогов на NAS
  2. Сжать необработанные видео .avi в формат .mp4
  3. Переместитьпреобразованное видео .mp4 в соответствующий каталог на NAS (преобразованный файл должен находиться в каталоге с тем же именем, что и исходный каталог)
  4. Удалить исходное необработанное видео .avi

Ниже приведена команда ffmpeg, которую я использую для сжатия видео.

ffmpeg -i <origVid>.avi -c:v h264 -crf 17 <convertedVid>.mp4

Я нашел несколько фрагментов PowerShell.Приведенный ниже код скопирует структуру каталогов:

$sourceDir = "D:\Videos"
$targetDir = "H:\Converted"
Copy-Item $sourceDir $targetDir -Filter {PSIsContainer} -Recurse -Force

А следующий фрагмент будет сжимать видео в отдельных папках

$origVids = Get-ChildItem .\*.avi -Recurse
foreach ($origVid in $origVids) {
    $convertedVid = [io.path]::ChangeExtension($origVid, '.mp4')
    .\ffmpeg.exe -i $origVid -c:v h264 -crf 17 $convertedVid
}

Я мог бы просто переместить все на NAS и выполнитьконвертировать туда и сдуть файлы в каталог на исходном компьютере;однако это немного неэффективно и потребляет тонны полосы пропускания.Я хотел бы сжать видео, а затем переместить меньший преобразованный файл на NAS в соответствующем каталоге.К сожалению, я не могу понять, как переместить преобразованные видео в соответствующие каталоги на NAS.Любая помощь будет принята с благодарностью!


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

Пример структуры каталогов файлов:

longdirectorynameinhashformat1
  video1a.avi
  video2a.avi
  video3a.avi
longdirectorynameinhashformat2
  video1b.avi
  video2b.avi
  video3b.avi

Моя логика заключается в следующем с использованием описанной выше структуры папок, но я не уверен, что это возможно при записи в PowerShell или в пакете MS-DOS:

  1. Создать 'longdirectoryinhashformat1' на NAS
  2. Сжать все.avi файлы в один каталог
  3. Переместить все сжатые (.mp4) файлы в каталог с одинаковым именем на NAS
  4. Удалить исходный каталог и его содержимое
  5. Создать 'longdirectoryinhashformat2'на NAS
  6. ... промойте и повторяйте до тех пор, пока на исходном компьютере ничего не останется.

Примечание. Это будет выполняться ночью в задании cron (или аналоге Windows).

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

Вместо PowerShell я использую следующий пакетный скрипт, где «D: \» - это сопоставленный общий ресурс NAS, в котором я буду хранить сжатые видео.Хотя мне хотелось бы знать эквивалент PowerShell.

@echo off
Rem Replicate directory structure on NAS (where g: is the drive letter for the NAS share)
for /d %%d in (*.*) do mkdir g:\%%d

Rem FFmpeg processing for all files that end in *.avi.  You can change *.avi to whatever extension you need.
call :treeProcess
goto :eof

:treeProcess
for %%f in (*.avi) do ffmpeg -i "%%f" -c:v h264 -crf 17 "g:\%%d\%%~nf".mp4
for /D %%d in (*) do (
  cd %%d
  call :treeProcess
  cd ..
)
exit /b
0 голосов
/ 16 февраля 2019

Конечно, ffmpeg не находится под контролем PowerShell.Что касается маркеров ---

1. Скопируйте структуру каталогов на NAS. Просто используйте Copy-Item или robocopy

2. Сожмите необработанные видео .avi в формат .mp4

Сжатие, как вам нравится

3. Переместите преобразованное видео .mp4 в соответствующий каталог на NAS (преобразованный файл должен находиться в каталоге с таким жеимя в качестве исходного каталога)

Использовать Move-Item или robocopy

4. Удалите исходное необработанное видео .avi

Использовать Удалить-Пункт

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...