Intro
Les gens normaux ils utilisent quoi pour éditer des vidéos? Adobe Premiere? Final Cut Pro? Sony Vegas? Windows Movie Maker?
T'as pas un truc chelou en ligne de commande avec 40000 arguments?
BEN OUI QUe J'ai ça, ça s'appelle ffmpeg et ça fait immédiatement de toi un HACKEUR.
De temps en temps j'ai l'une ou l'autre opération triviale à effectuer sur un ou plusieurs extraits vidéos. Je pourrais utiliser un véritable éditeur vidéo comme Shotcut (dont je parlais il y a quelques années dans un article étrangement populaire) sauf que ça prend tout un tas de clicks comparé à l'extrême et élégante efficience de la LIGNE DE COMMANDE.
De plus, avec un éditeur, il faut toujours ré-encoder, ce qui implique une perte de qualité que l'on pourrait éviter pour certaines opérations.
Accessoirement, ffmpeg est aussi utilisable pour l'édition audio et convertir un jpg en webp.
J'essayera de mettre à jour cet article (une première pour moi :D) si je trouve des nouvelles recettes utiles pour ffmpeg.
Anatomie d'une commande ffmpeg
Dans leur doc ils montrent comment que c'est facile à utiliser ffmpeg:
En résumé, on donne le fichier d'entrée avec le paramètre -i (en fait on peut mettre plusieurs fichiers d'entrée avec plusieurs -i mais je voudrais pas déjà compliquer le truc trop tard) puis on nomme le fichier de sortie, et ffmpeg devine la conversion que vous souhaitez réaliser en regardant l'extension du fichier de sortie.
On peut le dire, c'est assez simple en terme de conversion. Pour le reste, moins.
En réalité ça ressemble plus à ça normalemement (à lire tout haut parce que ça rime, je vous jure):
ffmpeg -i input.mkv <UN_GROS_TAS_D_OPTIONS_QUI_DEPASSE_L_HORIZON> output.mkv
Et c'est la raison pour laquelle les gens parlent de commandes ffmpeg comme de recettes de cuisine. Si tu change deux numéros que tu sais pas ce que c'est tu te retrouves avec des blancs en neige qui montent pas. OK ça va pas du tout cette analogie, je m'excuse.
Il y a aussi une version plus simple de tout ça qui permet d'inspecter un fichier d'entrée, histoire de voir de quoi il est fait, quels codecs, formats, pistes audio, résolution, etc.:
ffmpeg -i input.mp4
Je vous conseille de le retenir c'est assez utile pour savoir avec quoi on travaille.
Je suis au courant que la vraie commande d'inspection c'est ça:
ffprobe input.mp4
Sauf que parfois, sous Windows, je n'ai pas accès à ffprobe. Pour les gros nerds d'entre-vous, un avantage de ffprobe est qu'il ne renvoie pas de code d'erreur lors de l'inspection d'un fichier et peut donc être combiné facilement dans des scripts en tous genre.
Extraire l'audio d'une vidéo
Avec une section dédiée à Youtube.
Extraire l'audio d'une vidéo Youtube (MàJ 2022)
J'aime bien écouter des gens qui parlent quand je fais des trucs et machin, que ça soit tâches ménagères, sport, farm en tout genre dans des jeux vidéo où je me mens à moi-même en prétendant que c'est méditatif.
Youtube est rempli de gens qui parlent avec une partie vidéo située quelque part entre "un peu" et "totalement inutile" et pompe votre bande passante mobile pour rien.
Bien évidemment, le site ou l'appli Youtube ne permet pas de juste écouter l'audio sur un téléphone mobile et éteindre l'écran. Ils ont une armée d'intelligences artificielles qui détectent les seins à l'air avec une précision qui est, honnêtement, légèrement inquiétante, mais une option pour juste écouter l'audio en laissant son bidule écran éteint dans une poche... Non. Désolé.
Il y a des sites horribles qui proposent d'extraire l'audio pour vous avec une fiabilité assez foireuse (leurs pubs invasives fonctionnent bien mais le reste, pas nécessairement); JE CONSEILLE PAS.
J'utilisais youtube-dl jusque maintenant mais j'ai récemment changé pour yt-dlp qui est un fork de youtube-dl (toujours en Python donc).
Vous trouverez l'ancienne section sur youtube-dl plus bas. Le soucis est qu'il se retrouvait régulièrement bridé par Youtube, et télécharger ne fut-ce que 150MB à 60Ko/s c'est un peu triste surtout que quand j'ai besoin d'un rip audio Youtube c'est souvent pour aller courir en écoutant ça sans avoir besoin de la vidéo et l'écran actif et les pubs et tout ça et j'en ai besoin le temps d'enfiler mon survet' et mon slip de sport.
Pour chopper yt-dlp, utilitaire en ligne de commande, rendez-vous sur cette page où vous pourrez directement télécharger un .exe à poser quelque part.
Pour Linux ou Mac, c'est possible de l'installer avec pip3 (ou juste pip sur pas mal de distributions modernes):
pip3 install yt-dlp
Il est aussi parfois présent dans les gestionnaires de paquets Linux aussi si vous préférez mais je conseille pas parce que c'est rarement la dernière version qui va bien.
Dernièrement j'ai tendance à juste télécharger le binaire compilé pour Linux à l'arrache depuis leur page Github et je le bourre quelque part d'accessible deupis mon PATH.
Une fois la commande yt-dlp disponible dans votre invite de commande, vous pouvez juste télécharger la vidéo et extraire l'audio par la suite mais c'est plus rapide de récupérer immédiatement le bon format. Dans la plupart des cas c'est l'audio en "m4a":
yt-dlp -f m4a "https://www.youtube.com/watch?v=XqZsoesa55w"
Sinon, vous pouvez demander le "meilleur format audio" (qui la plupart du temps est un .webm à renommer en .opus):
yt-dlp -f ba "https://www.youtube.com/watch?v=XqZsoesa55w"
Pour examiner les formats disponibles:
yt-dlp -F "https://www.youtube.com/watch?v=XqZsoesa55w"
Ce qui devrait vous fournir leurs noms et code identifiants:
Une fois le fichier audio récupéré, y a plus qu'à le mettre sur votre téléphone ou sur une clé USB pour la voiture. Si vous avez un ipod des années 80 ou une voiture un peu ancienne, vous pouvez convertir le m4a en mp3:
ffmpeg -i audio_extrait_video.m4a audio_converti.mp3
Je parle aussi de yt-dlp dans cette brève avec peut-être un peu plus d'infos pour ceux qui captent vraiment rien du tout à la ligne de commande.
En réalité c'est aussi possible d'écouter Youtube avec l'écran éteint en utilisant certains navigateurs mobiles comme par exemple Brave. J'en parle dans une autre brève. Par contre ça consomme bien plus de batterie (et de bande passante ou volume de forfait).
Alternative en ligne: cobalt.tools
Petite mise-à-jour par rapport à encore une autre brève sur le sujet: il existe un site qui permet de directement télécharger l'audio ou la vidéo par flux depuis un lien Youtube.
J'ai déjà eu des soucis dans le passé avec la limite de longueur de vidéo que je n'ai toujours pas très bien cernée mais un moment l'outil se fait dessus si la vidéo est trop longue.
Ceci dit, j'ai déjà téléchargé de l'audio de 1h30 avec cette appli donc c'est assez utile tant qu'elle fonctionne (pas sûr que soit le cas pour toujours).
Rendez-vous sur cobalt.tools
Alternative / Ancienne méthode: youtube-dl
Lors de l'écriture initiale de cet article, je pensais que le mieux était d'utiliser un utilitaire en ligne de commande: youtube-dl. J'utilise désormais l'utilitaire présenté dans la section précédente puisque youtube-dl est régulièrement bridé par Youtube.
Lien alternatif ou vous pouvez directement chopper le .exe comme un=e sauvage: Youtube-dl sur Github — Vous pouvez juste bourrer le .exe quelque part et vous rendre dans ce répertoire depuis une invite de commande. Sur Linux, vous pouvez l'installer depuis votre gestionnaire de paquets (ben ouais) et sur Mac je sais pas mais ça doit pas être compliqué non plus.
L'utilitaire est ecrit en Python (peut être installé avec pip) et régulièrement mis à jour. Il permet de télécharger localement des copies de vidéos Youtube. Il existe une option pour sélectionner un flux en particulier à télécharger et il devrait toujours exister un flux audio-seulement de disponible.
Première étape: chopper la liste de ces flux, en appelant youtube-dl en ligne de commande avec l'URL de la vidéo (copier-coller la barre d'adresse du navigateur sur la page de la vidéo).
Comme ça:
youtube-dl -F "https://www.youtube.com/watch?v=XqZsoesa55w"
N'oubliez pas les guillemets, et il se peut qu'ajouter un ".exe" à youtube-dl soit nécessaire sur certaines versions de Windows.
On récupère ce type de sortie:
Identifiez le format "audio only" avec le plus haut bitrate (le premier chiffre avec un "k" derrière, par ex. 49k, 65k, 129k, etc.) qui ne soit pas un webm et notez son numéro. Ici c'est 140 (en vrai c'est presque toujours 140).
Pour télécharger un flux particulier avec son code (ici 140, je rappelle):
youtube-dl -f 140 "https://www.youtube.com/watch?v=L0YOShbApco"
Vous devriez vous retrouver (dans ce cas-ci) avec un fichier .m4a qui est de l'audio encodée en aac si je me plante pas.
Et puis ben voilà, y a plus qu'à le mettre sur votre téléphone ou sur une clé USB pour la voiture. Si vous avez un ipod des années 80 ou une voiture un peu ancienne, vous pouvez convertir le m4a en mp3:
ffmpeg -i audio_extrait_video.m4a audio_converti.mp3
Extraire l'audio d'un fichier vidéo
Depuis une source qui n'est pas Youtube, ben... C'est simple:
ffmpeg -i input.mp4 -map 0:a output.m4a
Ce qui compresse en aac, en spécifiant qu'on ne veut pas de vidéo (parce qu'un m4a ça peut aussi être une vidéo (oui c'est bizarre)).
Si le fichier source présente plusieurs flux audio, ils seront tous copiés. Pour ne copier que le premier, il s'agit de remplacer "-map 0:a" par "-map 0:a:0". Si cette histoire de flux multiple vous confuse plus qu'autre chose, oubliez pour l'instant (ou pour toujours) — On en reparle dans certaines recettes.
Vous pouvez remplacer l'extension par mp3 pour compresser en mp3 (incroyappp!) ou inspecter le fichier au préalable pour tenter d'utiliser le même format que la source, histoire de ne pas devoir encoder l'audio.
Attention: pour des formats comme mp3 ou wav il faut absolument retirer le -map 0:a parce que les fichiers mp3 n'ont qu'un seul "flux". Posez pas de question, c'est plus simple du coup:
ffmpeg -i input.mp4 output.mp3
Il y a toute une série d'options pour l'encodage audio mais comme c'est impossible de sortir un truc qui sonne mieux que la source déjà compressée... Je vois pas trop à quoi ça sert à parti si vous voulez réduire la qualité pour que ça tienne sur une disquette MOLLE.
Si vous êtes en train de vous demander comment juste récupérer une partie de l'audio suivant un marqueur de début et de fin, vous pouvez juste ajouter les options dont je parle dans la section qui suit.
Couper une vidéo sans perte
Par couper je veux dire extraire un euh... Extrait. OK spa clair, je parle de créer une nouvelle vidéo à partir d'un morceau d'une autre vidéo. Un morceau qui a début et une fin dans le temps.
A ne pas confondre avec rogner qui consiste à couper un bout de l'image.
Avant de procéder, notez l'emplacement temporel de départ dans la vidéo. Ensuite, soit la durée en secondes de l'extrait coupé, soit l'emplacement temporel de fin.
En utilisant début + fin (hh:mm:ss ou hh:ss:ss.mmmm si vous êtes vaiment de ce bord-là):
ffmpeg -ss 0:0:4 -to 0:1:10 -i input.mp4 -c copy output.mp4
Ici on coupe à partir de 4s jusque 1 minute et 10 secondes, à ceci près que le début est choisi à la première keyframe voisine de l'iemplacement temporel de début. Qu'est-ce que ça veut dire ce truc? Ben je sais pas trop moi-même, mais si on ne procède pas de cette manière, il y a un risque significatif de se retrouver avec une vidéo coupée toute foireuse dont le début ne débute pas. Oui c'est difficile à expliquer sans le constater soi-même.
Cette histoire de coupage à la keyframe voisine est la raison pour laquelle les arguments -ss, -t ou -to sont avant le fichier d'entrée (l'argument -i). Sans ça, ffmpeg coupe à l'endroit exact.
Pourquoi l'ordre des arguments change leur signification d'une manière étrange? Je sais pas. Bienvenue dans le monde des commandes UNIX qui font trop de trucs.
Autre version, en utilisant début + durée en seconde:
ffmpeg -ss 0:0:4 -t 30 -i input.mp4 -c copy output.mp4
Ne pas donner d'emplacement temporel de fin signifie qu'il s'agit de couper depuis le temps de départ demandé à la fin de la vidéo:
ffmpeg -ss 0:0:4 -i input.mp4 -c copy output.mp4
Retirer l'audio d'une vidéo
Très utile quand je filme une vidéo de chat mais que je peux pas m'empêcher de commenter en live avec une bête voix dont j'ai bien entendu honte après coup et à moins que j'aie raté 5 ou 6 épisodes il n'y a toujours pas moyen de retirer l'audio depuis Youtube, par exemple.
ffmpeg -i input.mp4 -c copy -an output.mp4
En résumé, on demande de ne pas re-encoder la vidéo (-c copy demande de copier le codec vidéo) et d'utiliser RIEN comme codec audio. N'oubliez pas de mettre la même extension pour entrée et sortie.
Re-encoder une vidéo en h264
Le format h264 c'est LE FORMAT supporté en décodage matériel par de très nombreux appareils modernes, y compris les téléphones.
Cette commande peut servir pour encoder des fichiers bruts sortis d'un DVD, des vieux .mov chelous de l'époque de Quicktime ou encore le screener de StarWars Episode 1 en divx que vous avez récupéré en LAN party il y a 20 ans et qui a une étrange valeur sentimentale inexplicable.
ffmpeg -i input.avi -vf format=yuv420p -crf 18 -preset slow output.mp4
Où:
- Le bidule "-vf yuv420p" est là pour avoir une compatibilité maximale. En général, on peut s'en passer (la qualité peut théoriquement être mieux sans l'option — A tester vous-mêmes si l'enthousiasme vous envahi);
- La "qualité" (influence la taille du fichier) est le "-crf 18", le chiffre va jusque 51 (en général (lol)) et 21 est la valeur par défaut - C'est pratiquement impossible de voir une différence en dessous de 18 — Utiliser 0 comme crf est "lossless", c'est à dire qu'il n'y a aucune compression, ça peut servir si vous devez conserver des fichiers intermédiaires avant une compression finale;
- Le "preset", ici "slow", euh... Ne change pas nécessairement la qualité dans ce cas-ci (dans d'autres cas (particulièrement le streaming ou l'utilisation d'un bitrate constant), oui, je sais j'embrouille tout j'ai tout ruiné je suis désolé et y a trop de parenthèses) mais va vous permettre d'obtenir le meilleur rapport compression/qualité — Je vous conseille d'enlever l'option (correspond à utiliser "medium") si votre ordi n'est pas une brute (il y a encore "veryslow" en dessous).
A noter que vous pouvez utiliser l'option -threads 2 pour limiter à deux threads, par exemple.
Pour économiser de l'espace:
ffmpeg -i input.avi -vf format=yuv420p -crf 34 output.mp4
Combiner / concaténer plusieurs fichiers vidéo ou audio sans perte
J'insiste sur le "sans perte", qui implique que les fichiers que vous souhaitez concaténer aient exactement le même format vidéo et audio.
Sans ça, il faut obligatoirement encoder à nouveau, et la solution ci-dessous ne va pas fonctionner tout en ayant l'air de fonctionner (pas de message d'erreur clair) parce que sinon c'est trop facile. Vous voilà prévenus.
Première étape: Créer un fichier texte bizarre qui reprend tous les fichiers à concaténer dans l'ordre et qui ressemble à ça:
file 'fichier1.mp4'
# Les commentaires sont autorisés, c'est cool hein?
file 'fichier2.mp4'
file 'fichier3 avec des espaces.mp4'
En vrai il y a plus d'options et la possibilité de couper les fichiers à un emplacement donné pour une certaine durée, par ex. Je me permet de vous renvoyer à la doc si ça vous intéresse.
Les chemins absolus et relatifs sont autorisés mais le plus simple c'est d'avoir tout dans le même répertoire: le fichier "liste" et tous les extraits à coller ensembles.
Une fois qu'on a son fichier "liste" (que j'ai appelé "list.txt" ici):
ffmpeg -f concat -safe 0 -i list.txt -c copy output.mp4
Comme je le disais plus haut, vous pouvez concaténer des fichiers audio du même format avec la même technique. N'oubliez pas d'adapter l'extension du fichier de sortie (output.mp4 ici).
Combiner / concaténer plusieurs fichiers vidéo ou audio... Avec perte
Si le format des sources est différent ou que vous souhaitez ajouter des gens de transitions ou changer des paramètres quelconques, il faut encoder toute la vidéo. Je parle toujours de "perte" mais dans beaucoup de cas, avec des paramètres de qualité h264 élevés (voir "Re-encoder une vidéo en h264"), cette perte n'est pas simple à observer.
Par contre, le temps d'encodage est bien plus élevé puisque... Avant il n'y avait pas du tout de temps d'encodage. Ben ouais.
Pour pouvoir combiner des vidéos de codecs différents, il y a tout de même deux prérequis:
- La résolution de toutes les vidéos doit être la même — Si ce n'est pas le cas vous pouvez remettre à l'échelle une vidéo avec une commande expliquée plus loin, à faire avant de combiner les vidéos;
- Le "framerate" (images par seconde) doit être le même pour toutes les vidéos. C'est plus épineux à modifier avec ffmpeg en cela que ça peut générer des erreurs et qu'il est nécessaire de visionner les vidéos modifiées pour vérifier que tout est OK.
Je mets ça ici comme ça pour la modification du framerate d'une vidéo (à vos risques et périls, comme je dis plus haut):
ffmpeg -i input.mp4 -filter:v fps=30 output.mp4
Une fois que vous êtes certains que les vidéos à combiner ont la même résolution et le même framerate, la commande la plus simple est:
ffmpeg -i video1.mp4 -i video2.webm -filter_complex "concat=n=2" output.mkv
Où vous ajoutez un argument -i pour chaque vidéo à combiner, et veillez à bien modifier le n=2 par le nombre de vidéos d'entrée.
Utiliser mkv ou mp4 comme extension du fichier de sortie devrait automatiquement sélectionner h264 avec les paramètres d'encodage par défaut pour votre vidéo de sortie (il est bien entendu possible de spécifier tous ces paramètres comme présenté dans la section "Re-encoder une vidéo en h264").
Au cas où vous êtes d'humeur sauvage et vos vidéos d'entrées ont plusieurs flux (par ex. les films ont souvent plusieurs flux audio pour les langues), vous pouvez sélectionner les flux audio et vidéo à utiliser pour la vidéo finale. Je vous livre ça à toutes fins utiles mais il y a pas mal de chance que ça merde si une des vidéos n'a qu'un seul flux:
ffmpeg -i input1.mp4 -i input2.webm -i input3.mkv \
-filter_complex "[0:v:0][0:a:0][1:v:0][1:a:0][2:v:0][2:a:0]concat=n=3:v=1:a=1[outv][outa]" \
-map "[outv]" -map "[outa]" output.mkv
Cet exemple combine trois vidéos.
Cette histoire de -map reviendra quelques fois dans cet article parce que j'explique comment manipuler plusieurs pistes audio dans certaines recettes. En gros, on choisit les flux 0 et 1 pour vidéo et audio respectivement pour la vidéo 0 (la première, quoi) et idem pour la seconde. On ajuste bien le n=2 si nécessaire, puis on sépcifie le nombre de flux qui seront dans le fichier de sortie et on leur donne un nom (outv et outa) qui deviendront ensuite les deux seuls flux du fichier de sortie.
Vous trouverez plus d'info dans la doc officielle si devenir un héros de ffmpeg vous intéresse (ça impressionne en soirée).
Concaténer des vidéos avec de chouettes transitions
A moins de recompiler ffmpeg avec des effets, le plus simple est d'utiliser ce projet JavaScript qui inclus sa propre version de ffmpeg (pour le meilleur et pour le pire). Voici le Github du projet:
Combiner les pistes audio d'une vidéo
Les formats avec extensions mp4, mkv, et parfois webm sont en mesure de gérer plusieurs flux audio différents que vous pouvez sélectionner dans votre lecteur vidéo (qui prend le premier flux audio par défaut).
Un cas d'utilisation classique est de proposer plusieurs langues différentes sur une vidéo, chaque langue étant une piste audio.
Mon cas d'utilisation perso, c'est quand j'utilise ShadowPlay pour enregistrer un extrait d'un jeu: je l'ai configuré pour enregistrer mon micro sur une piste séparée de l'audio général de Windows.
Ce type de config est également possible sur OBS qui par ailleurs est potentiellement juste mieux pour enregistrer des extraits de jeux mais ShadowPlay est plus facile à utiliser et je suis un peu fainéant.
Si je veux partager une vidéo ou la poser sur Youtube, il me faut le canal audio général combiné à celui du micro, la vidéo ne doit pas être encodée à nouveau pour éviter le temps d'encodage et la perte de qualité.
La technique de base:
ffmpeg -i input.mp4 -filter_complex "[0:a:0][0:a:1]amerge=inputs=2[a]" -map "0:v:0" -map "[a]" -c:v copy -c:a aac -b:a 384k output.mp4
Où:
- Je combine les flux audio 0 et 1 de la vidéo d'entrée "0", spécifie qu'il y a bien deux flux à mixer (à modifier si vous en avez plus) avec inputs=2 puis je nomme le nouveau canal audio "[a]";
- Pour la vidéo de sortie, on prend le premier flux vidéo (ce que fait map "0:v:0") et le nouveau flux créé précédemment "[a]" comme flux audio;
- On spécifie qu'il s'agit de copier la vidéo telle quelle sans encoder;
- Je choisis des paramètres d'encodage pour mon audio, je force aac en 384k mais vous êtes libres de modifier les paramètres audio selon vos préférences (l'audio prend très peu de place comparé à la vidéo).
C'est à ce moment là que vous vous rendez compte que l'audio du mirco est bien trop forte par rapport au reste et que ce serait-y pas mal de pouvoir ajuster le volume du flux audio correspondant.
Oui, c'est possible! Exemple ici avec le volume du flux audio source "1" réduit d'1/10ème (l'autre laissé tel quel):
ffmpeg -i input.mp4 -filter_complex "[0:a:1]volume=0.9[l];[0:a:0][l]amerge=inputs=2[a]" -map "0:v:0" -map "[a]" -c:v copy -c:a aac -b:a 384k output.mp4
Ce qui consiste à créer un nouveau flux audio (appellé "[l]", pas terrible ce nom, je sais) et d'utiliser celui-là pour mixer ensuite.
Vous pouvez bien entendu ajuster le volume de chaque canal:
ffmpeg -i input.mp4 -filter_complex "[0:a:0]volume=0.5[p];[0:a:1]volume=0.9[l];[p][l]amerge=inputs=2[a]" -map "0:v:0" -map "[a]" -c:v copy -c:a aac -b:a 384k output.mp4
Retirer des pistes audio d'une vidéo
Dans le même genre que la recette précédente, parfois je dois me débarasser de la piste audio "micro" parce qu'elle contient des informations compromettantes qui pourraient ruiner ma future carrière politique.
C'est un cas d'utilisation de ce bon vieil argument map. Avant de procéder, inspectez le fichier source pour noter les identifiants des flux présents, avec un ffmpeg -i <FICHIER_A_INSPECTER>.mp4.
Exemple:
Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, smpte170m), 2560x1440 [SAR 1:1 DAR 16:9], 39301 kb/s, 59.97 fps, 60 tbr, 90k tbn, 120 tbc (default)
Metadata:
creation_time : 2021-03-13T10:20:25.000000Z
handler_name : VideoHandle
Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 198 kb/s (default)
Metadata:
creation_time : 2021-03-13T10:20:25.000000Z
handler_name : SoundHandle
Stream #0:2(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 163 kb/s (default)
Metadata:
creation_time : 2021-03-13T10:20:25.000000Z
handler_name : SoundHandle
Ce qui signifie:
- Flux 0:0: C'est la vidéo
- Flux 0:1: Un canal audio stéréo
- Flux 0:2: Un autre canal audio stéréo
Dans ce cas-ci je sais que c'est le flux 0:2 que je souhaite éliminer, il s'agit donc de spécifier de conserver tous les autres et de spécifier qu'il n'est pas nécessaire de re-encoder quoi que ce soit:
ffmpeg -i input.mp4 -map 0:0 -map 0:1 -acodec copy -vcodec copy output.mp4
Rotation d'une vidéo
Cette recette-ci est bien pratique pour les vidéos filmées à l'arrache avec un téléphone.
Ceci dit, les téléphones ajoutent parfois une métadonnée qui indique s'il y a lieu de tourner la vidéo lors de la lecture, une opération qu'un lecteur vidéo comme VLC est capable d'accomplir (ça coûte un peu de ressources système).
Vous pouvez d'ailleurs utiliser ffmpeg pour créer ou modifier cette métadonnée mais ça n'est pas le sujet de la présente recette, c'est le sujet de la suivante.
Un des gros soucis de cette métadonnée de rotation, c'est que, Youtube (par exemple) l'ignore totalement. Vous allez juste vous retrouver avec une vidéo bizarre à l'envers.
Voici un exemple pour tourner de 180 degrés (re-encoder la vidéo est nécessaire, bien entendu):
ffmpeg -i input.mp4 -vf "transpose=1,transpose=1" -acodec copy output.mp4
Où chaque transpose=1 correspond à une rotation de 90° dans le sens horaire.
Retirer la métadonnée de rotation d'une vidéo
J'en parlais juste au dessus, beaucoup de téléphones filment en paysage comme que c'est la norme et ajoutent une métadonnée pour qu'une rotation s'applique lors de la lecture.
Ceci n'implique évidemment aucune perte de qualité:
ffmpeg -i input.mp4 -c copy -metadata:s:v:0 rotate=0 output.mp4
Changer la résolution d'une vidéo
Celle-ci est utile à plusieurs scénarios différents.
Un que j'ai testé récemment: passer une vidéo 1080p en 4k avant un upload Youtube. La qualité du flux 1080p que Youtube va créer à partir du 4k que vous avez uploadé est parfois mieux que si vous aviez juste uploadé le 1080p uniquement.
C'est pas pour autant que je conseille de systématiquement faire ça puisque votre "faux 4k" est tout de même moins beau qu'un vrai 4k pour les gens qui souhaitent vraiment regarder dans cette résolution, et vous ne pouvez pas dire à Youtube "oui donc je t'envoie ce truc 4k mais tu peux tout jeter au dessus de 1080p en fait c'est juste pour tricher avec ton encodeur de prout".
Parmi les autres scénarios on pourrait transformer des vidéos de résolutions différentes pour les concaténer par la suite puiqu'elles doivent avoir la même résolution (et le même framerate) pour une concaténation, ou encore réduire la résolution d'une vidéo pour gagner en taille de fichier (moins de résolution et/ou de framerate = fichier plus petit, je précise au cas ou).
Voici un exemple pour pousser en 4k:
ffmpeg -i input.mp4 -vf scale=3840x2560:flags=lanczos -c:a copy output_4k.mp4
Ce qui utilisera l'encodage h264 avec les options par défaut. Pour une toute bonne qualité en vue de mettre tout ce que vous pouvez de votre côté face à ce que Youtube pourrait infliger à votre vidéo:
ffmpeg -i input.mp4 -vf scale=3840x2560:flags=lanczos -crf 18 -preset veryslow -c:a copy output_4k.mp4
A savoir que ça va bien ruiner votre CPU, armez-vous de patience ou utilisez un preset moins balaise. J'arrive à un pur 100% sur mon 12 coeurs et ça prend quand même plus de 10 minutes pour une vidéo pas très longue.

Vous pouvez utiliser l'argument -threads 6 pour limiter à 6 threads, par exemple, à ajuster selon vos besoins si vous souhaitez continuer à utiliser l'ordinateur pendant l'encodage.
Extraire un canal des canaux stéréo d'un fichier stéréo
Oui elle est un peu étrange celle-ci. En fait j'ai parfois des enregistrements de micro en stéréo qui ne devraient pas être en stéréo.
Exemple pour extraire le canal droit (il s'appelle "FR" pour "Front Right" parce que cette commande fonctionne aussi normalement sur de l'audio qui présente plus que deux canaux (comme du 5.1 ou 7.1 par ex.):
ffmpeg -i stereo.wav -filter_complex "[0:a]channelsplit=channel_layout=stereo:channels=FR[right]" -map "[right]" front_right.wav
Inverser les couleurs
Je vous raconte mon use case pour cette recette tellement je suis sûr que ça va trop vous intéresser.
J'ai un problème de radinnerie conscience écologique avec ma télévision OLED quand je regarde des partitions musicales sur Youtube parce que c'est noir sur blanc et y a vraiment... Beaucoup de blanc, et ça consomme la blinde sur un OLED.
Du coup je télécharge ces vidéos et je les inverse en blanc sur noir. Un peu comme si j'activais le mode sombre, quoi.
Voici la ligne qui va bien:
ffmpeg -i input.mov -vf negate output.mov
Extraire toutes les images d'une vidéo
Autant vous dire que ça fait beaucoup d'images. Je conseille un système de stockage rapide avec beaucoup d'espace disque, surtout si vous partez sur du png comme format de sortie.
Il s'agit au préalable de créer un répertoire de sortie, par exemple "frames" dans ce cas-ci. Ensuite:
ffmpeg -i input.mp4 "frames/out-%03d.png"
Vous pouvez sans problème changer l'extension de sortie en jpg, sachant que la qualité sera un peu moins bien et qu'il n'y aura pas de support pour la transparence (oui j'ai appris récemment qu'il y avait des vidéos avec un canal alpha pour le web).
Je rappelle en passant l'option "-r" pour spécifier le nombre d'images par secondes, vous pouvez utiliser un chiffre moins élevé que celui de la vidéo pour sortir moins d'images.




Commentaires
Il faut JavaScript activé pour écrire des commentaires ici
#1
#2
#3