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.


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.)


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 .


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
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.