1

я пытаюсь управлять кадрами видеонаблюдения, и я пытаюсь пакетно сжать их с помощью 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, я буду очень рад скорректировать мой код.

2 ответа2

1

Я ценю ваш вопрос, потому что вы заявили: «У вас есть идеи, как я могу выполнить свою задачу?" и вы не просили о написании кода. Я думаю, вы хотите учиться. Итак, этот ответ.

  • Сосредоточьтесь на том, что является ключом, что-то уникальное и позволяет выбирать только те элементы, над которыми вам приходится работать. В этом случае вы просто сказали первые четыре символа в именах файлов в текущем каталоге. Хорошо.
    Хорошо даже больше, потому что они имеют одинаковую длину, если 1-й из Джен. или 31 декабря (даже если вы не обязаны его использовать.

Теперь вы можете написать свой пакетный скрипт шаг за шагом:

  1. Постройте строки для вчерашнего и завтрашнего дня [ d1, d2, d3...].

    $date = Get-Date; $date=$date.AddDays(-1); $date.ToString('yyyy-MM-dd')
    

    Обратите внимание, что вы должны изменить здесь выше для формата и имени переменной, вам тоже нужно завтра.

  2. Выберите все файлы, которые соответствуют вчерашней строке. (Для переменной «Вчера»)

  3. Для каждого [ 2 ] из них подставьте (пусть это сделает скрипт) подстроку вчерашнего дня подстроку завтрашнего дня в переменную с новым именем [ 1 ]. Не забудьте поменять даже .mp4 с .avi ...
  4. Выведите строку, которую вы построили.
  5. После этого вы уверены в своей программе, измените строку вывода с помощью ffmpeg.

Теперь вам нужно только искать каждый шаг и подбирать соответствующие команды ...

PS> Во второй раз вы можете улучшить ваш скрипт проверкой на наличие выходного файла (вы не будете перезаписывать, если он существует), количеством обработанных файлов, хорошим или плохим выходом вашего сценария ... Во второй раз.

0

Закончилось этим

Если у кого есть предложения по оптимизации кода, буду очень рад их включить

Получает дату вчерашнего дня в MMdd -> выбирает все файлы, которые начинаются с этого -> сжимает их с помощью 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}

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .