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.