Пакетне стискання .avi файлів з ffmpeg, які містять попередню дату в їх імені


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 частина цього буде дуже радий налаштувати мій код


1
Ключ: ти маєш фіксований перші 4 цифри і змінна решти назви. Кроки для вашого псевдокоду. 1. Створіть струни для вчора і завтра. 2. Виберіть усі файли, які відповідають вчорашньому рядку. 3. Для кожного з них підставляйте рядок вчорашнього рядка завтрашнього дня в a NewName змінна (і avi з mp4). 4. Вивести, що ви побудували. (після зміни вихідного рядка з ffmpeg один). Тепер для кожного кроку потрібно шукати відносну команду (-и) ... :-) Після додавання перевірки, чи існує нове ім'я файлу ...
Hastur

Перші 4 цифри фіксуються лише на 1 день, причина створення цього сценарію полягає в автоматизації його, тому вручну створення назв рядків для повсякденних дійсно не є опцією. Або я не правильно вас занижую?
AudioTroubler

Я не припускав, що (я ненавиджу просту ідею написати її руками :-) ). Я пишу лише один спосіб зробити це, кроками ( псевдокод ). Коли я сказав вам замінити, це означає, що сценарій зробить це ... з date, sed еквівалент ... Ще краще з підстановка рядків ...
Hastur

Цю проблему важко вирішити за допомогою командних файлів. Подумайте, що відбувається, коли змінюється місяць. Отримання дати вчора не просто. як отримати дату вчора в пакетному файлі дасть вам деякі ідеї.
DavidPostill

Дурний мені, рідко забуваю cmd.exe може бути так примітивний . Можна побудувати за допомогою команди date of powerhell або with вчора або встановіть gnu coreutils для вікон ...
Hastur

Відповіді:


1

Я ціную ваше питання, тому що ви заявили - У вас є якісь ідеї, як я можу виконати своє завдання? і ви не просили написання коду. Думаю, ви хочете вчитися. Отже, ця відповідь.

  • Зосередьтеся на якому Ключ щось унікальне і дозволяє вибрати лише ті елементи, над якими потрібно працювати. У цьому випадку ви просто сказали Перші чотири символи в імені файлів у поточному каталозі. Добре.
    Добре ще більше, тому що вони мають однакову довжину, якщо це перша з Jen. або 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 & gt; Вдруге ви можете покращити свій скрипт за допомогою перевірки на наявність вихідного файлу (ви не перезапишете його, якщо він існує), з кількістю оброблених файлів, з хорошим або поганим виходом сценарію ... час.


Дякую, я постараюся, що до сих пір я придумав це в оболонці влади, щоб отримати ключ 4 цифри $ a = get-дата -формат "MMdd" $ b = 1 $ c = $ a - $ b $ d = $ c.ToString ("0000") echo $ d
AudioTroubler

Дотримуйтесь посилань (або шукайте інших), а потім виконайте свої спроби. Більше помилок ви зробите і більше ви дізнаєтеся. :-)
Hastur

0

Закінчився з цим

Якщо хтось має пропозиції по оптимізації коду, буде дуже радий їх включити

Отримує дату вчорашнього дня в MMdd - & gt; вибирає всі файли, які починаються з цього - & gt; стискає їх за допомогою ffmpeg - & gt; переміщується до іншої папки, яка відповідає місяцю - & gt; видаляє джерело fules

$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}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.