Ответы:
Предыдущий ответ создаст только 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 имеет расширение оболочки: для i в * .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 здесь»
или «Открыть окно командной строки здесь»
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 параллельно, используя все, кроме одного из ваших процессорных ядер с
find vid_dir -type f -name '*.avi' -not -empty -print0 |
parallel -0 -j -1 ffmpeg -loglevel fatal -i {} {.}.mp4
Чтобы конвертировать из / в разные форматы, измените '*.avi'
или по .mp4
мере необходимости. Параллель GNU указана в большинстве репозиториев дистрибутивов Linux в пакете, который обычно называется parallel
.
!
в конец одну из строк строки bash?
Я знаю, что это может быть избыточно, но я использую этот скрипт для пакетного преобразования файлов.
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
можете конвертировать его, вы можете указать любые два расширения.
Это немного похоже на Code Golf, но так как почти все ответы пока что bash (за исключением одного одиночного cmd), вот кроссплатформенная команда windows, которая использует powershell (потому что это здорово):
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 через 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. Так что выберите файлы и затем поместите их через Quick Batcher.
Только этот работал для меня, пожалуйста, обратите внимание, что вам нужно вручную создать папку «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"
"