Commande Linux pour concaténer des fichiers audio et les exporter vers ogg

10

De quels outils de ligne de commande ai-je besoin pour concaténer plusieurs fichiers audio et les sortir en un seul ogg (et / ou mp3)?

Si vous pouvez fournir la commande complète pour concaténer et sortir vers ogg, ce serait génial.

Modifier : les fichiers d'entrée (dans mon cas, actuellement) sont au wmaformat, mais idéalement, ils devraient être suffisamment flexibles pour prendre en charge un large éventail de formats populaires.

Edit2 : Juste pour clarifier, je ne veux pas fusionner tous les wma s dans un certain répertoire, je veux juste concaténer 2 ou 3 fichiers en un seul.

Merci pour les solutions proposées, mais elles semblent toutes nécessiter la création de fichiers temporaires, si possible, j'aimerais éviter cela.

hasen
la source
1
pour quels formats d'entrée avez-vous besoin de prise en charge?
John T
En principe, vous pouvez modifier toutes ces commandes pour diriger les sorties entre elles. Mais pratiquement, c'est difficile de le faire fonctionner, et difficile de déboguer en cas d'échec. Il existe des moyens pratiques de créer des fichiers temporaires. Ma méthode préférée consiste mktemp -d /tmp/descriptive_name.XXXXXXà créer un répertoire temporaire avec un nom informatif, puis à y traiter tous mes fichiers temporaires, puis rm -r le répertoire temporaire par la suite.
Ryan C. Thompson,
juste pour clarifier, tout ce qui fonctionne pour tous les wma dans un répertoire, en spécifiant *.wmadans une ligne de commande, fonctionnera certainement pour une liste plus petite comme 1.wma 2.wma 3.wma 4.wma(en laissant de côté 5.wma, 6.wma et 7.wma), simplement en les listant comme ça (au lieu d'utiliser *.wma).
Quack Quichotte

Réponses:

9

Voici ma suggestion: utilisez mplayer et oggenc connectés avec un canal nommé.

  • Utilisez mplayerpour décoder l'audio. Il peut lire une grande variété de formats audio (et vidéo), et il peut également lire plusieurs fichiers.

  • Utilisez oggencpour encoder l'audio en Ogg Vorbis.

  • Pour éliminer le besoin d'un fichier temporaire, utilisez un canal nommé pour transférer les données entre l'encodeur et le décodeur.

Mettre cela dans un script:

#!/bin/sh
# Usage: ./combine2ogg destination.ogg source1.wma source2.wma ...
# Requires: mplayer, oggenc
destination="$1"
shift
readpipe="$destination.tmpr"
writepipe="$destination.tmpw"
mkfifo "$readpipe"
mkfifo "$writepipe"
cat "$writepipe" > "$readpipe" &
mplayer -really-quiet -slave -nolirc -vc null -vo null -ao "pcm:fast:file=$writepipe" "$@" &
oggenc --quiet -o "$destination" "$readpipe"
rm -f "$readpipe"
rm -f "$writepipe"

Expliqué:

  1. Prenez le nom du fichier de destination du premier paramètre de ligne de commande.
  2. Supprimez le premier paramètre de ligne de commande, ne laissant que les noms des fichiers source.
  3. Créez un nom pour un tuyau à partir duquel oggenc pourra lire.
  4. Créer un nom pour un tube sur lequel mplayer pourra écrire
  5. Créez les tuyaux.
  6. Utilisez cat pour vider en continu le tube d'écriture dans le tube de lecture (cela aide à éviter les problèmes où mplayer peut se terminer, mais empêche oggenc de penser que c'est fait lorsque cela se produit)
  7. Décodez l'audio des fichiers source à l'aide de mplayer. Les options -really-quiet -slave -nolircsont là pour désactiver les messages et pour ne pas lire le clavier ou la télécommande. Les options -vc null -vo nullsont là pour désactiver l'encodage et la sortie vidéo. L' -aooption lui demande de sortir l'audio au format WAV vers le canal d'écriture nommé.
  8. Pendant l'exécution de la commande précédente, encodez simultanément à partir du canal de lecture nommé dans Ogg à l'aide d'oggenc.
  9. Supprimez les tuyaux nommés.

Truc à gauche pour améliorer: Terminer le script plus tôt si l'une des commandes échoue (utiliser set -e), mais toujours nettoyer correctement le fifo (piéger les signaux nécessaires).

Jukka Matilainen
la source
Le seul "léger" problème est qu'il y a un clic entre les fichiers
hasen
@hasen j: si vous voulez parfait, utilisez Audacity ou un autre éditeur wav. si vous pouvez retrouver la source du clic, vous pouvez déposer un rapport de bug sur le contrevenant.
Quack Quichotte
15

SoX peut gérer un grand nombre de formats audio, selon les bibliothèques avec lesquelles il est compilé, et peut concaténer des fichiers avec une simple ligne de commande

sox file1.wav file2.mp3 file3.flac outfile.ogg

Je crois que cela ne fonctionne que si les fichiers audio source ont tous le même nombre de canaux, mais je ne l'ai pas testé.

Pour autant que je sache, SoX n'a ​​aucun support pour les fichiers .wma, donc convertir au moins ces fichiers avec quelque chose comme ffmpeg en premier est probablement inévitable.

ffmpeg -i infile.wma outfile.wav
goldPseudo
la source
2
AFAIK sox ne fonctionne comme ça que si tous les fichiers ont les mêmes canaux, taux d'échantillonnage et profondeur de bits; sinon vous devez spécifier pour tout. Je ne savais pas que cela décoderait aussi les formats encodés, mais je suppose que je ne l'ai pas suivi.
Quack Quichotte
3

J'utiliserais ffmpeg . Pour convertir wma en ogg vorbis, essayez:

ffmpeg -i sample.wma -acodec vorbis -aq 100 sample.ogg

ou mp3:

ffmpeg -i input.wma -acodec libmp3lame output.mp3

vous aurez besoin de lame installé pour la conversion mp3. sudo apt-get install lame libmp3lame0

Cat, puis convertir ne semblent pas bien fonctionner, bien que vous puissiez trouver de nombreuses références sur le Web disant que vous pouvez faire quelque chose comme cat *.wma | ffmpeg -i - -acodec ...- cela ne fonctionne pas sur ma machine - seul le premier fichier est traité. Il existe un codec «copie» pour ffmpeg, mais cela ne fait pas beaucoup de différence.

Faire la conversion avec ffmpeg d'abord, puis cat * .ogg> output.ogg a fonctionné pour moi.

DaveParillo
la source
1
ok, qu'en est-il de la concaténation?
hasen
Désolé pour ça! Lisez mes ajouts.
DaveParillo
pas si sûr de ffmpeg ... bien comme un décodeur WMA, mais beaucoup de plaintes concernant l'encodeur OGG. au moins utiliser -acodec libvorbispour éviter l'encodeur intégré de ffmpeg.
Quack Quichotte
3

Pour concaténer et transcoder des fichiers audio, voici le workflow que vous souhaitez suivre:

  1. Décoder les fichiers audio d'entrée en données WAV / PCM,
  2. Concaténer WAV,
  3. Encodez WAV pour sortir un fichier de codec audio.

Le traitement de ces étapes effectue la concaténation des données WAV, qui est la plus facile à gérer et la moins destructrice. Et puisque vous voulez quand même transcoder, vous devrez décoder en WAV quelque part dans le processus; pourrait aussi bien en profiter.

Voici les étapes que je recommande. Nous utiliserons ffmpegpour le décodage, soxpour la concaténation et oggencpour l'encodage. Vous pouvez substituer d'autres outils à n'importe quelle étape - mencoderet d'autres fonctionnent bien comme décodeur, et tout outil qui code Ogg peut être utilisé comme encodeur - bien que je pense que vous aurez du mal à trouver un meilleur outil que soxpour le enchaînement.

  1. find *.wma -exec ffmpeg -i {} outfile.{}.wav \;
    (cela s'exécute ffmpeg -i infile.wma outfile.infile.wmasur chaque fichier WMA dans le répertoire courant)

  2. sox outfile* all.wav
    (la note outfileest le même préfixe que nous avons donné aux fichiers de sortie à l'étape 1)

  3. oggenc all.wav all.ogg vous voulez probablement des paramètres de qualité ici, mais cela donnera des valeurs par défaut de qualité décentes. Je n'ai pas obtenu les résultats que j'aimais ffmpeg, mais vous pouvez le préférer, j'ai donc inclus un exemple avec ffmpeg ci-dessous.

Notez que la soxcommande ne fonctionnera pas correctement sauf si tous les fichiers WAV sont au même format - si certains sont à 22 kHz et certains à 44,1 kHz, par exemple, vous devez les identifier soxvia des commutateurs de ligne de commande et spécifier le format dans lequel vous souhaitez Je ne connais aucun outil de ligne de commande aussi performant que soxpour l'étape de concaténation. Vous pouvez éventuellement produire un format PCM brut à l'étape 1 et l'utiliser catpour l'étape 2, mais cela ne fonctionnera que s'ils sont au même format, et vous devrez être extrêmement spécifique à la fois à votre décodeur et à votre encodeur quant à ce que format qu'ils devraient attendre.

Encodage avec ffmpeg: Beaucoup de publications autour du net se plaignent que l'encodeur Vorbis intégré de ffmpeg n'est pas très bon. Si votre version est construite avec le support de libvorbis, utilisez -acodec libvorbisplutôt. Exemple de ligne de commande:

ffmpeg -i all.wav -acodec libvorbis -ac 2 -ab 128k all.ogg
Quack Quichotte
la source
1

Ne fonctionnera pas pour les fichiers .ogg, mais mp3wrap peut concaténer plusieurs fichiers .mp3 en un seul fichier. Donc, à partir de la ligne de commande, vous pouvez faire quelque chose comme ça

for FILE in *.wma; do ffmpeg -i "$FILE" "`basename "$FILE" .wma`.mp3"; done
mp3wrap bigmp3_MP3WRAP.mp3 *.mp3

Cela utilisera ffmpeg pour convertir tous vos fichiers .wma en .mp3, puis fusionnera tous les fichiers .mp3 en un seul fichier.

goldPseudo
la source
1

Mencoder peut concaténer et transcoder des vidéos sans fichiers temporaires ( exemple trivial ici ). Il y a un script flottant quelque part appelé aconvert qui incite mencoder à faire de l'audio uniquement (ce qu'il refuse normalement de faire). Ces deux éléments combinés semblent répondre à vos besoins.

Edit: j'ai trouvé aconvert.sh. Malheureusement, il n'est conçu que pour convertir un fichier audio. Mais voici le code de toute façon, au cas où quelqu'un voudrait l'utiliser pour créer une ligne de commande qui convertit plusieurs fichiers audio.

#!/bin/sh

# Author: Jonas Jermann
# Description: A hack to allow mencoder to encode from an audio only file

if [ "$1" = "" ]; then
    echo "Usage: $0 <\"input file\"> <\"output file\"> <\"options\">"
    exit 0
fi

options=${3:-"-oac mp3lame"}

mencoder -demuxer rawvideo -rawvideo w=1:h=1 -ovc copy -of rawaudio -endpos `mplayer -identify $1 -frames 0 2>&1 | grep ID_LENGTH | cut -d "=" -f 2` -audiofile $1 -o $2 $options $1
Ryan C. Thompson
la source
0

Je pensais que je jetterais ma réponse. Ce n'est probablement pas la manière la plus élégante, mais elle a fait ce que je voulais.

Étape 1: Convertir en ogg (utilisations mplayer, pacplet ruby, tous disponibles à partir des prises en pension libre Debian I).

#! /usr/bin/ruby

ARGV.each do |target|
  file_ext = target.scan(/\.\w*$/)[0]
  name = target.sub(file_ext, "")

  `mplayer -novideo -ao pcm:file="tmp.wav" "#{target}"`
  `pacpl -t ogg --outfile "#{name}" tmp.wav`
  `rm tmp.wav`
end

Étape 2: concaténation des fichiers OGG

cat *ogg > big-file.ogg
Inaimathi
la source
0

cat file list… | ffmpeg -f mp3 -i – -acodec copy outfile.mp3a bien fonctionné pour moi avec les MP3: j'imagine que cela fonctionnerait aussi avec d'autres formats. Les crédits vont à Lindylex .

Tomislav Nakic-Alfirevic
la source