Comando Linux per concatenare i file audio e inviarli a ogg


10

Quali strumenti da riga di comando sono necessari per concatenare più file audio e riprodurli come un unico ogg (e / o mp3)?

Se riesci a fornire il comando completo per concatenare e produrre in ogg, sarebbe fantastico.

Modifica : i file di input (nel mio caso, attualmente) sono in wmaformato, ma idealmente dovrebbe essere abbastanza flessibile da supportare una vasta gamma di formati popolari.

Edit2 : Solo per chiarire, non voglio unire tutti wma i messaggi in una determinata directory, voglio solo concatenare 2 o 3 file in uno.

Grazie per le soluzioni proposte, ma tutte sembrano richiedere la creazione di file temporanei, se possibile, mi piacerebbe evitarlo.


1
per quali formati di input hai bisogno di supporto?
John T,

In linea di principio, è possibile modificare tutti questi comandi per convogliare l'output tra di loro. Ma praticamente, è un dolore farlo funzionare e un dolore debug quando fallisce. Esistono modi pratici per eseguire i file temporanei. Il mio metodo preferito è utilizzare mktemp -d /tmp/descriptive_name.XXXXXXper creare una directory temporanea con un nome informativo, quindi elaborare tutti i miei file temporanei, quindi rm -r la directory temporanea in seguito.
Ryan C. Thompson,

solo per chiarire, tutto ciò che funziona per tutti i wma in una directory, specificando *.wmain una riga di comando, funzionerà sicuramente per un elenco più piccolo come 1.wma 2.wma 3.wma 4.wma(tralasciando 5.wma, 6.wma e 7.wma), semplicemente elencandoli così (invece di usare *.wma).
Quack Quixote

Risposte:


9

Ecco il mio suggerimento: usa mplayer e oggenc collegati a una pipe denominata.

  • Utilizzare mplayerper decodificare l'audio. Può riprodurre un'ampia varietà di formati audio (e video) e può anche riprodurre più file.

  • Utilizzare oggencper codificare l'audio in Ogg Vorbis.

  • Per eliminare la necessità di un file temporaneo, utilizzare una pipe denominata per trasferire i dati tra encoder e decoder.

Mettendolo in uno 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"

Ha spiegato:

  1. Prendi il nome del file di destinazione dal primo parametro della riga di comando.
  2. Rimuovere il primo parametro della riga di comando, lasciando solo i nomi dei file di origine.
  3. Creare un nome per una pipe da cui leggere oggenc.
  4. Crea un nome per una pipe in cui mplayer può scrivere
  5. Crea i tubi.
  6. Usa cat per scaricare continuamente il writepipe nel readpipe (questo aiuta a evitare problemi in cui mplayer può terminare, ma impedisce a oggenc di pensare che sia fatto quando ciò accade)
  7. Decodifica l'audio dai file sorgente usando mplayer. -really-quiet -slave -nolircSono disponibili opzioni per disabilitare i messaggi e per impedire che leggano la tastiera o il telecomando. -vc null -vo nullSono disponibili opzioni per disabilitare la codifica e l'output video. L' -aoopzione lo dirige per trasmettere l'audio in formato WAV alla pipe di scrittura denominata.
  8. Mentre il comando precedente è in esecuzione, codifica simultaneamente dalla pipa di lettura denominata in Ogg utilizzando oggenc.
  9. Rimuovere le pipe nominate.

Roba da sinistra per migliorare: terminare lo script in anticipo se uno dei comandi fallisce (usare set -e), ma comunque ripulire correttamente il FIFO (intercettare i segnali necessari).


L'unico "lieve" problema è che c'è un suono di clic tra i file
hasen

@hasen j: se vuoi essere perfetto, usa Audacity o un altro editor wav. se riesci a rintracciare l'origine del clic, puoi presentare un bug report sull'autore del reato.
Quack Quixote

15

SoX è in grado di gestire un gran numero di formati audio, a seconda delle librerie compilate, e può concatenare i file con una semplice riga di comando

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

Credo che questo funzioni solo se i file audio di origine hanno tutti lo stesso numero di canali, ma non l'ho provato.

Per quanto ne so, SoX non ha supporto per i file .wma, quindi la conversione di almeno quei file con qualcosa come ffmpeg è probabilmente inevitabile.

ffmpeg -i infile.wma outfile.wav

2
AFAIK sox funziona così solo se tutti i file hanno gli stessi canali, frequenza di campionamento e profondità di bit; altrimenti devi specificare per tutti. non mi rendevo conto che avrebbe decodificato anche i formati codificati, ma immagino di non aver tenuto il passo con esso.
Quack Quixote

3

Vorrei usare ffmpeg . Per convertire wma in ogg vorbis prova:

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

o mp3:

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

avrai bisogno di lame installato per la conversione mp3. sudo apt-get install lame libmp3lame0

Cat, quindi il convertito non sembra funzionare bene, anche se puoi trovare molti riferimenti sul web che dicono che puoi fare qualcosa del genere cat *.wma | ffmpeg -i - -acodec ...- questo non funziona sulla mia macchina - viene elaborato solo il primo file. Esiste un codec 'copy' per ffmpeg, ma non fa molta differenza.

Effettuare prima la conversione con ffmpeg, quindi cat * .ogg> output.ogg ha funzionato per me.


1
ok, che dire della concatenazione?
hasen

scusa per quello! Leggi le mie aggiunte.
DaveParillo,

non sono così sicuro di ffmpeg ... bene come un decoder WMA, ma molte lamentele sull'encoder OGG. utilizzare almeno -acodec libvorbisper evitare l'encoder incorporato di ffmpeg.
Quack Quixote

3

Per concatenare e transcodificare i file audio, questo è il flusso di lavoro che si desidera seguire:

  1. Decodifica dei file audio di input in dati WAV / PCM,
  2. Concatenate WAV,
  3. Codifica WAV per emettere file di codec audio.

L'elaborazione in questi passaggi esegue la concatenazione sui dati WAV, che è la più semplice da gestire e la meno perdita. E poiché vuoi transcodificare comunque, dovrai decodificare in WAV da qualche parte nel processo; potrebbe anche trarne vantaggio.

Ecco i passaggi che raccomando. Useremo ffmpegper la decodifica, soxper la concatenazione e oggencper la codifica. Potresti sostituire altri strumenti per qualsiasi passaggio - mencodere altri funzionano bene come decodificatore e qualsiasi strumento che codifica Ogg può essere usato come codificatore - anche se penso che ti sarà difficile trovare uno strumento migliore rispetto soxa quello concatenazione.

  1. find *.wma -exec ffmpeg -i {} outfile.{}.wav \;
    (questo viene eseguito ffmpeg -i infile.wma outfile.infile.wmasu ciascun file WMA nella directory corrente)

  2. sox outfile* all.wav
    (nota outfileè lo stesso prefisso che abbiamo fornito ai file di output nel passaggio 1)

  3. oggenc all.wav all.ogg probabilmente vorrai alcune impostazioni di qualità qui, ma questo fornirà impostazioni di qualità decenti. Non ho ottenuto risultati che mi sono piaciuti ffmpeg, ma potresti preferirlo, quindi ho incluso un esempio con ffmpeg di seguito.

Si noti che il soxcomando non funzionerà correttamente a meno che tutti i file WAV non abbiano lo stesso formato: se alcuni sono 22kHz e alcuni sono 44.1kHz, ad esempio, è necessario identificarli soxtramite le opzioni della riga di comando e specificare il formato desiderato output in. Non conosco strumenti a riga di comando capaci come soxper la fase di concatenazione. Si potrebbe forse output in un formato PCM grezzo nella fase 1 e l'uso catper la fase 2, ma che sarebbe solo lavoro se sono nello stesso formato, e avresti bisogno di essere estremamente specifico per sia il decoder ed encoder di ciò che formato che dovrebbero aspettarsi.

Codifica con ffmpeg: molti post in rete si lamentano del fatto che il codificatore Vorbis incorporato di ffmpeg non è molto buono. Se la tua versione è costruita con il supporto di libvorbis, usa -acodec libvorbisinvece. Riga di comando di esempio:

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

1

Non funziona con i file .ogg, ma mp3wrap può concatenare più file .mp3 in un singolo file. Quindi dalla riga di comando, potresti fare qualcosa del genere

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

Questo utilizzerà ffmpeg per convertire tutti i tuoi file .wma in .mp3, quindi unire tutti i file .mp3 in un singolo file.


1

Mencoder può concatenare e transcodificare video senza file temporanei ( esempio banale qui ). C'è uno script che galleggia da qualche parte chiamato aconvert che induce mencoder a fare solo audio (cosa che normalmente rifiuta di fare). Queste due cose combinate sembrano soddisfare le vostre esigenze.

Modifica: ho trovato aconvert.sh. Sfortunatamente, è progettato solo per convertire un file audio. Ma ecco comunque il codice, nel caso qualcuno voglia usarlo per creare una riga di comando che converta più file 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


0

Ho pensato di dare la mia risposta. Probabilmente questo non è il modo più elegante, ma ha fatto quello che volevo.

Fase 1: convertito al ogg (usi mplayer, pacple ruby, tutti disponibili dai pronti contro termine libero di 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

Passaggio 2: concatenare i file ogg

cat *ogg > big-file.ogg

0

cat file list… | ffmpeg -f mp3 -i – -acodec copy outfile.mp3ha funzionato bene con me con gli MP3: immagino che funzionerebbe anche con altri formati. I crediti vanno a Lindylex .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.