Połącz wiele plików WAV za pomocą jednego polecenia, bez dodatkowego pliku


32

Chcę połączyć wiele plików WAV w jeden plik WAV za pomocą FFMPEG.

Użyłem następującego polecenia i generuje on wymagany plik.

Dowództwo:

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

Plik:

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

Ale jak widać problem polega na tym, że muszę utworzyć plik tekstowy, aby określić listę plików WAV do konkatenacji.

Mogę wykonać wszystkie te zadania, ale wolałbym jedno polecenie, które wygląda

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

lub

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

Próbowałem tych dwóch prostych poleceń, ale zwracają tylko głos 1.wav Proszę o pomoc w napisaniu pojedynczego polecenia (lub poprawienia powyższych 2 poleceń), które osiągną pożądany rezultat.

Proszę nie sugerować innych Media Encoders / Editors, chcę używać tylko FFMPEG, ponieważ jest już zainstalowany i używany w innych miejscach.

Odpowiedzi:


34

Możesz spróbować użyć filtru konkat ; wymaga ponownego kodowania, a więc zajmie więcej zasobów systemowych (w tym konkretnym przypadku dość niewielkiej ilości na dowolnym nieco nowoczesnym komputerze), ale dźwięk PCM -> PCM powinien być matematycznie bezstratny. W twoim przypadku użyłbyś czegoś takiego:

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

Jeśli masz pięć plików wejściowych, użyj n=5.


4
Uwaga: nie dostosowuj [0:0][1:0][2:0][3:0]do liczby plików. Używaj tego dokładnie tak, jak mówi. Jedyne, co powinieneś zmienić, to pliki wejściowe i n=4.
Keavon,

8
@Keavon: jesteś pewien? Tutaj ffmpeg (wersja N-49352-gc46943e x64) narzeka, Too many inputs specified for the "concat" filter.gdy próbuję przetworzyć tylko 2 dane wejściowe z oryginalnym kodem. Działa to, gdy [2:0][3:0]2:03:0
usuwam

Zgadzam się z @BigueNique. Ja również napotkałem ten sam błąd i choć wydaje się to trochę głupie, napisałem trochę kodu, aby wygenerować odpowiednią podaną sekwencję n.
Ryan DuVal

19

Myślę, że najlepszą opcją jest użycie sox, a nie ffmpeg:

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

Rozwiązanie pochodzi z tego, jak dodać kilka plików .wav, zachowując porządek numeryczny (bez zerowania)?


1
Może to działać .wav, ale soxwydaje się nie wspierać .mp3.
Aaron Franke,

1
Pytanie dotyczyło dokładnie.wav
Héctor M. Monacci

1
Wiem, właśnie dodam notatkę dla każdego, kto próbuje użyć tej metody w przypadku plików innych niż WAV.
Aaron Franke,

pytanie wyraźnie stwierdzało, że rozwiązanie jest wymagane tylko przy użyciu ffmpeg!
Manu

sox może również obsługiwać pliki .mp3
Benjamin

9

FFmpeg wiki wspomina pomocą concatprotokołu nie jest możliwe w przypadku wszystkich typów plików. Działa dobrze z większością kontenerów MPEG i strumieni bitów, ale oczywiście nie ma plików WAV z dźwiękiem PCM.

Nie musisz koniecznie tworzyć pliku tymczasowego i używać go. Dzięki Bash (lub innym powłokom, które obsługują podstawianie procesów ), możesz zrobić wszystko za pomocą jednego polecenia:

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

Podstawienie procesu <( )tworzy plik - lub ściślej deskryptor pliku - w locie, który ffmpegmożna odczytać. Ten plik będzie zawierać ścieżkę do każdego .wavpliku w bieżącym katalogu. Musimy go poprzedzić, $(pwd)aby uzyskać poprawną ścieżkę względem bieżącego katalogu, a nie względem deskryptora pliku.

Oczywiście polecenie w ramach podstawienia można zmienić na coś innego.


2
Jeśli pojawi się Unsafe file namebłąd, wcześniej będziesz potrzebować -safe 0opcji -i. ref. stackoverflow.com/q/38996925/297679
Nobu

3

Inną opcją jest użycie konkat

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


1
Witamy w superużytkowniku: Chociaż może to odpowiedzieć na pytanie lub nie (odpowiedź została zaakceptowana), lepszą odpowiedzią byłoby podanie wyjaśnienia, dlaczego Twoje rozwiązanie działa ze szczegółami i łatwych do wykonania instrukcji. Jeśli uważasz, że Twoja odpowiedź jest poprawna, wykonaj te czynności i ponownie je edytuj. Poświęć kilka minut i przeczytaj: - superuser.com/help. Odpowiedź: superuser.com/help/how-to-answer , ponownie witamy w superuserie.
Dziękujemy

Przetestowałem to i nie wydaje się działać
Nick Long

1

W skrypcie Cmd.EXE WinB's .BAT:

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

W ten sposób nie zawracasz sobie głowy nazwami plików źródłowych ani parametrem concat-count.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.