Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
ffmpeg [Le 19/06/2023, 06:22] 1.47.159.5 |
ffmpeg [Le 27/08/2024, 16:29] (Version actuelle) ouvradou [Transformer la vidéo] |
||
---|---|---|---|
Ligne 30: | Ligne 30: | ||
===== Utilisation ===== | ===== Utilisation ===== | ||
+ | |||
+ | **Tout ce qui suit parlera de la partie manipulation de fichier Audio - Video.** | ||
+ | |||
+ | Cependant, il est utile de savoir que **ffmpeg** intègre par défaut un lecteur minimaliste audio-video **ffplay** utilisable depuis le terminal. | ||
+ | |||
+ | Attention, minimaliste ne veut pas dire peu performant.\\ | ||
+ | Avec toutes les possibilités de ffmpeg vous pouvez aller bien plus loin que n'importe quel lecteur.\\ | ||
+ | Seul ressource pour cela ... connaitre les arguments à entrer dans la commande terminal. | ||
+ | |||
+ | En bref : plus léger, plus simple et plus qualitatif par défaut. Par choix, plus tout ce que vous voulez pour aller plus loin. | ||
+ | |||
+ | |||
+ | **Utilisation pour lire UN SEUL fichier Audio ou Video** | ||
+ | |||
+ | Tapez dans le terminal ce qui suit et appuyez sur la touche "Entrée" du clavier\\ | ||
+ | |||
+ | __Pour un fichier video__\\ | ||
+ | <code>ffplay "le_chemin_du_fichier_que_je_veux_lire.mkv" (ou .mp4, etc.;l'extension du fichier à lire)</code> | ||
+ | |||
+ | __Pour un fichier audio__\\ | ||
+ | <code>ffplay "le_chemin_du_fichier_que_je_veux_lire.wav" (ou .aac, etc.;l'extension du fichier à lire)</code> | ||
+ | |||
+ | //NB les guillemets sont importants car ils vous éviteront une erreur si le chemin a des espaces ou des caractères spéciaux// | ||
+ | |||
+ | Pour arrêter la lecture appuyer sur "Echap" ou "q"\\ | ||
+ | **IMPORTANT** Quitter proprement le terminal en tapant //exit// une fois pour terminer le processus son, et une autre fois pour fermer le terminal\\ | ||
+ | \\ | ||
+ | |||
+ | **Utilisation pour lire plusieurs fichiers audio ou video CONTENUS __DANS UN SEUL ET MEME REPERTOIRE__**\\ | ||
+ | |||
+ | |||
+ | Tapez dans le terminal ce qui suit et appuyez sur la touche "Entrée" du clavier\\ | ||
+ | |||
+ | <code>cd /le_chemin_de_votre_repertoire_contenant_les_fichiers_a_lire</code> | ||
+ | puis\\ | ||
+ | <code>for f in *.wav ; do ffplay -hide_banner -nodisp -autoexit "$f"; done</code> | ||
+ | |||
+ | // si vous lisez une video supprimez dans la commande ci-dessus l'option -nodisp qui indique de ne pas afficher la fenêtre du graph audio//\\ | ||
+ | //-hide_banner bloque l'affichage des infos sur ffmpeg//\\ | ||
+ | //-autoexit ferme ffplay quand le fichier est lu//\\ | ||
+ | //(.wav à remplacer par votre format .flac .ogg .mp3 .mp4 .m4a .aac .opus .mkv .webm etc.)// | ||
+ | |||
+ | Ctrl + C pour passer au morceau suivant\\ | ||
+ | Ctrl + Z pour arrêter\\ | ||
+ | **IMPORTANT** Quitter proprement le terminal en tapant //exit// une fois pour terminer le processus son, et une autre fois pour fermer le terminal\\ | ||
+ | \\ | ||
+ | |||
+ | **Utilisation pour lire TOUT LE CONTENU D'UN RÉPERTOIRE contenant PLUSIEURS DOSSIERS avec des fichiers audio** | ||
+ | |||
+ | <code>find /chemin_du_repertoire/ma_musique/ -type f > filelist.txt && while [ 1 ]; do SDL_AUDIODRIVER=alsa AUDIODEV=hw:2,0 ffplay -hide_banner -nodisp -autoexit "`shuf -n 1 filelist.txt`"; done</code>\\ | ||
+ | NB //SDL_AUDIODRIVER=alsa AUDIODEV=hw:2,0// sert à contourner le mixeur du PC pour envoyer cela directement sur la sortie USB, ici hw:2,0; trouvez la vôtre avec la commande\\ | ||
+ | <code>cat /proc/asound/cards</code> | ||
+ | Ctrl + C pour passer au morceau suivant\\ | ||
+ | Ctrl + Z pour arrêter\\ | ||
+ | **IMPORTANT** Quitter proprement le terminal en tapant //exit// une fois pour terminer le processus son, et une autre fois pour fermer le terminal\\ | ||
+ | |||
+ | J'invite les pros de ffmpeg à ajouter une rubrique à la fin de cette page pour les commandes détaillées de ffplay en ce qui concerne les fichiers videos et la sélection directe des langues et sous-titres ainsi que l'augmentation du format pour supprimer les bandes noires et utiliser tout l'écran.\\ | ||
==== Commencer sur une bonne base ==== | ==== Commencer sur une bonne base ==== | ||
Ligne 343: | Ligne 400: | ||
<code>-aspect aspect</code> | <code>-aspect aspect</code> | ||
Aspect étant 4:3, 16:9 ou 1.3333, 1.7777. Vous pouvez faire des aspects spéciaux si vous le voulez. | Aspect étant 4:3, 16:9 ou 1.3333, 1.7777. Vous pouvez faire des aspects spéciaux si vous le voulez. | ||
+ | |||
+ | === Stabiliser la vidéo === | ||
+ | |||
+ | Pour réduire en post-production les tremblements de la caméra lors de la prise de vue. | ||
+ | |||
+ | Prérequis : la bibliothèque vidstab doit être intégrée à la configuration de ffmpeg. | ||
+ | |||
+ | Pour le vérifier : | ||
+ | <code>$ ffmpeg | ||
+ | ffmpeg version n7.0.1 Copyright (c) 2000-2024 the FFmpeg developers | ||
+ | built with gcc 14.1.1 (GCC) 20240522 | ||
+ | configuration: | ||
+ | ... --enable-libvidstab ... | ||
+ | </code> | ||
+ | |||
+ | ffmpeg effectue la stabilisation d'une vidéo en deux passes : | ||
+ | - une passe d'analyse de la vidéo qui produit un fichier nommé //transforms.trf// | ||
+ | - une passe de traitement qui exploite ce fichier et produit la vidéo stabilisée. | ||
+ | |||
+ | La [[https://github.com/georgmartius/vid.stab|bibliothèque vidstab]] utilise de nombreux paramètres pour analyser les tremblements. | ||
+ | Dans une approche simplissime, on peut se reposer sur les valeurs par défaut de ceux-ci. | ||
+ | |||
+ | Supposons que la vidéo à stabiliser se nomme //inputFile// et qu'on souhaite encoder la version stabilisée avec le codec vidéo x264 et une qualité crf=20 et l'audio avec le codec aac avec une bande passante de 192 kbit/s. | ||
+ | On saisira les deux lignes ci-dessous : | ||
+ | |||
+ | <code> | ||
+ | ffmpeg -i inputFile -vf vidstabdetect -f null transforms.trf | ||
+ | ffmpeg -i inputFile -vf vidstabtransform=:input=transforms.trf -c:v libx264 -crf 20 -c:a aac -ab 192k output.mp4 | ||
+ | </code> | ||
+ | |||
+ | Si le résultat de la stabilisation ne paraît pas suffisant mais si on ne souhaite pas se confronter à la complexité du traitement, on peut se limiter à jouer sur le seul paramètre de lissage (//smoothing//) qui peut montrer une bonne efficacité. | ||
+ | Sa valeur par défaut est 10. On peut tenter de l'augmenter sensiblement et visualiser l'effet. | ||
+ | |||
+ | Ainsi pour lui donner une valeur de 40, par exemple, on saisira les lignes suivantes (première ligne inchangée donc optionnelle si elle a déjà été exécutée) : | ||
+ | <code> | ||
+ | ffmpeg -i inputFile -vf vidstabdetect -f null transforms.trf | ||
+ | ffmpeg -i inputFile -vf vidstabtransform=smoothing=40:input=transforms.trf -c:v libx264 -crf 20 -c:a aac -ab 192k output.mp4 | ||
+ | </code> | ||
+ | |||
+ | À noter que le processus de stabilisation applique une certaine valeur de zoom à l'image pour pouvoir la décaler sans faire apparaître de bordures noires. | ||
+ | <note>Si on ne souhaite pas de ré-encodage de l'audio : remplacer <code>"-c:a aac -ab 192k" par "-c:a copy"</code></note> | ||
==== Faire des essais de conversion avec FFmpeg sur une portion de fichier ==== | ==== Faire des essais de conversion avec FFmpeg sur une portion de fichier ==== | ||
Ligne 518: | Ligne 616: | ||
==== Pour créer une vidéo à partir de photos ==== | ==== Pour créer une vidéo à partir de photos ==== | ||
- | À partir des images //img001.png, img002.png, img003.png//: | + | À partir des images //img001.png, img002.png, img003.png//:\\ |
+ | FIXME (le code ci-dessous ne fonctionne pas sous [[:Jammy]] | ||
<code> | <code> | ||
ffmpeg -framerate 24 -i img%03d.png output.mp4 | ffmpeg -framerate 24 -i img%03d.png output.mp4 | ||
</code> | </code> | ||
- | [[https://trac.ffmpeg.org/wiki/Slideshow|Explication pour créer une vidéo à partir de photo (animation) (en)]] | + | [[https://trac.ffmpeg.org/wiki/Slideshow|Explication pour créer une vidéo à partir de photo (animation) (en)]]\\ |
+ | Alternative ((src (en) : https://stackoverflow.com/a/37478183/6614155)) : | ||
+ | <code bash> | ||
+ | ffmpeg -framerate 1 -pattern_type glob -i 'img*.png' -c:v libx264 -pix_fmt yuv420p output.mp4 | ||
+ | </code> | ||
+ | <note important>le //framerate// est le nombre d'images pas seconde en entrée (ips)… si vous avez 24 images et définissez 24… vous n'aurez qu'une seconde de vidéo et n'aurez pas le temps de voir les images si elles sont très différentes. Pour 10 secondes de vidéo à 24 ips, il faut donc 240 images ! Il est possible d'avoir un //framerate// sur les images fournies en entrée et un //fps// en sortie différent, ffmpeg laissera la même image plusieurs fois ou au contraire en enlèvera ((https://trac.ffmpeg.org/wiki/Slideshow#Framerates))</note> | ||
==== Découper une vidéo ==== | ==== Découper une vidéo ==== | ||
Ligne 594: | Ligne 698: | ||
Pour les méta-données, on peut aussi utiliser [[:exiftool]] | Pour les méta-données, on peut aussi utiliser [[:exiftool]] | ||
+ | ==== Ajouter une piste son ainsi que des sous-titres ==== | ||
+ | Dans cet exemple : | ||
+ | * on va ajouter une deuxième piste son (française) au fichier video.mp4 qui en possède déjà une (anglaise) | ||
+ | * on va ajouter des sous-titres dans chacune des deux langues | ||
+ | * on va ajouter une image de couverture image.jpg | ||
+ | * on va mettre à jour des métadonnées | ||
+ | <code bash>ffmpeg -i video.mp4 -i son_francais.aac -i st_ang.srt -i st_fr.srt -i image.jpg -map 0 -map 1 -map 2 -map 3 -map 4 -c copy -metadata comment="Paris brûle-t-il (1966) doublé 1080p x265" -metadata:s:a:0 title="Anglais (English)" -metadata:s:a:0 language=eng -metadata:s:a:1 title="Français (French)" -metadata:s:a:1 language=fra -metadata:s:v:0 title="Vidéo" -c:s mov_text -metadata:s:s:0 language=eng -metadata:s:s:1 language=fra output.mp4 | ||
+ | </code> | ||
+ | <note tip> * -map 0 -map 1 -map 2 -map 3 -map 5 : applique le traitement aux 5 fichiers d'entrée définis avec -i | ||
+ | * -c copy : copie sans réencoder | ||
+ | * -metadata comment="Ceci est un commentaire 1080p x265" : modifie la métadonnée commentaire du fichier | ||
+ | * -metadata title="Le titre de la vidéo" : modifie la métadonnée titre du fichier (en général s'affiche au lancement) | ||
+ | * -metadata:s:a:0 title="Anglais (English)" : titre du premier flux (stream) audio (au cas d'espèces déjà dans le fichier) | ||
+ | * -metadata:s:a:0 language=eng : langue du premier flux audio (anglais) | ||
+ | * -metadata:s:a:1 title="Français (French)" : titre du deuxième flux audio (son_francais.aac) | ||
+ | * -metadata:s:a:1 language=fra : langue du deuxième flux audio (français) | ||
+ | * -metadata:s:v:0 title="Vidéo" : titre du premier flux vidéo | ||
+ | * -c:s mov_text : convertit les fichiers srt en sous-titres mov_text pour mp4 | ||
+ | * -metadata:s:s:0 language=eng : métadonnée langue (anglais) du premier fichier de sous-titres (st_ang.srt) | ||
+ | * -metadata:s:s:1 language=fra : métadonnée langue (français) du deuxième fichier de sous-titres (st_fr.srt) | ||
+ | * output.mp4 : fichier de sortie | ||
+ | </note> | ||
==== Pour consulter le manuel de FFmpeg ==== | ==== Pour consulter le manuel de FFmpeg ==== | ||