Menggabungkan beberapa file WAV menggunakan perintah tunggal, tanpa file tambahan

32

Saya ingin menggabungkan beberapa file WAV menjadi satu file WAV menggunakan FFMPEG.

Saya telah menggunakan perintah berikut dan menghasilkan file yang diperlukan.

Perintah:

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

File:

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

Tetapi seperti yang Anda lihat masalahnya adalah saya harus membuat file teks untuk menentukan daftar file WAV untuk digabungkan.

Saya dapat melakukan semua tugas ini, tetapi saya lebih suka perintah tunggal yang terlihat seperti

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

atau

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

Saya telah mencoba dua perintah sederhana ini tetapi hanya mengembalikan suara 1.wav Tolong bantu saya menulis satu perintah (atau koreksi 2 perintah di atas) yang mencapai hasil yang diinginkan.

Tolong jangan menyarankan Media Encoders / Editor lainnya, saya ingin menggunakan FFMPEG saja, karena sudah diinstal dan digunakan di tempat lain.

Manu
sumber

Jawaban:

34

Anda dapat mencoba menggunakan filter concat ; itu membutuhkan pengodean ulang, dan dengan demikian akan membutuhkan lebih banyak sumber daya sistem (jumlah yang sangat kecil pada komputer modern yang samar-samar dalam kasus khusus ini), tetapi PCM -> audio PCM harus secara matematis lossless. Dalam kasus Anda, Anda akan menggunakan sesuatu seperti:

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

Jika Anda memiliki lima file input, gunakan n=5.

Evilsoup
sumber
4
Catatan: Jangan menyesuaikan [0:0][1:0][2:0][3:0]untuk mencocokkan jumlah file. Gunakan itu persis seperti yang dikatakan. Satu-satunya hal yang harus Anda ubah adalah file input dan n=4.
Keavon
8
@ Koavon: apakah Anda yakin? Di sini ffmpeg (versi N-49352-gc46943e x64) mengeluh Too many inputs specified for the "concat" filter.ketika saya mencoba memproses hanya 2 input dengan kode asli. Ini berfungsi meskipun ketika saya menghapus [2:0][3:0]... yang masuk akal bagi saya karena dalam kasus ini tidak ada hal seperti stream 2:0dan 3:0...
Bigue Nique
Saya setuju dengan @BigueNique. Saya juga mengalami kesalahan yang sama dan meskipun terasa sedikit konyol, menulis beberapa kode untuk menghasilkan urutan yang tepat yang diberikan n.
Ryan DuVal
19

Saya pikir pilihan terbaik adalah menggunakan sox, bukan ffmpeg:

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

Solusi berasal dari Bagaimana cara menambahkan sekelompok file .wav sambil mempertahankan (tidak-nol-empuk) pemesanan numerik?

Héctor M. Monacci
sumber
1
Ini mungkin berhasil .wav, tetapi soxtampaknya tidak mendukung .mp3.
Aaron Franke
1
Pertanyaan tepatnya tentang.wav
Héctor M. Monacci
1
Saya tahu, saya hanya menambahkan catatan untuk siapa saja yang mencoba menggunakan metode ini dengan file non-wav.
Aaron Franke
pertanyaannya secara eksplisit menyatakan bahwa solusi diperlukan menggunakan ffmpeg saja!
Manu
sox dapat mendukung file .mp3 juga
Benjamin
9

The FFmpeg wiki menyebutkan menggunakan concatprotokol ini tidak mungkin dengan semua jenis file. Ini berfungsi baik dengan sebagian besar wadah MPEG dan bitstream, tetapi jelas bukan file WAV dengan audio PCM.

Anda tidak harus membuat file sementara dan menggunakannya. Dengan Bash (atau shell lain yang mendukung substitusi proses ), Anda dapat melakukan segalanya dalam satu perintah:

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

Substitusi proses <( )membuat file — atau, tepatnya, deskriptor file — dengan cepat, yang ffmpegbisa dibaca. File ini akan berisi path ke setiap .wavfile di direktori saat ini. Kami harus mengawalnya dengan $(pwd)untuk mendapatkan jalur yang benar relatif terhadap direktori Anda saat ini, dan tidak relatif terhadap deskriptor file.

Tentu saja, perintah dalam substitusi dapat diubah menjadi sesuatu yang lain.

slhck
sumber
2
Jika Anda mendapatkan Unsafe file namekesalahan, Anda perlu -safe 0opsi sebelumnya -i. ref. stackoverflow.com/q/38996925/297679
Nobu
3

Pilihan lain adalah menggunakan concat

ffmpeg -i "concat: file1.mp3 | file2.mp3 | file3.mp3" -acodec copy out.mp3

Ivan Malyshev
sumber
1
Selamat datang di superuser: Meskipun ini mungkin atau mungkin tidak menjawab pertanyaan, (jawaban telah diterima) itu akan menjadi jawaban yang lebih baik jika Anda bisa memberikan beberapa penjelasan mengapa solusi Anda bekerja dengan detail dan instruksi yang mudah diikuti. Jika Anda merasa jawaban Anda benar lakukan hal-hal ini dan edit kembali. Silakan luangkan beberapa menit dan baca: - superuser.com/help. Menjawab: superuser.com/help/how-to-answer , sekali lagi selamat datang di superuser.Terima kasih
mic84
Saya menguji ini dan tampaknya tidak berhasil
Nick Long
1

Dalam skrip Cmd.EXE .BAT Win8:

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

Dengan cara ini, Anda tidak perlu repot-repot dengan nama file sumber atau parameter perhitungan jumlah.

Pedang Spanyol
sumber
-1

Anda dapat menggunakan shntoolfile-file wav.

shnjoin -r none 01.wav 02.wav ...
Patrik Wallander
sumber