Dodaj ciszę na końcu pliku MP3

12

Czy ktoś z was zna sposób dodania ciszy o określonym czasie trwania do końca pliku MP3 w Linuksie? Na przykład używając MEncodera, FFmpeg itp.?

Musi to być wiersz poleceń, ponieważ będzie on skryptowany i uruchamiany na naszym serwerze.

Rozglądałem się wokół tego i najlepsze, co mogłem zrobić, to użyć padfunkcji w SoX , ale to nie zadziała z plikami MP3.

Mógłbym przekonwertować go na WAV, użyć SoX, a następnie ponownie przekonwertować na MP3 i skopiować metadane (minus czas trwania) z oryginału do nowego MP3. Ale zanim napisałem skrypt na ten temat, pomyślałem, że sprawdzę, czy istnieje jedno trafienie.

Max Williams
źródło
2
Myślę, że możesz osiągnąć coś takiego za pomocą mp3DirectCut (tylko Windows, ale mówią, że jest kompatybilny z Linuksem pod Wine), co pozwala uniknąć ponownej kompresji danych dźwiękowych. Gdybyś miał wybrać MP3 -> WAV -> MP3, ponownie skompresowałbyś już skompresowany strumień danych MP3, tracąc przy tym sporo jakości.
Przełom
Dzięki. Czy możesz uruchomić oprogramowanie Windows za pomocą Wine z wiersza poleceń? Jeśli to możliwe, wolałbym unikać rozwiązań Wine, ponieważ niechętnie instaluję Wine na naszym serwerze.
Max Williams
Hmm, możesz ominąć szlak wina, jeśli go jeszcze nie masz. Sam Wine jest dość dużym plikiem do pobrania, znacznie powyżej megabajta lub dwóch, dla prostego narzędzia do wycinania / scalania plików MP3. Jestem pewien, że istnieje równoważne rozwiązanie dla Linuxa. Jeśli znajdę jakieś dodatkowe narzędzia, z pewnością dam Ci znać.
Przełom

Odpowiedzi:

9

Możesz to zrobić z łatwością dzięki padargumentowi SoX i następującej składni:

sox <oldfile> <newfile> pad <silence at beginning of file> <silence at end of file>

Przykład:

sox mp3.mp3 mp3withsilence.mp3 pad 0 1

Cisze są w kilka sekund. (Inne zastosowania są możliwe przy użyciu innej składni, aby wstawić te cisze w określonych miejscach. Więcej informacji znajduje się w dokumentacji SoX.)

Fabien Snauwaert
źródło
Powinienem zauważyć, że przetestowałem to OK z plikami MP3 (z zainstalowanymi libmad-0.dll i libmp3lame-0.dll, odpowiednio do dekodowania i kodowania plików MP3). W miarę możliwości polecam pracę w formacie bezstratnym i konwersję tylko do Tylko MP3 na końcu.
Fabien Snauwaert
to naprawdę fajne - dzięki Fabien!
Max Williams
Czy to jest bezstratne?
Geremia
Aktualizacja: Na stronie podręcznika sox przeczytałem, że konwertuje na format wewnętrzny, a następnie ponownie koduje…
Geremia,
MP3 to format stratny. Kodowanie i ponowne kodowanie do formatu stratnego spowoduje stopniowe pogorszenie jakości dźwięku (bez względu na to, czy go słyszysz, czy nie). W związku z tym najlepiej pracować z formatami bezstratnymi i kodować do formatu stratnego tylko raz, na końcu. Aby uzyskać listę stratnych kodeków audio: en.wikipedia.org/wiki/Lossy_compression#Audio oraz listę bezstratnych kodeków audio en.wikipedia.org/wiki/Lossless_compression#Audio
Fabien Snauwaert
15

Za pomocą ffmpeg możesz użyć filtra aevalsrc do wygenerowania ciszy, a następnie w drugim poleceniu użyj protokołu concat, aby połączyć je bezstratnie:

ffmpeg -filter_complex aevalsrc=0 -t 10 10SecSilence.mp3
ffmpeg -i "concat:input.mp3|10SecSilence.mp3" -c copy output.mp3

Możesz kontrolować długość ciszy, zmieniając -t 10na dowolny czas w sekundach, który wolisz. Oczywiście musisz wygenerować ciszę tylko raz, a następnie możesz zatrzymać plik i użyć go do wypełnienia każdego z plików, który chcesz. Możesz także poszukać demuxera konkatatu - jest on nieco bardziej obciążający procesor, ale łatwiej jest wpaść w skrypt powłoki.

Jeśli chcesz to zrobić za pomocą jednego polecenia, możesz użyć filtru konkat - będzie to wymagać ponownego kodowania dźwięku (ponieważ wykresy filtrów są niezgodne z -codec copy), więc powyższa opcja prawdopodobnie będzie dla Ciebie najlepsza. Ale może to być przydatne dla każdego, kto pracuje z surowym PCM, chcąc dodać ciszy do końca przed kodowaniem dźwięku:

ffmpeg -i input.mp3 \
-filter_complex 'aevalsrc=0::d=10[silence];[0:a][silence]concat=n=2:v=0:a=1[out]' \
-map [out] -c:a libmp3lame -q:a 2 output.mp3

Kontroluj długość ciszy, zmieniając ją d=10na dowolny czas (w sekundach), jaki chcesz. Jeśli skorzystasz z tej metody, może okazać się przydatny przewodnik po kodowaniu MP3 FFmpeg .

zła
źródło
dzięki @evilsoup. Właśnie tego spróbowałem i otrzymałem następujący - max-thinkpad-linux: ~ $ ffmpeg -filter_complex aevalsrc = 0 -t 4.61 cisza.mp3ffmpeg version 0.8.4-4:0.8.4-0ubuntu0.12.04.1, Copyright (c) 2000-2012 the Libav developers built on Nov 6 2012 16:51:33 with gcc 4.6.3 *** THIS PROGRAM IS DEPRECATED *** This program is only provided for compatibility and will be removed in a future release. Please use avconv instead. Unrecognized option 'filter_complex' Failed to set value 'aevalsrc=0' for option 'filter_complex'
Max Williams
@max Po pierwsze, używasz avconv z projektu libav - są one rozwidleniem FFmpeg, którego używają Debian i Ubuntu zamiast głównego projektu, i zapewniają kaleką wersję ffmpeg. Spróbuj użyć avconvzamiast - składnia powinna być taka sama, po prostu zastąpić ffmpegz avconv.
evilsoup
Jeśli to nie zadziała, spróbuj uaktualnić do nowszej wersji ffmpeg. Ponieważ jesteś na Ubuntu, powinieneś być w stanie korzystać z tego PPA , lub w najnowszej wersji możesz go skompilować ze źródła .
evilsoup
1
@MaxWilliams Lub możesz pobrać kompilację statyczną , której nie musisz najpierw kompilować. Wystarczy pobrać, rozpakować, użyć.
slhck 15.01.2013
1
do wykorzystania w przyszłości: jeśli napotkasz błąd taki jak ja, spróbuj zastąpić pojedyncze cudzysłowy podwójnymi cudzysłowami
SZT