Відповіді:
Попередня відповідь створить лише 1 вихідний файл під назвою out.mov. Щоб зробити окремий вихідний файл для кожного старого фільму, спробуйте це.
for i in *.avi;
do name=`echo "$i" | cut -d'.' -f1`
echo "$name"
ffmpeg -i "$i" "${name}.mov"
done
i was unexpected at this time.
do name=`echo "${i%.*}"`;
буде працювати над іменами файлів із крапками (та пробілами).
.bat
в Windows?
Для Linux та macOS це можна зробити в одному рядку, використовуючи розширення параметра, щоб змінити розширення імені файлу вихідного файлу:
for i in *.avi; do ffmpeg -i "$i" "${i%.*}.mp4"; done
ffmpeg
не можна вводити та виводити в той самий файл. 2) Я не впевнений, чи працюють команди Bash у Windows 10 на самому собі. Можливо, я повинен додати у відповідь, що він орієнтований на системи, які можуть спочатку використовувати Bash, такі як Linux та macOS. lxs надав відповідь Windows на це питання.
for f in *.mkv; do ffmpeg -i "$f" -map 0 -movflags faststart -c:v libx264 -c:a copy -c:s copy "${f/x265/x264}"; done
А в Windows:
FOR /F "tokens=*" %G IN ('dir /b *.flac') DO ffmpeg -i "%G" -acodec mp3 "%~nG.mp3"
FOR /F "tokens=*" %G IN ('dir /b *.mp3') DO ffmpeg -i "%G" -map_metadata -1 -c:v copy -c:a copy "%~nG .mp3"
Однорядковий скрипт bash легко зробити - замінити *.avi
на ваш тип файлу:
for i in *.avi; do ffmpeg -i "$i" -qscale 0 "$(basename "$i" .avi)".mov ; done
-qscale
. Видаліть його та скористайтеся налаштуваннями за замовчуванням або використовуйте -crf
натомість (за замовчуванням є -crf 23
).
basename
підкадра не вказана. Саме тому bash має розширення оболонки замість: for i in * .avi; do ffmpeg -i "$ i" -qscale 0 "$ (базове ім'я" $ i ".avi)". mov; виконано
Для перетворення з підкаталогами використовуйте напр
find . -exec ffmpeg -i {} {}.mp3 \;
find -name "*.vtt" -exec ffmpeg -i {} {}.srt \;
find *.mp4 -exec ffmpeg -i {} {}.mp3 \;
find . -name *.ogg -or -name *.wma -exec ffmpeg -i {} {}.mp3 \;
find . -name *.wma -exec ffmpeg -i {} {}.mp3 \; -exec rm {} \;
Для Windows:
Тут я конвертую всі (.mp4) файли в (.mp3) файли.
Просто відкрийте cmd, перейдіть до потрібної папки та введіть команду.
Ярлик: (необов’язково)
1. Перейдіть у папку, де є ваші (.mp4) файли
2. Натисніть клавішу Shift та клацніть лівою кнопкою миші та виберіть "Відкрити вікно PowerShell Here"
або "Open Open Command Window Here"
3. Введіть "cmd" [ПРИМІТКА : Пропустіть цей крок, якщо він безпосередньо відкриє cmd замість PowerShell]
4. Запустіть команду
for %i in (*.mp4) do ffmpeg -i "%i" "%~ni.mp3"
Якщо ви хочете помістити це в пакетний файл в Windows 10, вам потрібно використовувати %% i.
Для всіх, хто хоче пакетно перетворити що-небудь за допомогою ffmpeg, але хотів би мати зручний інтерфейс Windows, я розробив цей передній:
https://sourceforge.net/projects/ffmpeg-batch
Це додає ffmpeg інтерфейс віконної моди, панелі прогресу та інформацію про час, що залишився, функції, які я завжди пропускав під час використання ffmpeg.
Якщо у вас GNU паралельно, ви можете перетворити всі .avi-файли нижче vid_dir
в mp4 паралельно, використовуючи всі, крім одного з ваших ядер CPU, з
find vid_dir -type f -name '*.avi' -not -empty -print0 |
parallel -0 -j -1 ffmpeg -loglevel fatal -i {} {.}.mp4
Щоб конвертувати з / у різні формати, змініть '*.avi'
або .mp4
за потреби. Паралель GNU представлена в більшості сховищ дистрибутивів Linux в пакеті, який зазвичай називається parallel
.
!
до кінця будь-яку з однотонних лайнерів?
Я знаю, що це може бути зайвим, але я використовую цей скрипт для пакетного перетворення файлів.
old_extension=$1
new_extension=$2
for i in *."$old_extension";
do ffmpeg -i "$i" "${i%.*}.$new_extension";
done
Щоб зробити його більш гнучким, потрібно 2 аргументи:
Я створюю псевдонім для нього, але ви також можете використовувати його вручну так:
sh batch_convert.sh mkv mp4
Це перетворило б усі mkv
файли у mp4
файли.
Як бачите, це трохи більш універсально. Поки ffmpeg
можна конвертувати, ви можете вказати будь-які два розширення.
Тут трохи схожий на кодовий гольф, але оскільки майже всі відповіді на сьогоднішній день є баш (забороняючи один самотній cmd один), ось команда Windows для крос-платформи, яка використовує powerhell (бо приголомшливо):
ls *.avi|%{ ffmpeg -i $_ <ffmpeg options here> $_.name.replace($_.extension, ".mp4")}
Ви можете змінити * .avi на те, що відповідає вашим вихідним відео.
Звичайно, зараз з'явився PowerShell, спеціально розроблений, щоб зробити щось саме подібне надзвичайно просто.
І так, PowerShell також доступний в інших операційних системах, окрім Windows, але він попередньо встановлений у Windows, тому це повинно бути корисним для всіх.
По-перше, ви захочете перерахувати всі файли в поточному каталозі, тому ми почнемо з:
ls
Ви також можете використовувати, ls -Recurse
якщо ви хочете рекурсивно конвертувати всі файли і в підкаталогах.
Потім ми відфільтруємо їх лише до того типу файлу, який ми хочемо конвертувати - наприклад, "avi".
ls | Where { $_.Extension -eq ".avi" }
Після цього ми передамо цю інформацію FFmpeg через a ForEach
.
Для введення FFmpeg ми будемо використовувати FullName
- це весь шлях до файлу. А для виведення FFmpeg'овской бібліотеки ми будемо використовувати Name
- але замінюючи.avi
на кінці .mp3
. Отже, це буде виглядати приблизно так:
$_.Name.Replace(".avi", ".mp3")
Отже, давайте все це зробимо разом, і це результат:
ls | Where { $_.Extension -eq ".avi" } | ForEach { ffmpeg -i $_.FullName $_.Name.Replace(".avi", ".mp3") }
Це перетворить усі файли ".avi" у ".mp3" файли через FFmpeg, просто замініть три речі в лапках, щоб вирішити, який тип конверсії ви хочете, і сміливо додайте будь-які інші аргументи до FFmpeg в межах ForEach
.
Ви можете зробити цей крок далі і додати Remove-Item
до кінця, щоб автоматично видалити старі файли.
Якщо ffmpeg
у вас немає шляху, а він фактично знаходиться в каталозі, в якому ви зараз перебуваєте, напишіть ./ffmpeg
там, а не простоffmpeg
.
Сподіваюсь, це допомагає комусь.
.ps1
файл, а не у .bat
файл. Set-ExecutionPolicy RemoteSigned
Якщо ви ніколи раніше не запускали скрипт PS, вам доведеться запуститись як адміністратор.
вікна:
@echo off
for /r %%d in (*.wav) do (
ffmpeg -i "%%~nd%%~xd" -codec:a libmp3lame -c:v copy -qscale:a 2 "%
%~nd.2.mp3"
)
це мінливий бітрейт якості 2, ви можете встановити його на 0, якщо хочете, але якщо у вас є справді хороша акустична система, це нічого не варто
Якщо ви хочете, щоб графічний інтерфейс здійснював пакетний процес із ffmpegX, спробуйте Quick Batcher . Це безкоштовно і забирає ваші останні налаштування ffmpegX для перетворення файлів, які ви впадаєте в нього.
Зауважте, що ви не можете перетягувати папки на Quick Batcher. Отже, виберіть файли та перенесіть їх через Швидкий Batcher.
Лише цей працював для мене, pls зауважте, що вам потрібно створити папку "newfiles" вручну, де знаходиться файл ffmpeg.exe.
Перетворити . файли у .wav аудіо код:
for %%a in ("*.*") do ffmpeg.exe -i "%%a" "newfiles\%%~na.wav"
pause
тобто якщо ви хочете перетворити всі .mp3 файли в .wav змінити ("*.*")
в ("*.mp3")
.
Автор цього сценарію:
https://forum.videohelp.com/threads/356314-How-to-batch-convert-multiplex-any-files-with-ffmpeg
сподіваюся, що це допомогло 🙏.
Це створить mp4 відео з усіх файлів jpg з поточного каталогу.
echo exec("ffmpeg -framerate 1/5 -i photo%d.jpg -r 25 -pix_fmt yuv420p output.mp4");
А для Windows це не працює
FOR /F "tokens=*" %G IN ('dir /b *.flac') DO ffmpeg -i "%G" -acodec mp3 "%~nG.mp3"
навіть якщо я їх подвоюю %
.
Я б навіть запропонував:
-acodec ***libmp3lame***
також:
FOR /F "tokens=*" %G IN ('dir /b *.flac') DO ffmpeg -i "%G" -acodec libmp3lame "%~nG.mp3"
Це те, що я використовую для пакетного перетворення avi в 1280x mp4
FOR /F "tokens=*" %%G IN ('dir /b *.avi') DO "D:\Downloads\ffmpeg.exe" -hide_banner -i "%%G" -threads 8 -acodec mp3 -b:a 128k -ac 2 -strict -2 -c:v libx264 -crf 23 -filter:v "scale=1280:-2,unsharp=5:5:1.0:5:5:0.0" -sws_flags lanczos -b:v 1024k -profile:v main -preset medium -tune film -async 1 -vsync 1 "%%~nG.mp4"
Добре працює як cmd-файл, запускайте його, цикл знаходить усі файли avi у цій папці.
викликає MY (зміна для вашого) ffmpeg, передає ім'я вводу, параметри призначені для збільшення розміру з різкістю. Мені не потрібні CRF та " -b:v 1024k
" ...
Вихідний файл - це вхідний файл мінус розширення, з mp4 як новий ext.
Я використовую цей однокласник у Linux для перетворення файлів (як правило, H265) у те, що я можу грати на Kodi без проблем:
for f in *.mkv; do ffmpeg -i "$f" -c:v libx264 -crf 28 -c:a aac -b:a 128k output.mkv; mv -f output.mkv "$f"; done
Це перетворюється у тимчасовий файл, а потім замінює оригінал, тому імена залишаються однаковими після перетворення.
Також якщо ви хочете однакової конверсії в папках. ось рекурсивний код.
for /R "folder_path" %%f in (*.mov,*.mxf,*.mkv,*.webm) do (
ffmpeg.exe -i "%%~f" "%%~f.mp4"
)
маленький сценарій php для цього:
#!/usr/bin/env php
<?php
declare(strict_types = 1);
if ($argc !== 2) {
fprintf ( STDERR, "usage: %s dir\n", $argv [0] );
die ( 1 );
}
$dir = rtrim ( $argv [1], DIRECTORY_SEPARATOR );
if (! is_readable ( $dir )) {
fprintf ( STDERR, "supplied path is not readable! (try running as an administrator?)" );
die(1);
}
if (! is_dir ( $dir )) {
fprintf ( STDERR, "supplied path is not a directory!" );
die(1);
}
$files = glob ( $dir . DIRECTORY_SEPARATOR . '*.avi' );
foreach ( $files as $file ) {
system ( "ffmpeg -i " . escapeshellarg ( $file ) . ' ' . escapeshellarg ( $file . '.mp4' ) );
}
escapeshellarg()
, і працює як у Windows, так і в Linux. Я згоден, але це є кращим випадком.
Ще одним простим рішенням, яке ще не запропоновано, було б використовувати xargs
:
ls *.avi | xargs -i -n1 ffmpeg -i {} "{}.mp4"
Одним з незначних недоліків є незручне називання вихідних файлів (наприклад input.avi.mp4
). Можливим вирішенням цього питання може бути:
ls *.avi | xargs -i -n1 bash -c "i={}; ffmpeg -i {} "\${i%.*}.mp4"
"