Wie kann ich mit ffmpeg ohne Dekomprimierung Audio aus mp4-Dateien stapelweise extrahieren (automatische Audio-Codec-Erkennung)?

19

Ich habe 228 mp4-Dateien (2,6 GB) und möchte Audio daraus extrahieren (mp3 oder ogg). Ich möchte sie im Batch extrahieren - vorzugsweise mit Bash. Ich bin nicht sicher, ob alle Dateien den gleichen Audio-Codec verwenden, wie sie in verschiedenen Jahren von 2006 bis 2012 aufgenommen wurden.

Ich möchte alle durchlaufen, den Dateinamen auswählen, den Audio-Codec erkennen und das Audio mit ffmpeg extrahieren.

Ist es möglich?

wryrych
quelle
Dies ist eine Skript-Frage und hat als solche nichts mit Ubuntu zu tun. Es ist hier kein Thema, aber SO oder Unix.SE könnte ein besserer Ort sein, um zu fragen.
Mahesh
Vielen Dank. Das nächste Mal werde ich versuchen, eine solche Frage an geeigneterer Stelle zu stellen.
wryrych

Antworten:

28

Sie möchten "Audio aus ihnen extrahieren (mp3 oder ogg)". Aber was ist, wenn der Ton in der mp4-Datei keiner von diesen ist? Sie müssten sowieso umcodieren. Warum also nicht die Audioformaterkennung auf ffmpeg belassen?

So konvertieren Sie eine Datei:

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

So konvertieren Sie viele Dateien:

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

Sie können natürlich beliebige ffmpeg-Parameter für die Audiokodierung auswählen, um beispielsweise die Bitrate einzustellen.

Verwenden -acodec libmp3lameund ändern Sie die Erweiterung von .oggin .mp3für die MP3-Codierung.

Wenn Sie das Audio wirklich extrahieren möchten , können Sie die Audiospur einfach mithilfe von in eine Datei "kopieren" -acodec copy. Der Hauptunterschied besteht natürlich darin, dass das Transcodieren langsam und CPU-intensiv ist, während das Kopieren sehr schnell von einer Datei in eine andere geht. So kopieren Sie nur die Audiospur (sofern diese im MP3-Format vorliegt):

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

Beachten Sie, dass in diesem Fall das Audiofile - Format hat mit konsequent sein , was der Behälter (dh , wenn die Audio-AAC - Format ist, muss man sagen audiofile.aac). Sie können den ffprobeBefehl verwenden, um festzustellen, über welchen Codec Sie verfügen. Dies kann einige Informationen liefern:

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

Eine Möglichkeit, den Audio-Codec automatisch zu analysieren und die Audiodatei entsprechend zu benennen, wäre:

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

Hinweise: Die Ausgabedateien werden in einem Unterverzeichnis outputerstellt, das am Anfang erstellt wurde (falls erforderlich). Für andere Codecs als mp3 und vorbis konvertiert es Audio nach ogg. Ubuntu 14.04 verfügt nicht über ffmpeg in Standard-Repositorys, Sie können jedoch ppa: mc3man / trusty-media repository hinzufügen und das ffmpeg-Paket installieren, um die erforderliche Software zu erhalten. Einzelheiten finden Sie hier .

Roadmr
quelle
Ich habe es falsch ausgedrückt. Ich wollte mp3 oder ogg haben, aber wie Sie bemerkt haben, war der Audio-Codec anders - in diesem Beispiel aac. Also muss ich sie trotzdem transkodieren. Vielen Dank für Ihre Hilfe!
wryrych
Ihr automagisches Beispiel bricht mit Dateinamen, die Leerzeichen enthalten, weil Sie in der Unteranweisung ffprobe nicht "$ file" angegeben haben. Ändern in: für Datei in * mp4 * avi; mache ffmpeg -i "$ file" -vn -acodec kopiere "$ file". ffprobe "$file" 2>&1 |sed -rn 's/.*Audio: (...), .*/\1/p'; Behebt das.
Andrew Beals
+1, aber wie es aussieht, könnte diese Antwort ein Update gebrauchen:This program is only provided for compatibility and will be removed in a future release. Please use avconv instead.
Nicolas Raoul
ffmpegoder ffprobesind nicht verfügbar für Ubuntu 14.04 oder höher.
Jarno
1
@jarno The Real ffmpeg kehrte 15.04 zu Ubuntu zurück und es sieht aus wie die Libav-Spreu avconvund avprobewurde 15.10 entfernt .
Logan
1

Wie Nicolas Raoul sagte, muss dies aktualisiert werden. Hier ist dieselbe Zeile, die roadmr angegeben hat, aber stattdessen avconv verwendet:

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

Scooby-2
quelle
Dies ist jetzt veraltet. FFmpeg ist zurück und Libav ist weg.
Logan
Absolut korrekt. Wenn irgendjemand dachte, dass ffmpeg sterben würde, lesen Sie dies: en.wikipedia.org/wiki/Libav#Confusion
Scooby-2