Yanıtlar:
Önceki yanıt sadece out.mov adlı 1 çıktı dosyası oluşturur. Her eski film için ayrı bir çıktı dosyası oluşturmak için şunu deneyin.
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%.*}"`;
içinde nokta (ve boşluk) bulunan dosya adları üzerinde çalışacaktır.
.bat
Windows için bu destek nedir?
For Linux ve MacOS bu kullanarak, tek satırda yapılabilir parametre genişleme çıkış dosyasının dosya adı uzantısını değiştirmek için:
for i in *.avi; do ffmpeg -i "$i" "${i%.*}.mp4"; done
ffmpeg
aynı dosyaya giriş ve çıkış yapamazsınız. 2) Bash komutlarının Windows 10'da yerel olarak çalışıp çalışmadığından emin değilim. Belki de Linux ve macOS gibi yerel olarak Bash kullanabilen sistemlere yönelik olduğu cevabını eklemeliyim. lxs bu soru için bir Windows yanıtı sağlamıştır.
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
Ve Windows'ta:
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"
Tek satırlık bir bash betiği yapmak kolay olurdu - *.avi
dosya türünüzle değiştirin :
for i in *.avi; do ffmpeg -i "$i" -qscale 0 "$(basename "$i" .avi)".mov ; done
-qscale
. Kaldırın ve varsayılan ayarları kullanın veya -crf
bunun yerine kullanın (varsayılan değer -crf 23
).
basename
alt kabuk alıntılanmadığı için komut başarısız olur . Tam da bu yüzden bash'ın kabuk genişlemesi var: i in * .avi; do ffmpeg -i "$ i" -qscale 0 "$ (taban adı" $ i ".avi)". mov; bitti
Alt dizinlerle dönüştürmek için örn.
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 {} \;
Pencereler için:
Burada tüm (.mp4) dosyalarını (.mp3) dosyalarına dönüştürüyorum.
Sadece cmd'yi açın, istediğiniz klasöre gidin ve komutu yazın.
Kısayol: (isteğe bağlı)
1. (.mp4) dosyalarınızın bulunduğu klasöre gidin
2. Shift ve Sol tuşlarına basın ve "PowerShell Penceresini Burada
Aç " veya "Komut İstemi Penceresini Burada Aç" ı seçin
3. "cmd" yazın [NOT : PowerShell yerine doğrudan cmd'yi açarsa bu adımı atlayın]
4. Komutu çalıştırın
for %i in (*.mp4) do ffmpeg -i "%i" "%~ni.mp3"
Bunu Windows 10'da bir toplu iş dosyasına koymak istiyorsanız, %% i öğesini kullanmanız gerekir.
Ffmpeg ile herhangi bir şeyi toplu olarak dönüştürmek isteyen ancak uygun bir Windows arabirimine sahip olmak isteyen herkes için bu ön ucu geliştirdim:
https://sourceforge.net/projects/ffmpeg-batch
Bir pencere moda arayüzü, ilerleme çubukları ve kalan süre bilgisi, ffmpeg kullanırken her zaman kaçırdığım özellikler ffmpeg'e ekler.
GNU paraleliniz varsa, aşağıdaki vid_dir
CPU çekirdeğiniz dışındaki tüm .avi dosyalarını paralel olarak mp4'e dönüştürebilirsiniz.
find vid_dir -type f -name '*.avi' -not -empty -print0 |
parallel -0 -j -1 ffmpeg -loglevel fatal -i {} {.}.mp4
Farklı biçimlere / biçimlere dönüştürmek için '*.avi'
veya .mp4
gerektiği şekilde değiştirin . GNU paralel, çoğu Linux dağıtımının depolarında genellikle adlandırılan bir pakette listelenir parallel
.
!
bash one-liner'ların sonuna ekleyerek aynı şeyi yapamaz mıydınız?
Bunun gereksiz olabileceğini biliyorum ama dosyaları dönüştürmek için bu komut dosyasını kullanıyorum.
old_extension=$1
new_extension=$2
for i in *."$old_extension";
do ffmpeg -i "$i" "${i%.*}.$new_extension";
done
Daha esnek hale getirmek için 2 argüman gerekir:
Bunun için bir takma ad oluşturuyorum ancak manuel olarak da bu şekilde kullanabilirsiniz:
sh batch_convert.sh mkv mp4
Bu, tüm mkv
dosyaları dosyalara dönüştürür mp4
.
Gördüğünüz gibi biraz daha çok yönlü. ffmpeg
Dönüştürebildiği sürece herhangi iki uzantı belirtebilirsiniz.
Burada kod golf gibi biraz almak, ama şimdiye kadar neredeyse tüm cevaplar bash (bir yalnız cmd bir engelleme) olduğundan, burada powershell (çünkü harika) kullanan bir windows çapraz platform komutu:
ls *.avi|%{ ffmpeg -i $_ <ffmpeg options here> $_.name.replace($_.extension, ".mp4")}
* .Avi dosyasını kaynak görüntünüze uygun olanla değiştirebilirsiniz.
Tabii ki, PowerShell artık tam olarak böyle bir şeyi son derece kolay hale getirmek için tasarlanmış .
Ve evet, PowerShell sadece Windows dışındaki diğer işletim sistemlerinde de mevcuttur , ancak Windows'a önceden yüklenmiş olarak gelir, bu yüzden bu herkes için yararlı olmalıdır.
İlk olarak, geçerli dizindeki tüm dosyaları listelemek isteyeceksiniz, bu yüzden şunlarla başlayacağız:
ls
ls -Recurse
Alt dizinlerdeki tüm dosyaları özyinelemeli olarak dönüştürmek istiyorsanız da kullanabilirsiniz .
Ardından, bunları yalnızca dönüştürmek istediğimiz dosya türüne (ör. "Avi") göre filtreleyeceğiz.
ls | Where { $_.Extension -eq ".avi" }
Bundan sonra, bu bilgileri bir fFmpeg'e a ForEach
.
FFmpeg'in girdisi için, FullName
- dosyasının tamamı budur. Ve FFmpeg en çıkışı için biz kullanacağız Name
- ama yerine.avi
birlikte sonunda .mp3
. Yani, şöyle bir şey olacak:
$_.Name.Replace(".avi", ".mp3")
Öyleyse, hepsini bir araya getirelim ve sonuç:
ls | Where { $_.Extension -eq ".avi" } | ForEach { ffmpeg -i $_.FullName $_.Name.Replace(".avi", ".mp3") }
Bu, tüm ".avi" dosyalarını FFmpeg aracılığıyla ".mp3" dosyalarına dönüştürür, istediğiniz dönüşüm türüne karar vermek için tırnak içindeki üç şeyi değiştirin ve içinde FFmpeg'e başka bağımsız değişkenler eklemekten çekinmeyin ForEach
.
Bunu bir adım daha ileri taşıyabilir Remove-Item
ve eski dosyaları otomatik olarak silmek için sonuna ekleyebilirsiniz .
Yolunuzda ffmpeg
değilse ve aslında şu anda bulunduğunuz dizinde ise, ./ffmpeg
sadece yerine yazın ffmpeg
.
Umarım bu herkese yardımcı olur.
.ps1
dosyaya değil , bir dosyaya koyun .bat
. Daha Set-ExecutionPolicy RemoteSigned
önce hiç PS betiği çalıştırmadıysanız yönetici olarak çalıştırmanız gerekir .
pencereler:
@echo off
for /r %%d in (*.wav) do (
ffmpeg -i "%%~nd%%~xd" -codec:a libmp3lame -c:v copy -qscale:a 2 "%
%~nd.2.mp3"
)
Bu, kalite 2 değişken bit hızı, isterseniz 0 olarak ayarlayabilirsiniz, ancak gerçekten iyi bir hoparlör sisteminiz yoksa, değersiz imo
Bir grafik arabirimin ffmpegX ile toplu işlem yapmasını istiyorsanız, Hızlı Toplu İşi deneyin . Ücretsizdir ve bıraktığınız dosyaları dönüştürmek için son ffmpegX ayarlarınızı alacaktır.
Klasörleri Quick Batcher'a sürükleyemeyeceğinizi unutmayın. Bu yüzden dosyaları seçin ve ardından Quick Batcher'a koyun.
Sadece bu benim için çalıştı, pls ffmpeg.exe dosyasının bulunduğu yerde "newfiles" klasörü oluşturmak zorunda olduğuna dikkat edin.
Dönüştür . .wav ses koduna dosyalar:
for %%a in ("*.*") do ffmpeg.exe -i "%%a" "newfiles\%%~na.wav"
pause
yani .wav değişikliğe tüm .mp3 dosyalarını dönüştürmek istiyorsanız ("*.*")
için ("*.mp3")
.
Bu betiğin yazarı:
https://forum.videohelp.com/threads/356314-How-to-batch-convert-multiplex-any-files-with-ffmpeg
umarım yardımcı olmuştur 🙏.
Bu, geçerli dizindeki tüm jpg dosyalarından mp4 video oluşturur.
echo exec("ffmpeg -framerate 1/5 -i photo%d.jpg -r 25 -pix_fmt yuv420p output.mp4");
Ve Windows için bu çalışmıyor
FOR /F "tokens=*" %G IN ('dir /b *.flac') DO ffmpeg -i "%G" -acodec mp3 "%~nG.mp3"
bunları ikiye katlasam bile %
.
Hatta şunu öneririm:
-acodec ***libmp3lame***
Ayrıca:
FOR /F "tokens=*" %G IN ('dir /b *.flac') DO ffmpeg -i "%G" -acodec libmp3lame "%~nG.mp3"
Bu, avi'yi 1280x mp4'e dönüştürmek için kullandığım şey
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"
Bir cmd dosyası olarak iyi çalışır, çalıştırın, döngü o klasördeki tüm avi dosyalarını bulur.
MY (seninkini değiştir) ffmpeg'i çağırır, giriş adını geçer, ayarlar keskinleştirme ile yeniden ölçeklendirme içindir. Probların CRF'ye ihtiyacı yok ve " -b:v 1024k
" ...
Çıktı dosyası, eksi uzantı eksi, mp4 yeni ext olarak.
Ben bu tek astar linux dosyaları (genellikle H265) Kodi üzerinde sorunsuz bir şekilde oynayabileceğim bir şeye dönüştürmek için kullanıyorum:
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
Bu geçici bir dosyaya dönüştürür ve daha sonra orijinali değiştirir, böylece dönüşümden sonra adlar aynı kalır.
Ayrıca alt klasörlerde aynı dönüşüm istiyorsanız. İşte özyinelemeli kod.
for /R "folder_path" %%f in (*.mov,*.mxf,*.mkv,*.webm) do (
ffmpeg.exe -i "%%~f" "%%~f.mp4"
)
küçük php betiği yapmak için:
#!/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()
, ve hem windows ve linux üzerinde çalışır. katılıyorum olsa da bir durum.
Henüz önerilmeyen başka bir basit çözüm kullanmak olacaktır xargs
:
ls *.avi | xargs -i -n1 ffmpeg -i {} "{}.mp4"
Küçük bir tuzak, çıktı dosyalarının garip adlandırılmasıdır (örn. input.avi.mp4
). Bunun olası bir çözümü şunlar olabilir:
ls *.avi | xargs -i -n1 bash -c "i={}; ffmpeg -i {} "\${i%.*}.mp4"
"