Aggiungi silenzio alla fine di un MP3


12

Qualcuno di voi conosce un modo per aggiungere il silenzio di una durata fissa alla fine di un MP3, in Linux? Ad esempio usando MEncoder, FFmpeg, ecc?

Deve essere a riga di comando poiché verrà scriptato ed eseguito sul nostro server.

Ho cercatopad su Google e il meglio che potevo fare è usare la funzione in SoX , ma non funzionerà con gli MP3.

Potrei convertirlo in WAV, usare SoX, quindi convertirlo nuovamente in MP3 e copiare i metadati (meno la durata) dall'originale al nuovo MP3. Ma, prima di scrivere una sceneggiatura, pensavo di vedere se esiste una soluzione a colpo singolo.


2
Penso che puoi realizzare qualcosa del genere con mp3DirectCut (solo Windows, ma dicono che è compatibile con Linux sotto Wine), che evita di ricomprimere i dati audio. Se dovessi andare MP3 -> WAV -> MP3, ricomprimerai il flusso di dati già compresso MP3, perdendo molta qualità lungo il percorso.
Sfondamento

Grazie. È possibile eseguire il software Windows tramite Wine dalla riga di comando? Preferirei evitare le soluzioni di Wine, se possibile, dato che sono riluttante ad installare Wine sul nostro server.
Max Williams,

Hmm, potresti voler evitare la Strada del Vino se non l'hai già. Il vino stesso è un download abbastanza grande, ben sopra un megabyte o due per un semplice strumento di taglio / unione MP3. Sono sicuro che esiste una soluzione nativa equivalente per Linux. Se trovo altri strumenti, ti farò sapere.
Sfondamento

Risposte:


9

Puoi farlo facilmente con l' padargomento di SoX e la seguente sintassi:

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

Esempio:

sox mp3.mp3 mp3withsilence.mp3 pad 0 1

Quei silenzi sono in pochi secondi. (Altri usi sono possibili usando una sintassi diversa, in modo da inserire quei silenzi in posizioni specifiche. Vedere la documentazione SoX per ulteriori informazioni.)


Devo notare che l'ho testato bene con i file MP3 (con libmad-0.dll e libmp3lame-0.dll installati, rispettivamente per la decodifica e la codifica di MP3.) Per quanto possibile, consiglierei di lavorare con un formato senza perdita e convertire solo in MP3 solo alla fine.
Fabien Snauwaert,

è davvero fantastico - grazie Fabien!
Max Williams

Questo è senza perdite?
Geremia,

Aggiornamento: ho letto nella manpage sox che converte in un formato interno e poi ricodifica ...
Geremia,

MP3 è un formato con perdita di dati. La codifica e la ricodifica in un formato con perdita degraderanno progressivamente la qualità dell'audio (che tu lo ascolti o meno.) Pertanto, è meglio lavorare con formati senza perdita e codificare in un formato con perdita solo alla fine. Per un elenco di codec audio con perdita: en.wikipedia.org/wiki/Lossy_compression#Audio e per un elenco di codec audio senza perdita en.wikipedia.org/wiki/Lossless_compression#Audio
Fabien Snauwaert

15

Con ffmpeg, è possibile utilizzare il filtro aevalsrc per generare silenzio, quindi in un secondo comando utilizzare il protocollo concat per combinarli senza perdita di dati:

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

Puoi controllare la durata del silenzio modificando il -t 10tempo che preferisci in secondi. Ovviamente, devi solo generare il silenzio una volta, quindi puoi tenere il file in giro e usarlo per riempire ciascuno dei file che desideri. Potresti anche cercare il demuxer concat - è leggermente più dispendioso in termini di processore, ma potresti trovare più facile trascinarlo in uno script di shell.

Se vuoi farlo in un solo comando, puoi usare il filtro concat - questo richiederà di ricodificare l'audio (poiché i filtri non sono compatibili con -codec copy), quindi l'opzione sopra sarà probabilmente la migliore per te. Ma questo può essere utile per chiunque lavori con PCM raw, cercando di aggiungere silenzio alla fine prima di codificare l'audio:

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

Controlla la durata del silenzio cambiando d=10nel tempo (in secondi) che desideri. Se usi questo metodo, potresti trovare utile questa guida alla codifica MP3 di FFmpeg .


grazie @evilsoup. Ho appena provato e ottenuto quanto segue - max-thinkpad-linux: ~ $ ffmpeg -filter_complex aevalsrc = 0 -t 4.61 silence.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 Prima di tutto, stai effettivamente usando avconv dal progetto libav - sono un fork di FFmpeg che Debian e Ubuntu stanno usando al posto del progetto principale, e forniscono una versione paralizzata di ffmpeg. Prova avconvinvece ad usare : la sintassi dovrebbe essere la stessa, basta sostituirla ffmpegcon avconv.
evilsoup,

Se il problema persiste, prova a passare a una versione più recente di ffmpeg. Dato che sei su Ubuntu, dovresti essere in grado di utilizzare questo PPA o, per l'ultima versione, potresti compilarlo dal sorgente .
evilsoup,

1
@MaxWilliams Oppure potresti scaricare una build statica , che non devi compilare prima. Basta scaricare, estrarre, utilizzare.
slhck,

1
per riferimento futuro: se si riscontrano errori come me, provare a sostituire le virgolette singole con virgolette doppie
SZT
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.