NOTE DE L'AUTEUR
Je n'utilise plus ce projet ni ne lui apporte aucun support, si vous souhaitez le maintenir, envoyez-moi un ping ici : [email protected].
Ce projet a été créé il y a 4 ans, il existe peut-être de meilleures façons de transformer une vidéo en GIF maintenant, utilisez Google !
/NOTE DE L'AUTEUR
Convertissez n'importe quel fichier vidéo en un GIF animé optimisé. Soit sur toute sa longueur, soit seulement sur une partie.
Ce screencast a été enregistré avec lolilolicon/FFcast puis converti en GIF avec :
gifify screencast.mkv -o screencast.gif --resize 800:-1
stdin
et stdout
Avant d'utiliser gifify, veuillez installer :
$ brew install node
)$ brew install ffmpeg
)$ brew install imagemagick
)$ brew install giflossy
)Vous pouvez également utiliser l'image Docker gifify fournie avec tout ce qui est installé.
npm install -g gifify
> gifify -h
Usage: gifify [options] [file]
Options:
-h, --help output usage information
-V, --version output the version number
--colors < n > Number of colors, up to 255, defaults to 80
--compress < n > Compression (quality) level, from 0 (no compression) to 100, defaults to 40
--from < position > Start position, hh:mm:ss or seconds, defaults to 0
--fps < n > Frames Per Second, defaults to 10
-o, --output < file > Output file, defaults to stdout
--resize < W:H > Resize output, use -1 when specifying only width or height. ` 350:100 ` , ` 400:-1 ` , ` -1:200 `
--reverse Reverses movie
--speed < n > Movie speed, defaults to 1
--subtitles < filepath > Subtitle filepath to burn to the GIF
--text < string > Add some text at the bottom of the movie
--to < position > End position, hh:mm:ss or seconds, defaults to end of movie
--no-loop Will show every frame once without looping
Voir l'exemple.
var fs = require ( 'fs' ) ;
var gifify = require ( 'gifify' ) ;
var path = require ( 'path' ) ;
var input = path . join ( __dirname , 'movie.mp4' ) ;
var output = path . join ( __dirname , 'movie.gif' ) ;
var gif = fs . createWriteStream ( output ) ;
var options = {
resize : '200:-1' ,
from : 30 ,
to : 35
} ;
gifify ( input , options ) . pipe ( gif ) ;
Vous pouvez également transmettre un flux lisible à gifify(stream, opts)
.
Gifify prend en charge les flux à la fois sur la ligne de commande ( cat movie.mp4 | gifify -o out.gif
) et dans l'API de programmation ( gifify(readableStream, opts).pipe(writableStream)
).
Bien que ce soit très utile dans certains cas, si vous avez déjà le fichier sur le disque, vous feriez mieux de le faire gifify movie.mp4 -o out.gif
ou gifify(filePath, opts).pipe(writableStream)
.
Pourquoi? Parce que transférer 3,4 Go lorsque vous souhaitez passer de 40:20 à 40:22 prend toujours beaucoup de temps et ne vous apporte aucun avantage en termes de performances.
FFmpeg doit lire à partir de 0 Go -> $START_BYTE_40:20 et le rejette. Mais tout coule dans votre mémoire.
Lors de l'utilisation de la saisie directe de fichier depuis la ligne de commande, nous transmettons l'option -i filename
à FFmpeg et c'est ensuite super rapide !
Soyez prudent lors de |piping
.
Vous pouvez graver du texte simple dans votre GIF :
gifify back.mp4 -o back.gif --from 01:48:23.200 --to 01:48:25.300 --text " What?..What?What? "
Résultat:
Vous pouvez graver des sous-titres dans votre GIF, c'est aussi simple que cela :
gifify 22.mkv -o movie.gif --subtitles 22.ass --from 1995 --to 2002 --resize 600:-1
Vous devez créer de nouveaux fichiers de sous-titres, les timecodes du film complet ne fonctionneront pas pendant un GIF de cinq secondes.
Créez des sous-titres en utilisant aegisub et augmentez la taille de la police pour un superbe effet !
Voici le 22.ass
de la commande précédente, créée avec aegisub :
[Script Info]
; Script generated by Aegisub 3.2.1
; http://www.aegisub.org/
Title: Default Aegisub file
ScriptType: v4.00+
WrapStyle: 0
ScaledBorderAndShadow: yes
YCbCr Matrix: None
[Aegisub Project Garbage]
[V4+ Styles]
Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding
Style: Default,Arial,20,&H00FFFFFF,&H000000FF,&H00000000,&H00000000,0,0,0,0,100,100,0,0,1,2,2,2,10,10,10,1
[Events]
Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
Dialogue: 0,0:00:02.50,0:00:03.97,Default,,0,0,0,,{fnLiberation Sansfs40}Okay, okay.
Dialogue: 0,0:00:05.00,0:00:06.90,Default,,0,0,0,,{fnLiberation Sansfs40}Okay. Okay.
Résultat de l'extraction d'un GIF de 22 Jump Street :
On modern hardware GIF is the slowest and most expensive video codec. Can we please allow it to be obsoleted?
https://pornel.net/efficient-gifs#sec44
YOLO!
Giflossy est un fork de gifsicle, l'auteur de gifsicle travaille actuellement sur l'intégration de la partie avec perte dans gifsicle.
Ainsi, dans peu de temps, nous pourrons utiliser directement les packages gifsicle et gifiscle.
jclem/gifify a été une grande source d'inspiration.