Estrazione batch di audio con avconv senza transcodifica


14

Ho circa 70 file mp4 e desidero estrarre i file audio direttamente senza transcodificare ulteriormente. Tutti i file mp4 hanno file audio aac.

Comprendo di poter utilizzare il seguente comando per estrarre il file audio da uno dei file mp4:

avconv -i "INPUT FILE" -map 0:1 -c:a copy "OUTPUT FILE"

Come estraggo tutti i file audio da tutti i file 70 mp4, quindi finisco con 70 file aac?

Risposte:


21

Puoi usare un semplice ciclo per:

for i in *.mp4; do
    avconv -i "${i}" -map 0:1 -c:a copy "${i%.mp4}.aac"
done

o su una riga:

for i in *.mp4; do avconv -i "${i}" -map 0:1 -c:a copy "${i%.mp4}.aac"; done

Ciò che viene eseguito viene eseguito avconvuna volta per ogni file denominato come *.mp4dove il nome file è memorizzato nella ${i}variabile.

${i%.mp4}significa ${i}(cioè il nome del file) con .mp4rimosso dall'estremità.


2
IIRC, i file grezzi aac non possono contenere metadati; se si desidera mantenere i metadati dai file originali, utilizzare m4a (che è solo un altro nome per mp4, ma è ampiamente riconosciuto dai lettori audio) anziché aac come estensione di file.
evilsoup,

A cosa serve l'opzione -map? Perché scegli il flusso 0: 1 piuttosto che altri flussi, come 0: 0, 0: 2?
Qed

Ho lasciato cadere l'opzione -mappa e funziona bene
qed

per utilizzare questo comando nelle azioni personalizzate Thunar e simili, funziona se aggiunto a uno script e nelle azioni Thunar: bash /path/to/the/script %F- come qui

2
@qed: l'eliminazione -mappotrebbe comunque considerare il video quando si passa a un altro formato di output (se tale formato può contenere sia audio che video). È più sicuro mantenerlo così com'è.
dott. Sybren,

5

La risposta di Xiao è generalmente la più utile se hai tutti i file in una directory; ma se ci sono file MP4 sparsi in directory diverse, puoi usare questo findcomando per convertirli tutti.

find . -type f -name '*.mp4' -exec bash -c 'avconv -i "$0" -c:a copy "${0/%mp4/m4a}"' {} \;

Questo utilizza una forma leggermente diversa di sostituzione della stringa bash alla fine: "$ {0 /% mp4 / m4a}" dice a bash di sostituire mp4 con m4a, ma solo se mp4 è alla fine della stringa.


Non ho mai saputo che Bash avesse quel tipo di sostituzione. Fantastico :)
Andrew Gunnerson il

1
@xiao Se tralasci il %, farà la sostituzione per la prima istanza della stringa che trova; puoi anche usarlo #per sostituirlo con la stringa solo se è all'inizio di una variabile; quindi $ {0 / mp4 / m4a} sostituirà la prima istanza di mp4 con m4a (il che potrebbe essere un problema se hai nomi di file davvero strani); e $ {0 / # mp4 / m4a} sostituiranno mp4 a m4a, ma solo se il valore di stringa della variabile inizia con mp4 (non serve qui, ovviamente, ma potrebbe tornare utile altrove).
evilsoup,

3

Per evitare che più file vengano elaborati contemporaneamente (che potrebbero utilizzare troppe risorse), utilizzare parallel. Per impostazione predefinita, esegue solo un lavoro alla volta. Se si desidera utilizzare più core CPU in parallelo, provare parallel -j 4 ...per 4 processi in parallelo. Guarda anche man parallel.

sudo apt-get install parallel

Questa linea estrae aaci file audio dai video selezionati e li inserisce in m4acontenitori.

parallel avconv -i '{}' -map 0:1 -c:a copy '{.}.m4a' ::: %F

Quando si lavora direttamente nella CLI, sostituire %Fcon l'elenco dei file di input. Es *.mp4.

Ispirato da questa risposta, da una precedente risposta a questa domanda e dal commento di evilsoup a quest'ultimo (dicendo: 'I file grezzi aac non possono contenere metadati; se si desidera mantenere i metadati dai file originali, utilizzare m4a (che è solo un altro nome per mp4, ma è abbastanza ampiamente riconosciuto dai lettori audio) anziché aac come estensione di file ' ).

Uso tali comandi nelle azioni personalizzate Thunar,

inserisci qui la descrizione dell'immagine

limitare l'applicazione ai video che contengono aacaudio.

inserisci qui la descrizione dell'immagine

Per avere una finestra terminale aperta durante l'elaborazione, che si chiude alla fine, il comando può essere modificato come:

 gnome-terminal -e "parallel avconv -i '{}' -map 0:1 -c:a copy '{.}.m4a' ::: %F"

2

Ho esteso la risposta di Xiao-Long Chen, trasformandola in uno script che salta i file quando il file di output è più recente:

#!/bin/bash

for file in *.mp4; do
    OUT="${file/.mp4/.m4a}"

    if [ "$file" == "$OUT" ]; then
        echo "Unable to handle $file" >&2
        exit 1
    fi

    if [ "$OUT" -nt "$file" ]; then
        echo "Skipping $file; output file is newer."
        continue
    fi

    echo "Converting \"$file\" -> \"$OUT\""
    avconv -loglevel warning -i "$file" -map 0:1 -c:a copy "$OUT"
done
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.