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.

Manu
źródło

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.

zła
źródło
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)?

Héctor M. Monacci
źródło
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.

slhck
źródło
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

Ivan Malyshev
źródło
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.

Bilbo
źródło
-1

Możesz użyć shntooldo plików wav.

shnjoin -r none 01.wav 02.wav ...
Patrik Wallander
źródło