
Я пытаюсь управлять записями видеонаблюдения и пытаюсь сжать их пакетно с помощью ffmpeg.
Пока что мне удалось придумать эту команду
ffmpeg -i "0515 210004.mp4" -b 200000 output.avi
Но мне нужно сделать их все сразу,ноисключить текущую дату
Итак, если сегодня 16.05, то в моей папке есть
"0515 210004.mp4"
"0515 220004.mp4"
"0515 230004.mp4"
"0516 000004.mp4"
"0516 010004.mp4"
И так далее
Мне нужно преобразовать только те файлы, которые содержат 0515, и каждый день это число должно увеличиваться, поэтому 17.05 мне понадобится преобразовать все файлы, содержащие 0516.
Иногда также есть файлы, которые будут иметь_1в них, например "0515 180004_1.mp4"
(004 в конце — этовсегдатам)
И мне также нужно, чтобы он выводился с точно таким же именем.
Я вижу что-то вроде этого
for %%A IN (*.mp4) DO ffmpeg -i "contains "%date% - 1day"" -b 200000 "oldfilename.avi"
Я понимаю, что это не сработает, но давайте назовем это моим псевдокодом.
Есть ли у вас идеи, как мне выполнить свою задачу?
О, и я использую Windows 7 x64.
Также, если у вас есть какие-либо предложения по части ffmpeg, я буду очень рад скорректировать мой код.
решение1
Я ценю ваш вопрос, потому что вы заявили«Есть ли у вас какие-нибудь идеи, как мне выполнить свою задачу?»и вы не просили писать код. Я думаю, вы хотите научиться. Так что этот ответ.
- Сосредоточьтесь на том, что являетсяКлюч, что-то уникальное и позволяет вам выбирать только те элементы, над которыми вам нужно работать. В этом случае вы только что сказали, чтопервые четыре символа в именифайлов в текущем каталоге. Хорошо.
Хорошо даже больше, потому что они имеют одинаковую длину, если это 1 июня или 31 декабря (даже если вы не обязаны это использовать).
Теперь вы можете написать свой пакетный скрипт шаг за шагом:
Постройте струны для вчерашнего и завтрашнего дня [д1,д2,д3...] .
$date = Get-Date; $date=$date.AddDays(-1); $date.ToString('yyyy-MM-dd')
Обратите внимание, что вам нужно изменить здесь выше формат и имя переменной, это вам также понадобится завтра.
Выбрать все файлы, соответствующие строке yesterday. (Для переменной Yesterday)
- Для каждого [2] из них заменяют (позволяя скрипту сделать это) подстроку вчерашнего дня на подстроку завтрашнего дня в переменной с новым именем [1] . Не забудьте изменить даже
.mp4
с.avi
... - Выведите созданную вами строку.
- После того, как вы убедитесь в правильности своей программы, измените выходную строку на строку ffmpeg.
Теперь вам нужно только найти каждый шаг и подобрать соответствующую команду(ы)...
PS> Во второй раз вы можете улучшить свой скрипт, добавив проверку существования выходного файла (если он существует, вы его не перезапишете), количество обработанных файлов, успешный или неудачный выход вашего скрипта... Во второй раз.
решение2
Закончил с этим
Если у кого-то есть предложения по оптимизации кода, буду очень рад их учесть.
Получает вчерашнюю дату в формате ММдд -> выбирает все файлы, которые начинаются с этой даты -> сжимает их с помощью ffmpeg -> перемещает в другую папку в соответствии с месяцем -> удаляет исходные файлы
$a = (get-date).AddDays(-1).ToString("MMMM")
$d = (get-date).AddDays(-1).ToString("MMdd")
$inProcessPath = "sourcepath"
$oldVideos = Get-ChildItem -Include @("$d *") -Path $inProcessPath -Recurse;
Set-Location -Path 'D:\ffmpeg\bin';
foreach ($oldVideo in $oldVideos) {
$newVideo = [io.path]::ChangeExtension($oldVideo.FullName, '.avi')
$ArgumentList = '-i "{0}" -b 200000 "{1}"' -f $oldVideo, $newVideo;
Start-Process -FilePath "D:\ffmpeg\bin\ffmpeg.exe" -ArgumentList $ArgumentList -Wait -NoNewWindow;
}
Robocopy D:\Main\AdWords\ffmpeg\bin\ntv "D:\path\$a" "$d *.avi" /mov
get-childitem "sourcepath" -include "$d *.mp4" -recurse | foreach ($_) {remove-item $_.fullname}