Wie kann ich mit ffmpeg Audio aus Video extrahieren?

227

Ich habe den folgenden Befehl versucht, um Audio aus Video zu extrahieren:

ffmpeg -i Sample.avi -vn -ar 44100 -ac 2 -ab 192k -f mp3 Sample.mp3

aber ich bekomme folgende ausgabe

libavutil     50.15. 1 / 50.15. 1
libavcodec    52.72. 2 / 52.72. 2
libavformat   52.64. 2 / 52.64. 2
libavdevice   52. 2. 0 / 52. 2. 0
libavfilter    1.19. 0 /  1.19. 0
libswscale     0.11. 0 /  0.11. 0
libpostproc   51. 2. 0 / 51. 2. 0
SamplE.avi: Invalid data found when processing input

Kann mir bitte jemand helfen?

user1269669
quelle

Antworten:

404

So extrahieren Sie den Audiostream ohne Neucodierung:

ffmpeg -i input-video.avi -vn -acodec copy output-audio.aac
  • -vn ist kein Video.
  • -acodec copy sagt, benutze den gleichen Audio-Stream, der bereits da ist.

Lesen Sie die Ausgabe, um zu sehen, um welchen Codec es sich handelt, und legen Sie die richtige Dateinamenerweiterung fest.

Paul Irish
quelle
53
und anstatt ffmpeg zum ersten Mal auszuführen, nur um zu überprüfen, um welchen Audiostream es sich handelt, verwenden Sie ffprobe input-video.avi
FlorianB
15
Wenn Sie nur Audio aus einem Videostream extrahieren, ist die Länge des Audios möglicherweise kürzer als die Länge des Videos. Um sicherzustellen, dass dies nicht geschieht, extrahieren Sie sowohl Audio als auch Video mit demselben Aufruf von ffmpeg, z. B. "ffmpeg -i vid.avi -map 0: a audio.wav -map 0: v onlyvideo.avi
BlenderBender
2
Es wäre großartig, diese Antwort mit einem Befehl zu erweitern, der auch die rohe AAC in einen M4A-Container kapselt.
Gras Double
8
In diesem Fall ersetzen Sie einfach ".aac" durch ".m4a" im Zielpfad. ffmpeg ist klug genug, um Ihre Absicht zu erraten, und es kapselt das Ergebnis in einen M4A-Container :)
Gras Double
1
FWIW, ich habe ein PHP-Skript erstellt, so dass ich nur die Eingabe-Videodatei spezifiziere, und es bestimmt automatisch die Erweiterung der Ausgabe-Audiodatei: superuser.com/questions/1301901/…
Gras Double
117

Um eine hochwertige MP3- Datei von einem AVI zu codieren, verwenden Sie am besten -q: a für variable Bitrate:

ffmpeg -i sample.avi -q:a 0 -map a sample.mp3

Wenn Sie einen Teil des Audios aus einem Video extrahieren möchten, geben Sie mit der Option -ss den Startzeitstempel und mit der Option -t die Codierungsdauer an, z. B. zwischen 3 Minuten und 5 Sekunden für 45 Sekunden:

ffmpeg -i sample.avi -ss 00:03:05 -t 00:00:45.0 -q:a 0 -map a sample.mp3
  • Die Zeitstempel müssen im Format HH: MM: SS.xxx oder in Sekunden vorliegen.

  • Wenn Sie die Option -t nicht angeben , wird sie beendet.

Arbeitsbeispiel:

  1. Laden Sie ffmpeg herunter
  2. Öffnen Sie eine Eingabeaufforderung (Start> Ausführen> CMD) oder öffnen Sie unter Linux / Mac ein Terminal
  3. CD in das Verzeichnis mit der Datei ffmeg.exe
  4. Geben Sie Ihren Befehl ein und warten Sie auf die Ausgabedatei (oder beheben Sie alle Fehler).

Geben Sie hier die Bildbeschreibung ein

Jeremy Thompson
quelle
3
Hier ist eine Anleitung für die -q:aWerte: trac.ffmpeg.org/wiki/Encode/MP3 Null ist die VBR-Einstellung mit der höchsten Qualität, die normalerweise zu durchschnittlichen Bitraten im oberen Teil des normalen CBR-Bereichs führt (wobei 320 kbit / s die sind maximal, wahrscheinlich etwas jenseits des Punktes, an dem verlustfreie Komprimierung angemessener wird).
Evgeni Sergeev
3
Und was macht -map adas?
Iulian Onofrei
Vorsichtsmaßnahme: Hiermit wird das Audio mit einer verlustbehafteten Komprimierung neu codiert, wodurch die Qualität geringfügig beeinträchtigt wird. Wenn das Original bereits komprimiert ist, wird die Qualität zweimal beeinträchtigt, was sich möglicherweise bemerkbar macht oder nicht.
Davidmh
Dieser Befehl funktioniert bei mir, wenn der obige mit -vnnicht funktioniert.
Mmm
12

Die Befehlszeile ist korrekt und arbeitet mit einer gültigen Videodatei. Ich würde sicherstellen, dass Sie die richtige Bibliothek installiert haben, um mit MP3 zu arbeiten, lame o Probe mit einem anderen Audio-Codec installieren.

Normalerweise

ffmpeg -formats

oder

ffmpeg -codecs

würde genügend Informationen geben, damit Sie mehr wissen.

Álvaro
quelle
11

ffmpeg -i sample.avigibt Ihnen die Audio- / Videoformatinformationen für Ihre Datei. Stellen Sie sicher, dass Sie die richtigen Bibliotheken konfiguriert haben, um die Eingabestreams zu analysieren. Stellen Sie außerdem sicher, dass die Datei nicht beschädigt ist.

smp
quelle
Jetzt habe ich das richtige Ergebnis erhalten, als ich den gleichen Kommentar mit einem .mkv vedio versucht habe. Warum es für .avi nicht funktioniert, gibt es einen ffmpeg-Befehl zum Konvertieren von .avi
user1269669
1
AVI oder MKV bezieht sich auf das Containerformat, das viele verschiedene Audio- / Videoformate enthalten kann. Sie möchten kein AVI-Audio konvertieren, sondern die Audiospur in der AVI-Datei konvertieren, die Sie noch nicht angegeben haben. Verwenden Sie den oben aufgeführten Befehl, um festzustellen, welche Art von Audiospur in der AVI-Datei enthalten ist. Wenn es sich um MP3 handelt, müssen Sie FFMPEG mit einer MP3-Bibliothek wie LAME lame.sourceforge.net kompilieren
smp
6

Um MP3-Audio zu codieren, zeigt ffmpeg.org das folgende Beispiel:

ffmpeg -i input.wav -codec:a libmp3lame -qscale:a 2 output.mp3

Ich habe das Audio aus einem Video extrahiert, indem ich es durch input.wavden Dateinamen des Videos ersetzt habe. Das 2bedeutet 190 kb / s. Sie können die anderen Qualitätsstufen unter meinem Link oben sehen.

Suragch
quelle
In diesem Beispiel wird eine Audiodatei in ein anderes Format konvertiert und nicht aus einem Video extrahiert.
Iulian Onofrei
@IulianOnofrei, wie ich in meiner Antwort beschrieben habe, können Sie die Audiodatei durch eine Videodatei ersetzen. Es hat bei mir funktioniert.
Suragch
5

Folgendes habe ich gerade verwendet:

ffmpeg -i my.mkv -map 0:3 -vn -b:a 320k my.mp3

Erklärung der Optionen:

  • my.mkv ist eine Quellvideodatei. Sie können auch andere Formate verwenden
  • -map 0:3bedeutet, ich möchte den 3. Stream von der Videodatei. Platzieren Sie Ihr N dort - Videodateien haben oft mehrere Audio-Streams; Sie können es weglassen oder verwenden -map 0:a, um den Standard-Audiostream zu verwenden. Laufffprobe my.mkv zu sehen, welche Streams die Videodatei enthält.
  • my.mp3 ist ein Ziel-Audiodateiname, und ffmpeg stellt fest, dass ich eine MP3-Datei von ihrer Erweiterung haben möchte. In meinem Fall ist der Quell-Audio-Stream ac3 DTS und nur das Kopieren war nicht das, was ich wollte
  • 320k ist eine gewünschte Zielbitrate
  • -vn bedeutet, dass ich kein Video in der Zieldatei haben möchte
Artem Vasiliev
quelle
2

Nur eine Vermutung:

-ab 192

sollte sein

-ab 192k

Das scheint ein Problem zu sein, aber vielleicht ist ffmpeg klug genug, um es zu korrigieren.

Chaotisch
quelle
2
Gültiger Kommentar, und ich habe die Frage des OP bearbeitet, um sie zu ändern, aber dies ändert nichts (höchstens wird eine Warnung ausgegeben).
Jean-Philippe Pellet
2

Wenn das in das AVI eingewickelte Audio zunächst kein MP3-Format hat, müssen Sie möglicherweise -acodec mp3einen zusätzlichen Parameter angeben . Oder was auch immer Ihr MP3-Codec ist (auf Linux-Systemen ist es wahrscheinlich -acodec libmp3lame). Sie können den gleichen Effekt auch plattformunabhängig erzielen, indem Sie stattdessen angeben -f mp3, dass das Format auf mp3 "erzwungen" werden soll, obwohl nicht alle Versionen von ffmpeg diesen Schalter weiterhin unterstützen. Ihr Kilometerstand kann variieren.

Xheralt
quelle
2

Zum Extrahieren ohne Konvertierung verwende ich einen Kontextmenüeintrag - als benutzerdefinierte Aktion des Dateimanagers unter Linux - um Folgendes auszuführen (nachdem ich überprüft habe, welchen Audiotyp das Video enthält; Beispiel für ein Video, das oggAudio enthält):

bash -c 'ffmpeg -i "$0" -map 0:a -c:a copy "${0%%.*}".ogg' %f 

welches auf dem Befehl ffmpeg basiert ffmpeg -i INPUT -map 0:a -c:a copy OUTPUT.

Ich habe -map 0:1das ohne Probleme verwendet, aber wie in einem Kommentar von @LordNeckbeard gesagt: "Es ist nicht garantiert, dass Stream immer Audio ist. Durch Verwenden von statt wird Mehrdeutigkeit vermieden ."0:1-map 0:a-map 0:1


quelle
1
Es 0:1ist nicht garantiert, dass Stream immer Audio ist. Wenn Sie -map 0:aanstelle von verwenden, -map 0:1werden Mehrdeutigkeiten vermieden.
Llogan
@ LordNeckbeard ~ Ich werde das berücksichtigen, danke.
Ich habe mediainfodie Audiospur bestimmt und sie so gewählt: -map 0:a:1wobei a: 1 der zweite Audiospurindex ist, danke! -c:a copymachte es viel schneller!
Wassermann Power
1

Für Leute, die nach der einfacheren Möglichkeit suchen, Audio aus einer Videodatei zu extrahieren, während die Parameter der ursprünglichen Videodatei beibehalten werden, können Sie Folgendes verwenden:

ffmpeg -i <video_file_name.extension> <audio_file_name.extension>

Zum Beispiel:

ffmpeg -i screencap.mov screencap.mp3

extrahiert eine mp3Audiodatei aus einer movVideodatei.

Iulian Onofrei
quelle
Einfach und funktioniert. Warum sind alle anderen Lösungen so kompliziert? +1
Scott Biggs
1
Die Frage ist, warum hat dies eine Löschabstimmung?!
Iulian Onofrei
-1

Verwenden Sie -b:aanstelle von -abals-ab sicher, dass der Pfad Ihrer Eingabedatei korrekt ist, jetzt veraltet zu verwenden.

Um Audio aus einem Video zu extrahieren, habe ich den folgenden Befehl verwendet und es funktioniert einwandfrei.

String[] complexCommand = {"-y", "-i", inputFileAbsolutePath, "-vn", "-ar", "44100", "-ac", "2", "-b:a", "256k", "-f", "mp3", outputFileAbsolutePath};

Hier,

  • -y - Überschreiben Sie Ausgabedateien ohne zu fragen.
  • -i- FFmpeg liest aus einer beliebigen Anzahl von Eingabedateien, die durch die -iOption angegeben werden
  • -vn - Deaktivieren Sie die Videoaufnahme
  • -ar - Legt die Abtastrate für Audiostreams fest, wenn diese codiert sind
  • -ac - Stellen Sie die Anzahl der Audiokanäle ein.
  • -b:a - Stellen Sie die Audio-Bitrate ein
  • -f - Format

Schauen Sie sich dies für mein komplettes Beispiel-FFmpeg-Android-Projekt auf GitHub an.

Android-Entwickler
quelle