Ajoutez du silence à la fin d'un MP3

12

Est-ce que l'un d'entre vous connaît un moyen d'ajouter du silence d'une durée fixe à la fin d'un MP3, sous Linux? Par exemple, en utilisant MEncoder, FFmpeg, etc.?

Il doit être en ligne de commande car il sera scripté et exécuté sur notre serveur.

J'ai cherché sur Google et le mieux que je pouvais faire était d'utiliser la padfonction dans SoX , mais cela ne fonctionnerait pas avec les MP3.

Je pourrais le convertir en WAV, utiliser SoX, puis le reconvertir en MP3 et copier les métadonnées (moins la durée) de l'original vers le nouveau MP3. Mais, avant d'écrire un script pour cela, j'ai pensé voir s'il y avait une solution à un coup.

Max Williams
la source
2
Je pense que vous pouvez accomplir quelque chose comme ça avec mp3DirectCut (Windows uniquement, mais ils disent qu'il est compatible avec Linux sous Wine), ce qui évite de recompresser les données sonores. Si vous deviez MP3 -> WAV -> MP3, vous recompresseriez le flux de données déjà compressé MP3, perdant beaucoup de qualité en cours de route.
Percée du
Merci. Pouvez-vous exécuter un logiciel Windows via Wine à partir de la ligne de commande? Je préférerais éviter les solutions Wine si possible car je suis réticent à installer Wine sur notre serveur.
Max Williams
Hmm, vous voudrez peut-être éviter la route des vins si vous ne l'avez pas déjà. Wine lui-même est un téléchargement assez volumineux, bien au-dessus d'un mégaoctet ou deux pour un simple outil de coupe / fusion MP3. Je suis sûr qu'il existe une solution native équivalente à Linux. Si je trouve des outils supplémentaires, je serai sûr de vous le faire savoir.
Percée du

Réponses:

9

Vous pouvez le faire facilement avec l' padargument de SoX et la syntaxe suivante:

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

Exemple:

sox mp3.mp3 mp3withsilence.mp3 pad 0 1

Ces silences sont en quelques secondes. (D'autres utilisations sont possibles en utilisant une syntaxe différente, afin d'insérer ces silences à des positions spécifiques. Voir la documentation SoX pour plus.)

Fabien Snauwaert
la source
Je dois noter que je l'ai testé OK avec des fichiers MP3 (avec libmad-0.dll et libmp3lame-0.dll installés, respectivement pour le décodage et l'encodage des MP3.) Autant que possible, je recommanderais de travailler avec un format sans perte et de convertir uniquement en MP3 à la fin seulement.
Fabien Snauwaert
c'est vraiment cool - merci Fabien!
Max Williams
Est-ce sans perte?
Geremia
Mise à jour: J'ai lu dans la page de manuel sox qu'elle convertit en un format interne puis réencode…
Geremia
MP3 est un format avec perte. L'encodage et le réencodage dans un format avec perte dégraderont progressivement la qualité de l'audio (que vous l'entendiez ou non). En tant que tel, il est préférable de travailler avec des formats sans perte et de n'encoder en un format avec perte qu'une seule fois, à la fin. Pour une liste des codecs audio avec perte: en.wikipedia.org/wiki/Lossy_compression#Audio et pour une liste des codecs audio sans perte en.wikipedia.org/wiki/Lossless_compression#Audio
Fabien Snauwaert
15

Avec ffmpeg, vous pouvez utiliser le filtre aevalsrc pour générer du silence, puis dans une seconde commande utiliser le protocole concat pour les combiner sans perte:

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

Vous pouvez contrôler la durée du silence en modifiant la durée -t 10en secondes que vous préférez. Bien sûr, vous n'avez besoin de générer le silence qu'une seule fois, puis vous pouvez conserver le fichier et l'utiliser pour remplir chacun des fichiers que vous souhaitez. Vous pouvez également rechercher le démultiplexeur concat - il est légèrement plus gourmand en processeur, mais il peut être plus facile de passer dans un script shell.

Si vous souhaitez le faire en une seule commande, vous pouvez utiliser le filtre de concaténation - cela vous obligera à ré-encoder votre audio (car les diagrammes de filtre sont incompatibles avec -codec copy), donc l'option ci-dessus sera probablement la meilleure pour vous. Mais cela peut être utile pour toute personne travaillant avec du PCM brut, qui cherche à ajouter du silence à la fin avant d'encoder 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

Contrôlez la durée du silence en modifiant la durée d=10(en secondes) souhaitée. Si vous utilisez cette méthode, vous pouvez trouver ce guide d'encodage MP3 FFmpeg utile.

evilsoup
la source
merci @evilsoup. Je viens d'essayer cela et j'ai obtenu ce qui suit - 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 Tout d'abord, vous utilisez en fait avconv du projet libav - ils sont un fork de FFmpeg que Debian et Ubuntu utilisent au lieu du projet principal, et ils fournissent une version paralysée de ffmpeg. Essayez d'utiliser à la avconvplace - la syntaxe doit être la même, remplacez simplement ffmpegpar avconv.
evilsoup
Si cela ne fonctionne pas, essayez de passer à une version plus récente de ffmpeg. Puisque vous êtes sur Ubuntu, vous devriez pouvoir utiliser ce PPA , ou pour la toute dernière version, vous pouvez le compiler à partir des sources .
evilsoup
1
@MaxWilliams Ou vous pouvez télécharger une version statique , que vous n'avez pas besoin de compiler en premier. Il suffit de télécharger, d'extraire, d'utiliser.
slhck
1
pour référence future: si vous rencontrez une erreur comme moi, essayez de remplacer les guillemets simples par des guillemets doubles
SZT