Odpowiedzi:
Poprzednia odpowiedź utworzy tylko 1 plik wyjściowy o nazwie out.mov. Aby utworzyć osobny plik wyjściowy dla każdego starego filmu, spróbuj tego.
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%.*}"`;
będzie działać na nazwach plików z kropkami (i spacjami) w nich.
.bat
Windows?
W systemach Linux i macOS można to zrobić w jednym wierszu, używając rozszerzenia parametrów do zmiany rozszerzenia nazwy pliku wyjściowego:
for i in *.avi; do ffmpeg -i "$i" "${i%.*}.mp4"; done
ffmpeg
nie można wejść i wyjść do tego samego pliku. 2) Nie jestem pewien, czy polecenia Bash działają w systemie Windows 10 natywnie. Może powinienem dodać do odpowiedzi, że jest on skierowany do systemów, które mogą natywnie używać Basha, takich jak Linux i macOS. lxs dostarczył odpowiedź Windows na to pytanie.
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
A w systemie 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"
Jednoliniowy skrypt bash byłby łatwy do zrobienia - zamień na *.avi
swój typ pliku:
for i in *.avi; do ffmpeg -i "$i" -qscale 0 "$(basename "$i" .avi)".mov ; done
-qscale
. Usuń go i użyj ustawień domyślnych lub użyj -crf
zamiast tego (domyślnie jest -crf 23
).
basename
podpowłoka wsteczna nie jest cytowana. Właśnie dlatego bash ma zamiast tego rozszerzenie powłoki: dla i w * .avi; do ffmpeg -i "$ i" -qscale 0 "$ (basename" $ i ".avi)" mov; gotowe
Aby przekonwertować za pomocą podkatalogów użyj np
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 {} \;
Dla Windowsa:
Tutaj przekształcam wszystkie pliki (.mp4) w pliki (.mp3).
Po prostu otwórz cmd, przejdź do żądanego folderu i wpisz polecenie.
Skrót: (opcjonalnie)
1. Przejdź do folderu, w którym znajdują się pliki (.mp4)
2. Naciśnij Shift i kliknij lewym przyciskiem myszy i wybierz „Otwórz okno PowerShell tutaj”
lub „Otwórz okno wiersza polecenia tutaj”
3. Wpisz „cmd” [UWAGA : Pomiń ten krok, jeśli bezpośrednio otworzy cmd zamiast PowerShell]
4. Uruchom polecenie
for %i in (*.mp4) do ffmpeg -i "%i" "%~ni.mp3"
Jeśli chcesz umieścić to w pliku wsadowym w systemie Windows 10, musisz użyć %% i.
Dla każdego, kto chce wsadowo przekonwertować cokolwiek za pomocą ffmpeg, ale chciałby mieć wygodny interfejs Windows, opracowałem ten interfejs:
https://sourceforge.net/projects/ffmpeg-batch
Dodaje do ffmpeg interfejs mody okna, paski postępu i informacje o pozostałym czasie, funkcje, których zawsze brakowało podczas korzystania z ffmpeg.
Jeśli masz GNU równolegle, możesz konwertować wszystkie pliki .avi poniżej vid_dir
na mp4 równolegle, używając wszystkich oprócz jednego rdzenia procesora z
find vid_dir -type f -name '*.avi' -not -empty -print0 |
parallel -0 -j -1 ffmpeg -loglevel fatal -i {} {.}.mp4
Aby przekonwertować z / do różnych formatów, zmień '*.avi'
lub .mp4
w razie potrzeby. GNU równoległe jest wymienione w repozytoriach większości dystrybucji Linuksa w pakiecie, który jest zwykle nazywany parallel
.
!
na końcu jednego z linijek bash?
Wiem, że to może być zbędne, ale używam tego skryptu do grupowej konwersji plików.
old_extension=$1
new_extension=$2
for i in *."$old_extension";
do ffmpeg -i "$i" "${i%.*}.$new_extension";
done
Aby uczynić go bardziej elastycznym, potrzeba 2 argumentów:
Tworzę dla niego alias, ale możesz go również użyć ręcznie w następujący sposób:
sh batch_convert.sh mkv mp4
Spowodowałoby to konwersję wszystkich mkv
plików na mp4
pliki.
Jak widać, jest to nieco bardziej wszechstronne. Tak długo, jak ffmpeg
można go przekonwertować, można określić dowolne dwa rozszerzenia.
Trochę przypomina kod golfa, ale ponieważ prawie wszystkie dotychczasowe odpowiedzi są bash (z wyjątkiem jednego samotnego cmd), oto polecenie systemu Windows dla wielu platform, które używa PowerShell (ponieważ niesamowite):
ls *.avi|%{ ffmpeg -i $_ <ffmpeg options here> $_.name.replace($_.extension, ".mp4")}
Możesz zmienić * .avi na cokolwiek, co pasuje do twojego materiału źródłowego.
Oczywiście pojawił się teraz PowerShell, specjalnie zaprojektowany, aby uczynić coś dokładnie tak niezwykle łatwym.
I tak, PowerShell jest również dostępny w innych systemach operacyjnych niż tylko Windows, ale jest fabrycznie zainstalowany w systemie Windows, więc powinien być przydatny dla wszystkich.
Najpierw będziesz chciał wymienić wszystkie pliki w bieżącym katalogu, więc zaczniemy od:
ls
Możesz także użyć, ls -Recurse
jeśli chcesz rekurencyjnie przekonwertować wszystkie pliki w podkatalogach.
Następnie przefiltrujemy je do typu pliku, który chcemy przekonwertować - np. „Avi”.
ls | Where { $_.Extension -eq ".avi" }
Następnie przekażemy te informacje do FFmpeg za pośrednictwem ForEach
.
Do danych wejściowych FFmpeg użyjemy FullName
- to jest cała ścieżka do pliku. I na wyjściu FFmpeg będziemy używać Name
- ale zastępując.avi
na koniec z .mp3
. Będzie to wyglądać mniej więcej tak:
$_.Name.Replace(".avi", ".mp3")
Połączmy to wszystko razem i oto wynik:
ls | Where { $_.Extension -eq ".avi" } | ForEach { ffmpeg -i $_.FullName $_.Name.Replace(".avi", ".mp3") }
Spowoduje to konwersję wszystkich plików „.avi” do plików „.mp3” za pomocą FFmpeg, wystarczy zastąpić trzy cytaty, aby zdecydować, jakiego rodzaju konwersję chcesz, i możesz dodać dowolne inne argumenty do FFmpeg w pliku ForEach
.
Możesz pójść o krok dalej i dodać Remove-Item
do końca, aby automatycznie usunąć stare pliki.
Jeśli ffmpeg
nie znajduje się na twojej ścieżce i rzeczywiście znajduje się w katalogu, w którym aktualnie się znajdujesz, napisz ./ffmpeg
tam zamiast po prostu ffmpeg
.
Mam nadzieję, że to pomoże każdemu.
.ps1
pliku, a nie w .bat
pliku. Musisz uruchomić Set-ExecutionPolicy RemoteSigned
jako administrator, jeśli nigdy wcześniej nie uruchamiałeś skryptu PS.
Windows:
@echo off
for /r %%d in (*.wav) do (
ffmpeg -i "%%~nd%%~xd" -codec:a libmp3lame -c:v copy -qscale:a 2 "%
%~nd.2.mp3"
)
jest to zmienna przepływność o jakości 2, możesz ustawić ją na 0, jeśli chcesz, ale jeśli nie masz naprawdę dobrego systemu głośników, nie warto
Jeśli chcesz, aby interfejs graficzny przetwarzał wsadowo za pomocą ffmpegX, wypróbuj Quick Batcher . To nic nie kosztuje i zajmie ostatnie ustawienia ffmpegX w celu konwersji plików, które do niego upuścisz.
Pamiętaj, że nie możesz przeciągać folderów do Szybkiego Batchera. Wybierz pliki, a następnie przeprowadź je przez Quick Batcher.
Tylko ten działał dla mnie, proszę zauważyć, że trzeba ręcznie utworzyć folder „newfiles”, w którym znajduje się plik ffmpeg.exe.
Konwersja . pliki do .wav audio Kod:
for %%a in ("*.*") do ffmpeg.exe -i "%%a" "newfiles\%%~na.wav"
pause
tzn. jeśli chcesz przekonwertować wszystkie pliki .mp3 na .wav zmień ("*.*")
na ("*.mp3")
.
Autorem tego skryptu jest:
https://forum.videohelp.com/threads/356314-How-to-batch-convert-multiplex-any-files-with-ffmpeg
mam nadzieję, że to pomogło 🙏.
Spowoduje to utworzenie wideo MP4 ze wszystkich plików JPG z bieżącego katalogu.
echo exec("ffmpeg -framerate 1/5 -i photo%d.jpg -r 25 -pix_fmt yuv420p output.mp4");
W przypadku systemu Windows to nie działa
FOR /F "tokens=*" %G IN ('dir /b *.flac') DO ffmpeg -i "%G" -acodec mp3 "%~nG.mp3"
nawet jeśli podwoję te %
.
Sugerowałbym nawet:
-acodec ***libmp3lame***
również:
FOR /F "tokens=*" %G IN ('dir /b *.flac') DO ffmpeg -i "%G" -acodec libmp3lame "%~nG.mp3"
Tego właśnie używam do wsadowej konwersji avi na 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"
Działa dobrze jako plik cmd, uruchom go, pętla znajdzie wszystkie pliki avi w tym folderze.
wywołuje MY (zmień dla twojego) ffmpeg, przekazuje nazwę wejściową, ustawienia dotyczą skalowania z wyostrzaniem. I probs nie potrzebują CRF i „ -b:v 1024k
” ...
Plik wyjściowy to plik wejściowy minus rozszerzenie, z mp4 jako nowym rozszerzeniem.
Używam tego jednowierszowego linuksa do konwersji plików (zwykle H265) na coś, co mogę odtwarzać na Kodi bez problemów:
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
Konwertuje to na plik tymczasowy, a następnie zastępuje oryginał, dzięki czemu nazwy pozostają takie same po konwersji.
Także jeśli chcesz taką samą konwersję w podfolderach. oto kod rekurencyjny.
for /R "folder_path" %%f in (*.mov,*.mxf,*.mkv,*.webm) do (
ffmpeg.exe -i "%%~f" "%%~f.mp4"
)
mały skrypt php, aby to zrobić:
#!/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()
i działa zarówno na systemie Windows, jak i Linux. zgadzam się jednak, że jest to przypadek skrajny.
Innym prostym rozwiązaniem, które nie zostało jeszcze zasugerowane, byłoby użycie xargs
:
ls *.avi | xargs -i -n1 ffmpeg -i {} "{}.mp4"
Drobną pułapką jest niewygodne nazewnictwo plików wyjściowych (np input.avi.mp4
.). Możliwym obejściem tego problemu może być:
ls *.avi | xargs -i -n1 bash -c "i={}; ffmpeg -i {} "\${i%.*}.mp4"
„