Ghép nhiều tệp WAV bằng lệnh đơn, không có tệp phụ


32

Tôi muốn ghép nhiều tệp WAV thành một tệp WAV bằng FFMPEG.

Tôi đã sử dụng lệnh sau đây và nó tạo ra các tập tin cần thiết.

Chỉ huy:

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

Tập tin :

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

Nhưng như bạn có thể thấy vấn đề là tôi phải tạo một tệp văn bản để chỉ định danh sách các tệp WAV cần ghép.

Tôi có thể thực hiện tất cả các nhiệm vụ này, nhưng tôi thích một lệnh duy nhất giống như

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

hoặc là

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

Tôi đã thử hai lệnh đơn giản này nhưng chúng chỉ trả về giọng nói của 1.wav Xin hãy giúp tôi viết một lệnh duy nhất (hoặc sửa 2 lệnh trên) để đạt được kết quả mong muốn.

Vui lòng không đề xuất Bộ mã hóa / Trình chỉnh sửa phương tiện khác, tôi chỉ muốn sử dụng FFMPEG vì nó đã được cài đặt và sử dụng ở những nơi khác.

Câu trả lời:


34

Bạn có thể thử sử dụng bộ lọc concat ; nó yêu cầu mã hóa lại, và do đó sẽ tốn nhiều tài nguyên hệ thống hơn (một lượng khá nhỏ trên bất kỳ máy tính hiện đại mơ hồ nào trong trường hợp cụ thể này), nhưng âm thanh PCM -> PCM không bị mất toán học. Trong trường hợp của bạn, bạn sẽ sử dụng một cái gì đó như:

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

Nếu bạn có năm tệp đầu vào, sử dụng n=5.


4
Lưu ý: Không tùy chỉnh [0:0][1:0][2:0][3:0]để khớp với số lượng tệp. Sử dụng chính xác như nó nói. Điều duy nhất bạn nên thay đổi là các tập tin đầu vào và n=4.
Keavon

8
@Keavon: bạn có chắc không? Ở đây ffmpeg (phiên bản N-49352-gc46943e x64) phàn nàn Too many inputs specified for the "concat" filter.khi tôi cố gắng xử lý chỉ 2 đầu vào với mã gốc. Nó hoạt động mặc dù khi tôi loại bỏ [2:0][3:0]... điều này có ý nghĩa với tôi vì trong trường hợp này không có những thứ như stream 2:03:0...
Bigue Nique

Tôi đồng ý với @BigueNique. Tôi cũng gặp phải lỗi tương tự và mặc dù cảm thấy hơi ngớ ngẩn, đã viết một số mã để tạo ra trình tự phù hợp được đưa ra n.
Ryan DuVal

19

Tôi nghĩ tùy chọn tốt nhất là sử dụng sox, không phải ffmpeg:

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

Giải pháp xuất phát từ Làm cách nào để tôi thêm một loạt các tệp .wav trong khi vẫn giữ thứ tự số (không phải không đệm)?


1
Điều này có thể làm việc cho .wav, nhưng soxdường như không hỗ trợ .mp3.
Aaron Franke

1
Câu hỏi chính xác là về.wav
Héctor M. Monacci 16/03/18

1
Tôi biết, tôi chỉ thêm một ghi chú cho bất kỳ ai cố gắng sử dụng phương pháp này với các tệp không phải wav.
Aaron Franke

câu hỏi tuyên bố rõ ràng rằng chỉ cần một giải pháp bằng cách sử dụng ffmpeg!
Manu

sox cũng có thể hỗ trợ các tệp .mp3
Benjamin

9

Các FFmpeg wiki đề cập đến việc sử dụng các concatgiao thức là không thể với tất cả các loại tập tin. Nó hoạt động tốt với hầu hết các bộ chứa MPEG và dòng bit, nhưng rõ ràng không phải là tệp WAV có âm thanh PCM.

Bạn không nhất thiết phải tạo một tệp tạm thời và sử dụng tệp đó. Với Bash (hoặc các shell khác hỗ trợ thay thế quá trình ), bạn có thể thực hiện mọi thứ trong một lệnh duy nhất:

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

Sự thay thế quá trình <( )tạo ra một tập tin, hay nói chính xác là một bộ mô tả tập tin, một cách nhanh chóng, ffmpegcó thể đọc được. Tệp này sẽ chứa đường dẫn đến mọi .wavtệp trong thư mục hiện tại. Chúng tôi phải thêm tiền tố $(pwd)vào để có được đường dẫn chính xác liên quan đến thư mục hiện tại của bạn và không liên quan đến bộ mô tả tệp.

Tất nhiên, lệnh trong thay thế có thể được thay đổi thành một cái khác.


2
Nếu bạn gặp Unsafe file namelỗi, bạn sẽ cần -safe 0tùy chọn trước -i. tham chiếu stackoverflow.com/q/38996925/297679
Nobu

3

Một lựa chọn khác là sử dụng concat

ffmpeg -i "concat: file1.mp3 | file2.mp3 | file3.mp3" -acodec sao chép ra.mp3


1
Chào mừng bạn đến với superuser: Mặc dù điều này có thể hoặc không thể trả lời câu hỏi, (câu trả lời đã được chấp nhận), nó sẽ là một câu trả lời tốt hơn nếu bạn có thể cung cấp một số giải thích tại sao giải pháp của bạn hoạt động chi tiết và dễ làm theo hướng dẫn. Nếu bạn cảm thấy câu trả lời của mình là chính xác, hãy làm những điều này và chỉnh sửa lại. Vui lòng dành vài phút và đọc: - superuser.com/help. Trả lời: superuser.com/help/how-to-answer , một lần nữa chào mừng bạn đến với superuser.Thankyou
mic84 24/03/18

Tôi đã thử nghiệm cái này và nó dường như không hoạt động
Nick Long

1

Trong tập lệnh Cmd.EXE .BAT của 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

Bằng cách này, bạn không bận tâm với tên tệp nguồn hoặc tham số đếm concat.


-1

Bạn có thể sử dụng shntoolcho các tập tin wav.

shnjoin -r none 01.wav 02.wav ...
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.