web-dev-qa-db-fra.com

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

Comme cela a été suggéré ici J'utilise la commande catpour 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 .mp3 final 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 séquence ascendante.

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

Merci Monsieur !

43
Bakhtiyor

cat n'est pas le bon outil pour ce travail. Le format MP3 contient toutes sortes d’ordures qui peuvent se cacher à l’avant et à la fin du fichier et cela doit être supprimé. mp3wrap est ce que vous voulez. 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 *.mp3 pour 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 contiennent pas de zéros; {1-11}.mp3 serait trié par 1 10 11 2 3 4 5 6 7 8 9. Cela peut être corrigé facilement .

44
Oli

mp3wrap semble être une solution assez décente, 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
      Allez à 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

25
bmaupin

Comme suggéré précédemment, mp3wrap est une bonne solution. Cela peut ne pas fonctionner tout le temps cependant. Autant que je sache, mp3wrap suppose que tous les fichiers d'entrée ont 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 sox et de terminer en réencodant le tout en mp3.

8
loevborg

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 nommés 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

Donc, 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: script Bash pour tamponner les noms de fichier sur StackOverflow explique comment pour le faire.


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

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

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

5
Stefano Palazzo

La plupart des gens suggèrent mp3wrap, mais cela présente des inconvénients: le fichier généré n’indique pas sa longueur totale dans certains lecteurs et vous ne pouvez pas rechercher après ce point.

mp3cat fait le travail vite et bien, autant que je sache. Il peut être téléchargé dans 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?)

4
josinalvo

J'ai trouvé que le service en ligne audio-joiner fonctionnait très bien et conservait le bon horodatage (contrairement à mp3wrap).

3
orschiro

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

0
Lawand

J'aime commentaire de bmaupin , mais il pourrait produire une sorte naturelle de nombres (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 tels que ' " () [] {} dans le nom du fichier.

0
zhoux