come posso estrarre in batch l'audio dai file mp4 con ffmpeg senza decompressione (rilevamento automatico del codec audio)?


19

Ho 228 file mp4 (2.6GB) e vorrei estrarre l'audio da loro (mp3 o ogg). Voglio estrarli in batch, preferibilmente con bash. Non sono sicuro che tutti i file utilizzino lo stesso codec audio registrato in anni diversi, dal 2006 al 2012.

Voglio fare un ciclo tra tutti, scegliere il nome del file, rilevare il codec audio e usare ffmpeg per estrarre l'audio.

È possibile?


Questa è una domanda di scripting e come tale non ha nulla a che fare con Ubuntu. Non è fuori tema qui, ma SO o unix.SE potrebbero essere un posto migliore per chiedere.
— Mahesh,

Grazie. La prossima volta proverò a porre una domanda del genere in un posto più appropriato.
— Wryrych,

Risposte:


29

Dici che vuoi "estrarre l'audio da loro (mp3 o ogg)". Ma cosa succede se l'audio nel file mp4 non è uno di quelli? dovresti transcodificare comunque. Quindi perché non lasciare il rilevamento del formato audio fino a ffmpeg?

Per convertire un file:

ffmpeg -i videofile.mp4 -vn -acodec libvorbis audiofile.ogg

Per convertire molti file:

for vid in *.mp4; do ffmpeg -i "$vid" -vn -acodec libvorbis "${vid%.mp4}.ogg"; done

Puoi ovviamente selezionare qualsiasi parametro ffmpeg per la codifica audio che ti piace, per impostare cose come bitrate e così via.

Utilizzare -acodec libmp3lamee modificare l'estensione da .ogga .mp3per la codifica mp3.

Se quello che vuoi è davvero estrarre l'audio, puoi semplicemente "copiare" la traccia audio in un file usando -acodec copy. Ovviamente, la differenza principale è che la transcodifica è lenta e ad alta intensità di CPU, mentre la copia è molto rapida in quanto si stanno spostando byte da un file all'altro. Ecco come copiare solo la traccia audio (supponendo che sia in formato mp3):

ffmpeg -i videofile.mp4 -vn -acodec copy audiofile.mp3

Si noti che in questo caso, il formato dell'audiofilo deve essere coerente con ciò che il contenitore ha (cioè se l'audio è in formato AAC, bisogna dire audiofile.aac). Puoi usare il ffprobecomando per vedere quale codec hai, questo potrebbe fornire alcune informazioni:

ffprobe -v error -select_streams a:0 -show_entries stream=codec_name -print_format csv=p=0 "videofile.mp4"

Un modo possibile per analizzare automaticamente il codec audio e nominare il file audio di conseguenza sarebbe:

mkdir -p output
# current directory has to contain at least one .mp4 file 
for vid in *.mp4; do
   codec="$(ffprobe -v error -select_streams a:0 -show_entries stream=codec_name -print_format csv=p=0 "$vid")"
   case "$codec" in
    mp3    ) filetype=mp3 ;;
    vorbis ) filetype=ogg ;;
    *      ) filetype= ;;
   esac

   if [ "$filetype" ]; then 
    ffmpeg -i "$vid" -vn -acodec copy output/"${vid%.*}"."$filetype"
   else
    ffmpeg -i "$vid" -vn -acodec libvorbis output/"${vid%.*}".ogg
done

Note: i file di output vengono creati nella sottodirectory outputche crea all'inizio (se necessario). Per altri codec oltre a mp3 e vorbis converte l'audio in ogg. Ubuntu 14.04 non ha ffmpeg nei repository standard, ma è possibile aggiungere ppa: repository mc3man / trusty-media e installare il pacchetto ffmpeg per ottenere il software necessario. Vedi qui per i dettagli.


Ho sbagliato. Volevo avere mp3 o ogg ma come hai notato il codec audio era diverso - aac in questo esempio. Quindi devo transcodificarli comunque. Grazie mille per il tuo aiuto!
— Wryrych,

Il tuo esempio automagico si rompe con nomi di file che contengono spazi perché non hai citato $ file nella sotto-istruzione ffprobe. Modificandolo in: per file in * mp4 * avi; ffmpeg -i "$ file" -vn -acodec copia "$ file". ffprobe "$file" 2>&1 |sed -rn 's/.*Audio: (...), .*/\1/p'; fatto Risolve questo.
— Andrew Beals,

+1 ma sembra che questa risposta possa utilizzare un aggiornamento:This program is only provided for compatibility and will be removed in a future release. Please use avconv instead.
— Nicolas Raoul

ffmpego ffprobenon sono disponibili per Ubuntu 14.04 o successivo.
— jarno

1
@jarno Il vero è ffmpeg tornato su Ubuntu nel 15.04 , e sembra la pula di Libav avconved avprobeè stato rimosso nel 15.10 .
— Llogan,

1

Come affermato da Nicolas Raoul, questo deve essere aggiornato. Ecco la stessa linea che ha dato roadmr ma usando invece avconv:

for vid in *.mp4; do avconv -i "$vid" "${vid%.mp4}.mp3"; done


Questo è ora obsoleto. FFmpeg è tornato e Libav è sparito.
— Llogan,

Assolutamente corretto. Se qualcuno pensava che ffmpeg sarebbe morto, leggi questo: en.wikipedia.org/wiki/Libav#Confusion
— Scooby-2
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.