Linux-Befehl zum Verketten von Audiodateien und zur Ausgabe an ogg

10

Welche Befehlszeilen-Tools benötige ich, um mehrere Audiodateien zu verknüpfen und als ein Ogg (und / oder MP3) auszugeben?

Wenn Sie den vollständigen Befehl zum Verketten und Ausgeben an ogg bereitstellen können, wäre das fantastisch.

Bearbeiten : Eingabedateien (in meinem Fall derzeit) sind wmaformatiert, sollten jedoch im Idealfall flexibel genug sein, um eine Vielzahl gängiger Formate zu unterstützen.

Edit2 : Nur zur Verdeutlichung, ich möchte nicht alle wma s in einem bestimmten Verzeichnis zusammenführen, ich möchte nur 2 oder 3 Dateien zu einer verketten.

Vielen Dank für die vorgeschlagenen Lösungen, aber alle scheinen temporäre Dateien zu erstellen, wenn möglich, das möchte ich vermeiden.

hasen
quelle
1
Für welche Eingabeformate benötigen Sie Unterstützung?
John T
Im Prinzip können Sie alle diese Befehle optimieren, um die Ausgabe untereinander weiterzuleiten. Aber praktisch ist es ein Problem, es zum Laufen zu bringen, und ein Problem, das behoben werden muss, wenn es fehlschlägt. Es gibt praktische Möglichkeiten, temporäre Dateien zu erstellen. Meine bevorzugte Methode ist es mktemp -d /tmp/descriptive_name.XXXXXX, ein temporäres Verzeichnis mit einem informativen Namen zu erstellen, dann alle meine temporären Dateien dort zu verarbeiten und anschließend das temporäre Verzeichnis zu rm -r.
Ryan Thompson
Nur um zu verdeutlichen, alles, was für alle WMAs in einem Verzeichnis funktioniert , indem es *.wmain einer 1.wma 2.wma 3.wma 4.wmaBefehlszeile angegeben wird, funktioniert mit Sicherheit für eine kleinere Liste wie (ohne 5.WMA, 6.WMA und 7.WMA), indem man sie einfach auflistet so (anstatt zu benutzen *.wma).
Quack Quijote

Antworten:

9

Hier ist mein Vorschlag: Verwende mplayer und oggenc, die mit einer Named Pipe verbunden sind.

  • Verwenden Sie mplayerdiese Taste, um das Audio zu dekodieren. Es kann eine Vielzahl von Audio- (und Video-) Formaten wiedergeben und mehrere Dateien abspielen.

  • Verwenden Sie oggencdiese Option, um das Audio in Ogg Vorbis zu kodieren.

  • Verwenden Sie eine Named Pipe , um die Daten zwischen Encoder und Decoder zu übertragen.

Das in ein Skript schreiben:

#!/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"

Erklärt:

  1. Übernehmen Sie den Namen der Zieldatei aus dem ersten Befehlszeilenparameter.
  2. Entfernen Sie den ersten Befehlszeilenparameter und lassen Sie nur die Quelldateinamen übrig.
  3. Erstellen Sie einen Namen für eine Pipe, aus der oggenc lesen soll.
  4. Erstellen Sie einen Namen für eine Pipe, in die mplayer schreiben soll
  5. Erstellen Sie die Rohre.
  6. Verwenden Sie cat, um die WritePipe kontinuierlich in die ReadPipe zu übertragen (dies hilft dabei, Probleme zu vermeiden, bei denen mplayer möglicherweise beendet wird, verhindert jedoch, dass oggenc denkt, dass dies getan ist, wenn dies geschieht).
  7. Dekodiere das Audio aus den Quelldateien mit mplayer. Es gibt Optionen -really-quiet -slave -nolirczum Deaktivieren von Nachrichten und zum Verhindern des Lesens der Tastatur oder der Fernbedienung. Optionen -vc null -vo nullzum Deaktivieren der Videokodierung und -ausgabe. Die -aoOption weist es an, das Audio im WAV-Format an die genannte Write-Pipe auszugeben.
  8. Während der vorherige Befehl ausgeführt wird, codieren Sie mithilfe von oggenc gleichzeitig von der benannten Lesepipe in Ogg.
  9. Entfernen Sie die benannten Rohre.

Zum Verbessern etwas nach links: Beende das Skript vorzeitig, wenn einer der Befehle fehlschlägt (benutze set -e), aber das FIFO trotzdem ordnungsgemäß aufräumt (fange die notwendigen Signale ein).

Jukka Matilainen
quelle
Das einzige „leichte“ Problem ist , es gibt immer einen Ton zwischen Dateien
hasen
@hasen j: Wenn du perfekt sein willst, benutze Audacity oder einen anderen WAV-Editor. Wenn Sie die Quelle des Klicks ausfindig machen können, können Sie einen Fehlerbericht über den Täter einreichen.
Quack Quijote
15

SoX kann eine große Anzahl von Audioformaten verarbeiten, je nachdem, für welche Bibliotheken es kompiliert wurde, und Dateien mit einer einfachen Befehlszeile verketten

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

Ich glaube, das funktioniert nur, wenn die Quell-Audiodateien alle die gleiche Anzahl von Kanälen haben, aber ich habe dies nicht getestet.

Soweit mir bekannt ist, unterstützt SoX keine .wma-Dateien. Daher ist es wahrscheinlich unvermeidlich, zumindest diese Dateien mit so etwas wie ffmpeg zuerst zu konvertieren .

ffmpeg -i infile.wma outfile.wav
goldPseudo
quelle
2
AFAIK sox funktioniert nur dann so, wenn alle Dateien die gleichen Kanäle, Abtastraten und Bittiefen haben. andernfalls müssen Sie für alle angeben. Ich wusste nicht, dass es auch codierte Formate decodieren würde, aber ich glaube, ich habe nicht damit Schritt gehalten.
Quacksalber 2.
3

Ich würde ffmpeg verwenden . Um wma in ogg vorbis zu konvertieren, versuchen Sie:

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

oder mp3:

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

Für den MP3-Konverter muss LAME installiert sein. sudo apt-get install lame libmp3lame0

Cat, dann scheint die Konvertierung nicht gut zu funktionieren, obwohl Sie im Web viele Referenzen finden, die besagen, dass Sie so etwas tun können cat *.wma | ffmpeg -i - -acodec ...- dies funktioniert auf meinem Computer nicht - nur die erste Datei wird verarbeitet. Es gibt einen 'Kopier'-Codec für ffmpeg, aber das macht keinen großen Unterschied.

Zuerst mit ffmpeg konvertieren, dann mit cat * .ogg> output.ogg.

DaveParillo
quelle
1
ok, was ist mit Verkettung?
hasen
Das tut mir leid! Lesen Sie meine Ergänzungen.
DaveParillo
nicht so sicher über ffmpeg ... gut wie ein WMA-Decoder, aber viele Beschwerden über den OGG-Encoder. Zumindest verwenden -acodec libvorbis, um den eingebauten Encoder von ffmpeg zu umgehen.
Quack Quijote
3

Gehen Sie wie folgt vor, um Audiodateien zu verketten und zu transkodieren:

  1. Decodieren Sie die eingegebenen Audiodateien in WAV / PCM-Daten.
  2. WAV verketten,
  3. Codieren Sie WAV, um die Audio-Codec-Datei auszugeben.

Die Verarbeitung in diesen Schritten führt die Verkettung der WAV-Daten durch, die am einfachsten zu handhaben und am wenigsten verlustreich ist. Und da Sie sowieso transkodieren möchten, müssen Sie irgendwo im Prozess in WAV dekodieren. könnte es genauso gut ausnutzen.

Hier sind die Schritte, die ich empfehle. Wir werden ffmpegfür die Dekodierung, soxfür die Verkettung und oggencfür die Kodierung verwenden. Sie könnten auch andere Werkzeuge für jeden Schritt ersetzen - mencoderund andere funktionieren als Decoder, und jedes Werkzeug , das Ogg kodiert , kann als Encoder verwendet werden - obwohl ich glaube , Sie hart gedrückt werden , werden ein besseres Werkzeug zu finden , als soxfür die Verkettung.

  1. find *.wma -exec ffmpeg -i {} outfile.{}.wav \;
    (Dies wird ffmpeg -i infile.wma outfile.infile.wmafür jede WMA-Datei im aktuellen Verzeichnis ausgeführt.)

  2. sox outfile* all.wav
    (Beachten Sie, dass dies outfiledasselbe Präfix ist, das wir in Schritt 1 für die Ausgabedateien angegeben haben.)

  3. oggenc all.wav all.ogg Wahrscheinlich möchten Sie hier einige Qualitätseinstellungen vornehmen, dies führt jedoch zu anständigen Qualitätsstandards. Ich habe keine Ergebnisse erhalten, die mir gefallen haben ffmpeg, aber Sie können es vorziehen, deshalb habe ich unten ein Beispiel mit ffmpeg eingefügt.

Beachten Sie, dass der soxBefehl nur dann ordnungsgemäß funktioniert, wenn alle WAV-Dateien dasselbe Format haben. Wenn einige 22 kHz und andere 44,1 kHz haben, müssen Sie sie beispielsweise soxüber Befehlszeilenschalter identifizieren und das gewünschte Format angeben Ausgabe in. Ich kenne keine Kommandozeilen-Tools, die so gut wie soxder Verkettungsschritt sind. Möglicherweise könnten Sie in Schritt 1 eine Ausgabe in ein unformatiertes PCM-Format erstellen und catfür Schritt 2 verwenden. Dies funktioniert jedoch nur, wenn die Formate identisch sind und Sie sowohl für Ihren Decoder als auch für den Encoder äußerst spezifische Anforderungen stellen Format, das sie erwarten sollten.

Encoding mit ffmpeg: Viele Posts im Internet beklagen, dass der in ffmpeg integrierte Vorbis-Encoder nicht sehr gut ist. Wenn Ihre Version mit libvorbis-Unterstützung erstellt wurde, verwenden Sie -acodec libvorbisstattdessen. Beispielbefehlszeile:

ffmpeg -i all.wav -acodec libvorbis -ac 2 -ab 128k all.ogg
Quacksalber
quelle
1

Funktioniert nicht für .ogg-Dateien, aber mp3wrap kann mehrere .mp3-Dateien zu einer einzigen Datei zusammenfügen. Von der Kommandozeile aus können Sie so etwas tun

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

Dies wird ffmpeg verwenden , um alle Ihre WMA-Dateien in MP3 zu konvertieren und dann alle MP3-Dateien in einer einzigen Datei zusammenzuführen.

goldPseudo
quelle
1

Mencoder kann Videos ohne temporäre Dateien verketten und transkodieren (einfaches Beispiel hier ). Irgendwo schwebt ein Skript namens aconvert herum, das den Mencoder dazu verleitet, nur Audio zu verwenden (was normalerweise abgelehnt wird). Diese beiden Dinge zusammen scheinen Ihre Anforderungen zu erfüllen.

Edit: Ich habe aconvert.sh gefunden. Leider kann nur eine Audiodatei konvertiert werden. Aber hier ist der Code, falls jemand damit eine Befehlszeile erstellen möchte, die mehrere Audiodateien konvertiert.

#!/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 Thompson
quelle
0

Ich dachte, ich würde meine Antwort einwerfen. Dies ist wahrscheinlich nicht die eleganteste Art, aber es hat getan, was ich wollte.

Schritt 1: konvertiert in ogg (verwendet mplayer, pacplund ruby., Die alle von dem freien Debian repos 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

Schritt 2: Ogg-Dateien verketten

cat *ogg > big-file.ogg
Inaimathi
quelle