Concaténation de plusieurs fichiers .mp3 en un seul .mp3

46

Comme il a été suggéré ici, j'utilise une catcommande pour concaténer plusieurs fichiers .mp3 en un seul fichier .mp3.

Imaginez, j'ai les fichiers .mp3 suivants dans le dossier actuel:

001001.mp3 001002.mp3 001003.mp3 001004.mp3 001005.mp3

ou comme ceci:

096001.mp3 096002.mp3 096003.mp3 096004.mp3

Je dois concaténer ces fichiers .mp3 en ordre croissant, c.-à-d. 001001.mp3+001002.mp3+001003.mp3+etc.

Afin de joindre ces fichiers .mp3 en un seul, j'exécute la commande suivante dans le dossier actuel:

cat *.mp3 > final.mp3

J'ai testé le fichier final .mp3 et c'est ce à quoi je m'attendais, mais je dois être sûr que la commande ci-dessus sélectionne les fichiers dans leur ordre croissant.

Puis-je être sûr que la commande ci-dessus concatène toujours des fichiers dans l'ordre croissant?

Merci Monsieur !

Bakhtiyor
la source

Réponses:

46

catn'est pas le bon outil pour ce travail. Le format MP3 contient toutes sortes de fichiers indésirables qui peuvent se cacher à l’avant et à la fin du fichier, ce qui doit être éliminé. mp3wrapc'est ce que tu veux. Cela exclura toutes les métadonnées dans les fichiers et collera l'audio ensemble.

sudo apt-get install mp3wrap
mp3wrap output.mp3 *.mp3

Avant de faire cela, exécutez ls *.mp3pour vérifier qu'ils sont dans le bon ordre. Lorsque j'ai initialement écrit cette réponse (il y a plus de six ans!), Les globs génériques ne se comportaient apparemment pas bien, mais je pense qu'ils le font maintenant.

Vous devrez peut-être renommer les fichiers si, par exemple, ils sont numérotés mais ne sont pas remplis de zéros, {1-11}.mp3ils seront triés par 1 10 11 2 3 4 5 6 7 8 9. Cela peut être corrigé facilement .

Oli
la source
2
Right-cat modifiera le format de fichier mp3 en "créant un tableau" (pour ainsi dire) de fichiers mp3 dans un seul fichier mp3. Mais cela semble fonctionner si le logiciel du lecteur est suffisamment intelligent.
Cela a fonctionné mieux pour moi, car il gère les mp3 avec des espaces dans le nom du fichier:find . -maxdepth 1 -iname '*.mp3' -print0 | sort -z | xargs -0 mp3wrap output.mp3
bmaupin
@bmaupin Un point juste mais je ne suis pas sûr de savoir pourquoi je n'utilisais pas uniquement l'extension wildcard de Bash. *.mp3devrait suffire (et travaille avec des espaces).
Oli
Disponible pour mac à partir du gestionnaire de paquets infusion ! $ brew install mp3wrap.
Rubens
1
En bash, il *.mp3est garanti de préserver l’ordre alphabétique. Si vos fichiers sont nommés 09.mp3, 10.mp3, 11.mp3, c'est probablement ce que vous voulez. Si vos fichiers sont nommés 9.mp3, 10.mp3, 11.mp3, qui est sans doute pas ce que vous voulez, mais vous pouvez le faire `ls *.mp3 | sort -n`.
Jo Liss
27

mp3wrap semble être une solution assez convenable, mais lorsque j'ai lu le fichier résultant, l'horodatage n'était pas correct. Il semble que la meilleure utilisation de mp3wrap est lorsque vous joignez des mp3 dans un fichier que vous voudrez scinder plus tard.

Je voulais simplement concaténer de façon permanente des mp3 ensemble. J'ai fini par utiliser ffmpeg pour concaténer les fichiers:

  1. Tout d'abord, installez ffmpeg

    • Ubuntu 15.04+

      sudo apt install ffmpeg
    • Ubuntu 14.10 et inférieur
      Accédez à http://ffmpeg.org/download.html , téléchargez l'une des versions statiques, décompressez-la et copiez-la dans / usr / local / bin.

  2. ffmpeg -i "concat:file1.mp3|file2.mp3" -acodec copy output.mp3

Plus d'infos: https://trac.ffmpeg.org/wiki/Concatenate#protocol
https://superuser.com/a/314245

bmaupin
la source
ffmpegest manquant, mais le avconvremplace: askubuntu.com/questions/432542/…
muru le
2
Oui, j'ai utilisé avconv pendant un certain temps, mais j'avais besoin de fonctionnalités que ffmpeg avait et avconv ne l'avaient pas, et je ne les utilisais plus depuis. Ces jours-ci, nous avons l'impression de perdre du temps à vérifier si avconv dispose des fonctionnalités dont j'ai besoin quand je sais déjà que ffmpeg en possède.
bmaupin
N'hésitez pas à vous joindre à cette discussion sur le rapport de bogue.
Orschiro
J'ai essayé cela et ça ne marche pas très bien; essayez en cours d' exécution à output.mp3travers un mp3valet vous verrez toutes sortes d'erreurs qui vont créer des problèmes de lecture dans Chrome64 + (voir bugs.chromium.org/p/chromium/issues/detail?id=794782 et bugs.chromium.org/p/chromium/ problèmes / détail? id = 806601 # c10 )
Nino Škopac le
solution géniale. de toute façon à normaliser les chansons aussi?
ar2015
8

Comme suggéré précédemment, mp3wrapc'est une bonne solution. Cela peut ne pas fonctionner tout le temps cependant. Autant que je sache, mp3wrapsupposons que tous les fichiers d'entrée présentent les mêmes caractéristiques, telles que VBR, CBR, bitrate, etc. Si cette hypothèse n'est pas respectée, il est probable qu'elle échoue. Dans ce cas, la seule solution serait de décoder tous les fichiers MP3 en un format brut tel que .wav, de les concaténer avec un programme tel que soxet de terminer en réencodant tous les fichiers au format MP3.

Loevborg
la source
Notez que le recodage de fichiers MP3 (également appelé "transcodage") entraînera une perte de qualité. Je ne le recommanderais pas.
Martin Tournoij
5

Il effectue un tri alphabétique basé sur des caractères uniques. Cela signifie que "01" vient avant "1", puisque rien n'a une valeur inférieure à un.

Voici un exemple. J'ai un répertoire avec les fichiers 1, 2, 3, 04, 05 et 06. Ce sont des fichiers texte qui contiennent leurs propres noms de fichier:

test$ cat *
04
05
06
1
2
3

Alors oui, ça va; mais vous devez vous assurer que tous vos fichiers sont correctement "rembourrés".

Cette ligne astucieuse de script bash vous permettra de comparer visuellement les noms de fichiers, ce qui facilitera la détection des erreurs:

for f in $(ls); do printf "%05s\n" "$f"; done

Sa sortie ressemblera à ceci:

   04
   05
   06
    1
    2
    3

Si ce n'est pas le cas, vous devrez tamponner les noms de fichier: Le script Bash pour tamponner les noms de fichier sur StackOverflow explique comment procéder.


Modifier. Votez pour la réponse d'Oli, c'est beaucoup mieux. : P
Je vais laisser le mien parce qu'il ajoute quelque chose, mais vous devriez utiliser sa solution,

mp3wrap output.mp3 `ls -1 *.mp3 | sort`

Gardez à l'esprit que sortles choses vont toujours trier de la manière décrite ci-dessus, vous aurez toujours besoin de classer les noms de fichiers s'ils ne sont pas égaux en longueur.

Stefano Palazzo
la source
4

La plupart des gens suggèrent mp3wrap, mais cela a des inconvénients: le fichier généré ne rapporte pas sa longueur totale chez certains lecteurs, et vous ne pouvez pas chercher au-delà de ce point.

mp3catfait le travail vite et bien, autant que je sache. Il peut être téléchargé sur http://mulholland.xyz/dev/mp3cat/ et utilisé comme suit:

mp3cat file1.mp3 file2.mp3 file3.mp3

une autre possibilité serait sox

sudo apt-get install sox libsox-fmt-mp3
sox file1.mp3 file2.mp3 target.mp3

mais cela semble très lent (peut-il décoder et réencoder l'audio?)

josinalvo
la source
3

J'ai trouvé que le service audio-menuisier en ligne fonctionnait très bien et conservait l'heure exacte (contrairement à mp3wrap).

Orschiro
la source
0

Vous voudrez peut-être essayer d’utiliser un programme d’édition audio dédié (comme Audacity )

Lawand
la source
0

J'adore le commentaire de bmaupin , qui pourrait néanmoins produire des nombres naturels (version) en utilisant sort -V:

find . -maxdepth 1 -iname '*.mp3' -print0 | sort -Vz | xargs -0 mp3wrap ../tmp.mp3

et vous n'avez pas à traiter avec des caractères spéciaux comme ' " () [] {}dans le nom du fichier.

zhoux
la source