Comment puis-je extraire l'audio de la vidéo avec ffmpeg?

228

J'ai essayé la commande suivante pour extraire l'audio de la vidéo:

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

mais j'obtiens la sortie suivante

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

Quelqu'un peut-il aider s'il vous plaît?

user1269669
la source

Réponses:

407

Pour extraire le flux audio sans recoder:

ffmpeg -i input-video.avi -vn -acodec copy output-audio.aac
  • -vn n'est pas une vidéo.
  • -acodec copy dit d'utiliser le même flux audio qui s'y trouve déjà.

Lisez la sortie pour voir de quel codec il s'agit, pour définir l'extension de nom de fichier appropriée.

Paul Irish
la source
54
et au lieu d'exécuter ffmpeg une première fois juste pour vérifier de quel flux audio il s'agit, utilisez ffprobe input-video.avi
FlorianB
15
Si vous extrayez uniquement l'audio d'un flux vidéo, la longueur de l'audio peut être plus courte que la longueur de la vidéo. Pour vous assurer que cela ne se produit pas, extrayez à la fois l'audio ET la vidéo avec le même appel à ffmpeg, par exemple "ffmpeg -i vid.avi -map 0: a audio.wav -map 0: v onlyvideo.avi
BlenderBender
2
Ce serait formidable d'étendre cette réponse avec une commande qui encapsule également l'AAC brut dans un conteneur M4A.
Gras Double
8
Dans ce cas précis, remplacez simplement ".aac" par ".m4a" dans le chemin de destination. ffmpeg est assez intelligent pour deviner votre intention, et il encapsule le résultat dans un conteneur M4A :)
Gras Double
1
FWIW, j'ai créé un script PHP, de sorte que je spécifie simplement le fichier vidéo d'entrée, et il détermine automatiquement l'extension du fichier audio de sortie: superuser.com/questions/1301901/…
Gras Double
117

Pour encoder un MP3 de haute qualité à partir d'une meilleure utilisation AVI -q: a pour un débit binaire variable:

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

Si vous souhaitez extraire une partie de l'audio d'une vidéo, utilisez l' option -ss pour spécifier l'horodatage de départ et l' option -t pour spécifier la durée d'encodage, par exemple de 3 minutes et 5 secondes pendant 45 secondes:

ffmpeg -i sample.avi -ss 00:03:05 -t 00:00:45.0 -q:a 0 -map a sample.mp3
  • Les horodatages doivent être au format HH: MM: SS.xxx ou en secondes.

  • Si vous ne spécifiez pas l' option -t , cela ira à la fin.

Exemple de travail:

  1. Télécharger ffmpeg
  2. Ouvrez une invite de commande (Démarrer> Exécuter> CMD) ou sur un Linux / Mac ouvrez un terminal
  3. cd dans le répertoire avec le ffmeg.exe
  4. Exécutez votre commande et attendez le fichier de sortie (ou résolvez les erreurs)

entrez la description de l'image ici

Jeremy Thompson
la source
3
Voici un guide pour les -q:avaleurs: trac.ffmpeg.org/wiki/Encode/MP3 Zero est le paramètre VBR de la plus haute qualité, ce qui se traduit généralement par des débits moyens dans la partie supérieure de la plage CBR saine (où 320 kbit / s est le maximum, probablement un peu au-delà du point où la compression sans perte devient plus appropriée).
Evgeni Sergeev
3
Et que fait -map a-il?
Iulian Onofrei
Attention: il s'agit de ré-encoder l'audio avec une compression avec perte, ce qui dégradera légèrement la qualité. Si l'original est déjà compressé, vous dégraderez la qualité deux fois, ce qui peut être perceptible ou non.
Davidmh
Cette commande fonctionne pour moi, alors que celle ci-dessus -vnne fonctionne pas.
Mmm
12

La ligne de commande est correcte et fonctionne sur un fichier vidéo valide. Je m'assurerais que vous avez installé la bonne bibliothèque pour travailler avec mp3, installez lame o probe avec un autre codec audio.

habituellement

ffmpeg -formats

ou

ffmpeg -codecs

donnerait suffisamment d'informations pour que vous en sachiez plus.

Álvaro
la source
11

ffmpeg -i sample.avivous donnera les informations de format audio / vidéo pour votre fichier. Assurez-vous que les bibliothèques appropriées sont configurées pour analyser les flux d'entrée. Assurez-vous également que le fichier n'est pas corrompu.

smp
la source
maintenant, j'ai obtenu un résultat correct lorsque j'ai essayé le même commentaire avec un .mkv vedio.why cela ne fonctionne pas pour .avi, y a-t-il une commande ffmpeg pour convertir .avi
user1269669
1
AVI ou MKV fait référence au format de conteneur qui peut contenir de nombreux formats audio / vidéo différents. Vous ne cherchez pas à convertir l'audio AVI, vous cherchez à convertir la piste audio dans le fichier AVI, que vous n'avez pas encore spécifié. Utilisez la commande que j'ai listée ci-dessus pour voir quel type de piste audio se trouve dans le fichier AVI. S'il s'agit de MP3, vous devrez compiler FFMPEG avec une bibliothèque MP3 comme LAME lame.sourceforge.net
smp
6

Pour coder l'audio mp3 ffmpeg.org montre l'exemple suivant:

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

J'ai extrait l'audio d'une vidéo simplement en le remplaçant input.wavpar le nom du fichier vidéo. Les 2moyens 190 kb / sec. Vous pouvez voir les autres niveaux de qualité sur mon lien ci-dessus.

Suragch
la source
Cet exemple sert à convertir un fichier audio dans un format différent, et non à l'extraire d'une vidéo.
Iulian Onofrei
@IulianOnofrei, comme je l'ai décrit dans ma réponse, vous pouvez remplacer le fichier audio par un fichier vidéo. Ça a marché pour moi.
Suragch
6

Voici ce que je viens d'utiliser:

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

Explication des options:

  • my.mkv est un fichier vidéo source, vous pouvez également utiliser d'autres formats
  • -map 0:3signifie que je veux un troisième flux à partir d'un fichier vidéo. Mettez votre N là - les fichiers vidéo ont souvent plusieurs flux audio; vous pouvez l'omettre ou utiliser -map 0:apour prendre le flux audio par défaut. Exécutez ffprobe my.mkvpour voir quels flux le fichier vidéo contient.
  • my.mp3 est un nom de fichier audio cible, et ffmpeg pense que je veux un MP3 à partir de son extension. Dans mon cas, le flux audio source est ac3 DTS et la copie n'était pas ce que je voulais
  • 320 k est le débit binaire cible souhaité
  • -vn signifie que je ne veux pas de vidéo dans le fichier cible
Artem Vasiliev
la source
2

Juste une supposition:

-ab 192

devrait être

-ab 192k

Il semble que cela pourrait être un problème, mais peut-être que ffmpeg est assez intelligent pour le corriger.

Chaotique
la source
2
Commentaire valide, et j'ai modifié la question de l'OP pour la changer, mais cela ne change rien (tout au plus, cela produit un avertissement).
Jean-Philippe Pellet
2

Si l'audio enveloppé dans l'avi n'est pas au format mp3 pour commencer, vous devrez peut-être spécifier -acodec mp3un paramètre supplémentaire. Ou quel que soit votre codec mp3 (sur les systèmes Linux, c'est probablement -acodec libmp3lame). Vous pouvez également obtenir le même effet, indépendant de la plate-forme, en spécifiant -f mp3à la place de «forcer» le format au format mp3, bien que toutes les versions de ffmpeg ne prennent toujours pas en charge ce commutateur. Votre kilométrage peut varier.

Xheralt
la source
2

Pour extraire sans conversion, j'utilise une entrée de menu contextuel - en tant qu'action personnalisée du gestionnaire de fichiers sous Linux - pour exécuter ce qui suit (après avoir vérifié le type audio que contient la vidéo; exemple pour une vidéo contenant de l' oggaudio):

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

qui est basé sur la commande ffmpeg ffmpeg -i INPUT -map 0:a -c:a copy OUTPUT.

Je l'ai utilisé -map 0:1sans problème, mais, comme l'a dit dans un commentaire de @LordNeckbeard, "Le flux 0:1n'est pas garanti d'être toujours audio. L'utilisation à la -map 0:aplace de -map 0:1évitera toute ambiguïté."


la source
1
Le flux 0:1n'est pas garanti d'être toujours audio. Utiliser à la -map 0:aplace de -map 0:1évitera toute ambiguïté.
llogan
@LordNeckbeard ~ Je vais en tenir compte, merci.
J'avais l'habitude mediainfode déterminer la piste audio, et je l'ai choisie comme ceci: -map 0:a:1où a: 1 est le deuxième index de la piste audio, thx! -c:a copyrendu beaucoup plus rapide!
Aquarius Power
1

Pour les personnes à la recherche d'un moyen plus simple d'extraire l'audio d'un fichier vidéo tout en conservant les paramètres du fichier vidéo d'origine, vous pouvez utiliser:

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

Par exemple, exécuter:

ffmpeg -i screencap.mov screencap.mp3

extrait un mp3fichier audio d'un movfichier vidéo.

Iulian Onofrei
la source
Simple et fonctionne. Pourquoi toutes les autres solutions sont-elles si compliquées? +1
Scott Biggs
1
La question est, pourquoi cela a-t-il un vote de suppression?!
Iulian Onofrei
-1

Utilisez -b:aau lieu de -abcomme -abest obsolète maintenant, assurez-vous également que le chemin de votre fichier d'entrée est correct.

Pour extraire l'audio d'une vidéo, j'ai utilisé la commande ci-dessous et son bon fonctionnement.

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

Ici,

  • -y - Écraser les fichiers de sortie sans demander.
  • -i - FFmpeg lit à partir d'un nombre arbitraire de «fichiers» d'entrée spécifiés par le -i option
  • -vn - Désactiver l'enregistrement vidéo
  • -ar - définit le taux d'échantillonnage pour les flux audio s'ils sont encodés
  • -ac - Réglez le nombre de canaux audio.
  • -b:a - Réglez le débit audio
  • -f - format

Découvrez ceci pour mon exemple complet de projet Android FFmpeg sur GitHub.

Développeur Android
la source