Ekstra dosya olmadan, tek komut kullanarak birden fazla WAV dosyası birleştirin


32

FFMPEG kullanarak birden fazla WAV dosyasını tek bir WAV dosyası içinde birleştirmek istiyorum.

Aşağıdaki komutu kullandım ve gerekli dosyayı oluşturuyor.

Komut:

ffmpeg -f concat -i mylist.txt -c copy output.wav

Dosya :

#mylist.txt
file '1.wav'
file '2.wav'
file '3.wav'
file '4.wav'

Ancak görebildiğiniz gibi, birleştirmek üzere WAV dosyalarının listesini belirlemek için bir metin dosyası oluşturmam gerekiyor.

Tüm bu görevleri yapabilirim, ancak tek bir komutu benzeyen bir şey tercih ederdim

ffmpeg -i 1.wav -i 2.wav -i 3.wav -i 4.wav output.wav 

veya

ffmpeg -i "concat:1.wav|2.wav|3.wav|4.wav" -c copy output.wav

Bu iki basit komutu denedim ama sadece Sesi 1.wav döndürüyorlar. İstediğim sonucu veren tek bir komut yazmama yardım et (veya yukarıdaki 2 komutu düzelt).

Lütfen diğer Medya Kodlayıcıları / Editörleri önermeyin, yalnızca FFMPEG'yi kullanmak istiyorum, çünkü daha önce başka yerlerde kurulu ve kullanılmış.

Yanıtlar:


34

Concat filtresini kullanmayı deneyebilirsiniz ; yeniden kodlama gerektirir ve bu nedenle daha fazla sistem kaynağı gerektirir (bu özel durumda herhangi bir belirsiz modern bilgisayarda oldukça küçük bir miktar), ancak PCM -> PCM sesi matematiksel olarak kayıpsız olmalıdır. Senin durumunda, şöyle bir şey kullanırsın:

ffmpeg -i input1.wav -i input2.wav -i input3.wav -i input4.wav \
-filter_complex '[0:0][1:0][2:0][3:0]concat=n=4:v=0:a=1[out]' \
-map '[out]' output.wav

Beş giriş dosyanız varsa, kullanın n=5.


4
Not: [0:0][1:0][2:0][3:0]Dosya sayısına uyacak şekilde özelleştirmeyin . Bunu tam olarak söylediği gibi kullanın. Değiştirmeniz gereken tek şey giriş dosyaları ve n=4.
Keavon

8
@Keavon: emin misin? Burada ffmpeg (sürüm N-49352-gc46943e x64) Too many inputs specified for the "concat" filter., orijinal kodla yalnızca 2 girişi işlemeye çalıştığımda şikayet ediyor. Ben kaldırdığınızda olsa çalışır [2:0][3:0]böyle akışları gibi şeyler vardır, çünkü bu durumda bana mantıklı olan ... 2:0ve 3:0...
Bigue Nique

@BigueNique ile aynı fikirdeyim. Ben de aynı hatayı koştum ve biraz saçma hissetmesine rağmen, verilen doğru sırayı oluşturmak için bazı kodlar yazdım n.
Ryan DuVal

19

Bence en iyi seçenek ffmpeg değil sox kullanmaktır:

$ sox short1.wav short2.wav short3.wav long.wav

Çözüm geliyor (sıfır dolgulu olmayan) sayısal sıralamayı korurken bir grup .wav dosyasını nasıl eklerim?


1
Bu işe yarayabilir .wav, ancak soxdestekleyici görünmüyor .mp3.
Aaron Franke

1
Soru kesin ilgiliydi.wav
Hector M. Monacci

1
Biliyorum, sadece bu yöntemi wav olmayan dosyalar ile kullanmaya çalışan herkes için bir not ekliyorum.
Aaron Franke

soru açıkça sadece ffmpeg kullanarak bir çözüm gerektiğini belirtti!
Manu,

sox .mp3 dosyalarını da destekleyebilir
Benjamin

9

Bahsedenler wiki FFmpeg kullanarak concatprotokolü tüm dosya türleri ile mümkün değildir. Çoğu MPEG konteynerinde ve bit akışında düzgün çalışır, ancak açıkçası PCM sesli WAV dosyaları değildir.

Geçici bir dosya oluşturmanız ve kullanmanız gerekmez. Bash ile (veya işlem değiştirmeyi destekleyen diğer mermilerle ), her şeyi tek bir komutla yapabilirsiniz:

ffmpeg -f concat -i <( for f in *.wav; do echo "file '$(pwd)/$f'"; done ) output.wav

İşlem değiştirme <( ), anında ffmpegokuyabilecek bir dosya (veya kesin olarak bir dosya tanımlayıcısı) oluşturur . Bu dosya .wavgeçerli dizindeki her dosyanın yolunu içerecektir . $(pwd)Geçerli dizininizle ilgili doğru yolu almak için dosya tanımlayıcısına göre değil, önekini vermeliyiz .

Elbette, ikame içindeki komut başka bir şeyle değiştirilebilir.


2
Eğer Unsafe file namehata alırsanız, daha -safe 0önce seçeneğe ihtiyacınız olacak -i. ref. stackoverflow.com/q/38996925/297679
Nobu

3

Diğer bir seçenek ise concat kullanmaktır.

ffmpeg -i "concat: dosya1.mp3 | file2.mp3 | file3.mp3" -acodec kopyalamak.mp3


1
Superuser'a Hoş Geldiniz: Bu soruyu cevaplasa da cevapmasa da, (cevap kabul edildi), çözümünüzün neden ayrıntılı bir şekilde çalıştığını açıklamak ve talimatları takip etmek için kolay bir açıklama sunabiliyorsanız daha iyi bir cevap olacaktır. Cevabınızın doğru olduğunu düşünüyorsanız, bunları yapın ve yeniden düzenleyin. Lütfen birkaç dakikanızı ayırın ve okuyun: - superuser.com/help .Ayarma: superuser.com/help/how-to-answer , yine superuser'a hoş geldiniz.Teşekkürler
mic84

Bunu test ettim ve işe yaramadı
Nick Long,

1

Win8'in Cmd.EXE .BAT komut dosyasında:

Rem Get number of source files
For /F %%A In ('Dir *.3gp /B /A-D ^| Find /C /V ""') Do      Set FilCnt=%%A

Rem Build list of source filenames
Set Lst=
For    %%A In (     *.3gp                          ) Do Call Set Lst=%%Lst%% -i %%A

Rem Concat and Convert sources to target
FFMPeg.EXE %Lst% -filter_complex concat=n=%FilCnt%:v=0:a=1 -vn Output.OGG

Bu şekilde, kaynak dosya adlarıyla veya concat-count parametresiyle uğraşmazsınız.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.