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 20/12/2021, 23:17] wiki-corrector-bot passage de http à https sur les liens externes (détecté et corrigé via le bot wiki-corrector (https://forum.ubuntu-fr.org/viewtopic.php?id=2067892) |
ffmpeg [Le 27/08/2024, 16:29] (Version actuelle) ouvradou [Transformer la vidéo] |
||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
- | |||
{{tag>Focal audio vidéo encodage montage_vidéo capture_vidéo multimédia}} | {{tag>Focal audio vidéo encodage montage_vidéo capture_vidéo multimédia}} | ||
Ligne 31: | 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 317: | Ligne 373: | ||
- | | qqvga | qvga | vga | svga | wvga | | + | | qqvga | qvga | vga | svga | wvga | |
- | | 160x120 | 320x240 | 640x480 | 800x600 | 852x480 | | + | | 160x120 | 320x240 | 640x480 | 800x600 | 852x480 | |
| xga | uxga | sxga | wxga | wsxga | wuxga | qxga | woxga | qsxga | wqsxga | wquxga | | | xga | uxga | sxga | wxga | wsxga | wuxga | qxga | woxga | qsxga | wqsxga | wquxga | | ||
Ligne 344: | 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 358: | Ligne 455: | ||
==== Exemples de conversions ==== | ==== Exemples de conversions ==== | ||
- | === Convertir un fichier video pour les réseaux sociaux et messageries (Signal, WhatsApp, Viber, ...) === | + | === Convertir un fichier video pour faciliter le partage sur les clouds, réseaux sociaux et messageries === |
Cette conversion est utile pour réduire de façon drastique la taille des fichiers en conservant une qualité suffisante pour le regarder sur un téléphone. | Cette conversion est utile pour réduire de façon drastique la taille des fichiers en conservant une qualité suffisante pour le regarder sur un téléphone. | ||
<code>ffmpeg -i FichierSource.MOV -vcodec libx264 FichierResultat.mp4</code> | <code>ffmpeg -i FichierSource.MOV -vcodec libx264 FichierResultat.mp4</code> | ||
- | Si la source est en HD, vous pouvez réduire un peu la définition pour réduire de façon importante la taille du fichier : | + | Si la source est en HD, vous pouvez réduire la définition pour réduire de façon importante la taille du fichier : |
<code>ffmpeg -i FichierSourceHD.MOV -s wvga -vcodec libx264 FichierResultat.mp4</code> | <code>ffmpeg -i FichierSourceHD.MOV -s wvga -vcodec libx264 FichierResultat.mp4</code> | ||
+ | (on peut remplacer //wvga// par //hd720//, cf. [[wpfr>Format_d'affichage_vidéo]]… ou définir la taille//x//×//y//, mais attention de respecter le ratio | ||
=== Convertir une vidéo en WebM (VP8+Vorbis) en deux passes === | === Convertir une vidéo en WebM (VP8+Vorbis) en deux passes === | ||
Ligne 414: | Ligne 512: | ||
Ce script permet d'automatiser la conversion de vidéos de plusieurs formats ( Mpeg4, Avi, Flv etc... ) vers le format MP3. | Ce script permet d'automatiser la conversion de vidéos de plusieurs formats ( Mpeg4, Avi, Flv etc... ) vers le format MP3. | ||
- | Plusieurs formats de vidéos peuvent se trouver dans le même dossier au moment de la conversion. | + | Plusieurs formats de vidéos peuvent se trouver dans le même dossier au moment de la conversion. |
<file bash videos_to_mp3_converter.sh> | <file bash videos_to_mp3_converter.sh> | ||
#!/bin/bash | #!/bin/bash | ||
Ligne 497: | Ligne 595: | ||
<code>ffmpeg -f alsa -ac 2 -i pulse -f x11grab -r 25 -s 1024x768 -i :0.0 -acodec flac -vcodec libx264 -preset ultrafast -qn 0 output.mkv | <code>ffmpeg -f alsa -ac 2 -i pulse -f x11grab -r 25 -s 1024x768 -i :0.0 -acodec flac -vcodec libx264 -preset ultrafast -qn 0 output.mkv | ||
</code> | </code> | ||
+ | |||
+ | **NB1** vous pouvez changer flac par aac ou ac3 ou mp3 etc. Testez car selon votre PC cela joue sur la qualité et fluidité globales lors de la restitution. | ||
+ | |||
+ | **NB2** pour la même raison que NB1 vous pouvez aussi changer l'extension .mkv du fichier en .mp4 .avi etc.. Une fois de plus, testez et voyez. | ||
+ | |||
+ | **PROBLEME DE CAPTURE ECRAN SANS L'AUDIO** | ||
+ | |||
+ | Dans le terminal lancez la commande alsamixer | ||
+ | |||
+ | Appuyez sur F6 et choisissez default (normalement c'est la première ligne) | ||
+ | |||
+ | Si vous utilisez une carte son, après avoir fait F6 choisissez là afin de vérifier-ajuster le volume à son maximum. | ||
+ | Ensuite esc et retapez dans le terminal alsamixer puis F6 pour choisir la valeur default puis esc | ||
+ | |||
+ | Ensuite toujours dans le terminal tapez pavucontrol | ||
+ | Vérifiez que vous avez bien choisi la source de sortie que vous utilisez habituellement, déconnectez toutes les autres, micro inclus puis allez à l'onglet gestion des entrée. Vérifiez qu'il affiche un élément actif pour la source d'entrée retenue avec le volume à 100. Si non, activez le en cliquant sur l'icone d'un haut-parleur (en haut à droite juste au-dessus de la ligne concernée) et ajustez si besoin le volume à 100. | ||
+ | |||
+ | ENFIN, redémarrez votre PC car j'ai relevé que sur certains PC tout devenait fonctionnel après un redémarrage (???). Ne me demandez pas pourquoi je ne suis pas un expert hardware-software bas/moyen-niveau donc je n'aurai aucune réponse à vous donner. | ||
+ | |||
==== 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 521: | Ligne 644: | ||
</code> | </code> | ||
</note> | </note> | ||
+ | <note tip>L'utilisation de -c:v copy et -c:a copy permet une découpe très rapide car il n'y a pas de ré-encodage du fichier. Cependant la découpe est moins précise car calée sur l'image clé la plus proche de la borne de temps définie par l'utilisateur. L'utilisation de la syntaxe suivante permet une découpe plus précise mais prend davantage de temps car il y a ré-encodage de la séquence extraite : | ||
+ | <code> | ||
+ | ffmpeg -ss 00:18:00.00 -t 00:12:18.25 -i fichieradecouper.mp4 fichierdecoupe.mp4 | ||
+ | </code></note> | ||
==== Pivoter une vidéo ==== | ==== Pivoter une vidéo ==== | ||
Ligne 571: | 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 ==== | ||