Come posso estrarre l'audio dal video con ffmpeg?


227

Ho provato il seguente comando per estrarre l'audio dal video:

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

ma ottengo il seguente output

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

Qualcuno può aiutare, per favore?

Risposte:


406

Per estrarre il flusso audio senza ricodificare:

ffmpeg -i input-video.avi -vn -acodec copy output-audio.aac
  • -vn non è un video.
  • -acodec copy dice di utilizzare lo stesso flusso audio già presente.

Leggi l'output per vedere che codec è, per impostare l'estensione del nome file corretta.


54
e invece di eseguire ffmpeg per la prima volta solo per controllare quale flusso audio è, usa ffprobe input-video.avi
FlorianB

15
Se si estrae solo l'audio da un flusso video, la lunghezza dell'audio potrebbe essere inferiore alla lunghezza del video. Per assicurarti che ciò non accada, estrai sia audio che video con la stessa chiamata a ffmpeg, ad esempio "ffmpeg -i vid.avi -map 0: a audio.wav -map 0: v onlyvideo.avi
BlenderBender

2
Sarebbe bello espandere questa risposta con un comando che incapsula anche l'AAC grezzo in un contenitore M4A.
Gras Double

8
In questo preciso caso, basta sostituire ".aac" con ".m4a" nel percorso di destinazione. ffmpeg è abbastanza intelligente da indovinare il tuo intento e incapsula il risultato in un contenitore M4A :)
Gras Double

1
FWIW, ho creato uno script PHP, in modo da specificare semplicemente il file video di input e determina automaticamente l'estensione del file audio di output: superuser.com/questions/1301901/…
Gras Double

117

Per codificare un MP3 di alta qualità da un AVI utilizzare al meglio -q: a per bit rate variabile:

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

Se si desidera estrarre una parte dell'audio da un video, utilizzare l' opzione -ss per specificare il timestamp iniziale e l' opzione -t per specificare la durata della codifica, ad esempio da 3 minuti e 5 secondi per 45 secondi:

ffmpeg -i sample.avi -ss 00:03:05 -t 00:00:45.0 -q:a 0 -map a sample.mp3
  • I timestamp devono essere nel formato HH: MM: SS.xxx o in secondi.

  • Se non specifichi l' opzione -t , andrà alla fine.

Esempio funzionante:

  1. Scarica ffmpeg
  2. Apri un Prompt dei comandi (Start> Esegui> CMD) o su Linux / Mac apri un Terminale
  3. cd nella directory con ffmeg.exe
  4. Emettere il comando e attendere il file di output (o risolvere eventuali errori)

inserisci qui la descrizione dell'immagine


3
Ecco una guida per i -q:avalori: trac.ffmpeg.org/wiki/Encode/MP3 Zero è l'impostazione VBR di massima qualità, che di solito si traduce in bitrate medi nella parte superiore dell'intervallo CBR sano (dove 320 kbit / s è il massimo, probabilmente un po 'oltre il punto in cui la compressione senza perdita diventa più appropriata).
Evgeni Sergeev,

3
E che cosa -map afare?
Iulian Onofrei,

Avvertenza: si tratta di ricodificare l'audio con una compressione con perdita, che peggiorerà leggermente la qualità. Se l'originale è già compresso, la qualità verrà degradata due volte, il che potrebbe essere evidente o no.
Davidmh,

Questo comando funziona per me, quando quello sopra con -vnno.
Mmm

12

La riga di comando è corretta e funziona su un file video valido. Mi assicurerei di aver installato la libreria corretta per lavorare con mp3, installare lame o probe con un altro codec audio.

Generalmente

ffmpeg -formats

o

ffmpeg -codecs

darebbe informazioni sufficienti per saperne di più.


11

ffmpeg -i sample.aviti fornirà le informazioni sul formato audio / video per il tuo file. Assicurarsi di disporre delle librerie appropriate configurate per analizzare i flussi di input. Inoltre, assicurati che il file non sia danneggiato.


ora, ho ottenuto il risultato corretto quando ho provato lo stesso commento con un .mkv vedio.perché non funziona per .avi, c'è qualche comando ffmpeg per convertire .avi
user1269669

1
AVI o MKV si riferisce al formato contenitore che può contenere molti formati audio / video diversi. Non stai cercando di convertire l'audio AVI, stai cercando di convertire la traccia audio all'interno del file AVI, che non hai ancora specificato. Usa il comando che ho elencato sopra per vedere che tipo di traccia audio è all'interno del file AVI. Se si tratta di MP3, dovrai compilare FFMPEG con una libreria MP3 come LAME lame.sourceforge.net
smp

6

Per codificare l'audio mp3 ffmpeg.org mostra il seguente esempio:

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

Ho estratto l'audio da un video semplicemente sostituendolo input.wavcon il nome del file video. Il 2mezzo 190 kb / sec. Puoi vedere gli altri livelli di qualità sul mio link qui sopra.


Quell'esempio è per convertire un file audio in un formato diverso, non per estrarlo da un video.
Iulian Onofrei

@IulianOnofrei, come ho descritto nella mia risposta, è possibile sostituire il file audio con un file video. Ha funzionato per me.
Suragch

6

Ecco cosa ho appena usato:

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

Spiegazione delle opzioni:

  • my.mkv è un file video sorgente, puoi usare anche altri formati
  • -map 0:3significa che voglio il 3 ° stream dal file video. Metti la tua N lì - i file video spesso hanno più flussi audio; puoi ometterlo o utilizzare -map 0:aper prendere il flusso audio predefinito. Correreffprobe my.mkv per vedere quali flussi ha il file video.
  • my.mp3 è un nome file audio di destinazione e ffmpeg scopre che voglio un MP3 dalla sua estensione. Nel mio caso il flusso audio sorgente è ac3 DTS e la sola copia non era quello che volevo
  • 320k è il bitrate target desiderato
  • -vn significa che non voglio video nel file di destinazione

2

Solo una supposizione:

-ab 192

dovrebbe essere

-ab 192k

Sembra che potrebbe essere un problema, ma forse ffmpeg è abbastanza intelligente da correggerlo.


2
Commento valido e ho modificato la domanda del PO per cambiarlo, ma questo non cambia nulla (al massimo, produce un avvertimento).
Jean-Philippe Pellet,

2

Se per prima cosa l'audio inserito nell'AVI non è in formato mp3, potrebbe essere necessario specificare -acodec mp3come parametro aggiuntivo. O qualunque sia il tuo codec mp3 (sui sistemi Linux è probabilmente -acodec libmp3lame). Puoi anche ottenere lo stesso effetto, indipendente dalla piattaforma, specificando invece -f mp3di "forzare" il formato in mp3, anche se non tutte le versioni di ffmpeg supportano ancora quel passaggio. Il tuo chilometraggio può variare.


2

Per estrarre senza conversione utilizzo una voce del menu di scelta rapida - come azione personalizzata del file manager in Linux - per eseguire quanto segue (dopo aver verificato il tipo di audio contenuto nel video; esempio per il video contenente oggaudio):

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

che si basa sul comando ffmpeg ffmpeg -i INPUT -map 0:a -c:a copy OUTPUT.

L'ho usato -map 0:1senza problemi, ma, come detto in un commento di @LordNeckbeard, "Lo streaming 0:1non è garantito per essere sempre audio. L'uso al -map 0:aposto di -map 0:1eviterà l'ambiguità".


1
Lo streaming 0:1non è garantito per essere sempre audio. Usare al -map 0:aposto di -map 0:1eviterà l'ambiguità.
Llogan,

@LordNeckbeard ~ Lo terrò in considerazione, grazie.

Prima mediainfodeterminavo la traccia audio e la sceglievo così: -map 0:a:1dove a: 1 è il secondo indice della traccia audio, grazie! -c:a copyreso molto più veloce!
Aquarius Power il

1

Per le persone che cercano il modo più semplice per estrarre l'audio da un file video mantenendo i parametri del file video originale, è possibile utilizzare:

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

Ad esempio, eseguendo:

ffmpeg -i screencap.mov screencap.mp3

estrae un mp3file audio da un movfile video.


Semplice e funziona. Perché tutte le altre soluzioni sono così complicate? +1
Scott Biggs,

1
La domanda è: perché questo ha un voto di eliminazione ?!
Iulian Onofrei

-1

Utilizzare -b:ainvece di -abcome non -abè aggiornato ora, inoltre assicurarsi che il percorso del file di input sia corretto.

Per estrarre l'audio da un video ho usato il comando seguente e il suo funzionamento va bene.

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

Qui,

  • -y - Sovrascrivi i file di output senza chiedere.
  • -i - FFmpeg legge da un numero arbitrario di "file" di input specificati da -i dall'opzione
  • -vn - Disabilita la registrazione video
  • -ar - imposta la frequenza di campionamento per i flussi audio se codificati
  • -ac - Imposta il numero di canali audio.
  • -b:a - Imposta il bitrate audio
  • -f - formato

Dai un'occhiata a questo per il mio esempio completo di progetto Android FFmpeg su GitHub.

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.