video2gif: converta videoclipes em GIFs animados
Publicado por Douglas Augusto 05/11/2007
[ Hits: 7.846 ]
Com o video2gif é possível converter um trecho de vídeo em GIF animado. Sua interface é bem simples, cabe ao usuário indicar apenas o vídeo de origem (basta ser reconhecido pelo ffmpeg), o tempo inicial e a duração desejada do clipe.
Além disso, o script possui algumas opções interessantes, como tamanho máximo e dimensões do GIF, velocidade, taxa de quadros e número de cores.
Versão de 30/10/2007.
#!/bin/sh # video2gif - Convert a video clip into an animated GIF # # Copyright (C) 2007 Douglas A. Augusto (daaugusto@gmail.com) # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see <http://www.gnu.org/licenses/>. VERSION="20071030" usage() { SCRIPT_NAME=`basename $0` echo "video2gif - Convert a video clip into an animated GIF (v. $VERSION)" echo "" echo "Usage: $SCRIPT_NAME -t <secs> filename [-o <file> -s <hh:mm:ss>" echo " -kb <size> -fps <n> -size <WxH> -c <n> -speed <f> -d -h]" echo echo "where:" echo echo " -t <n>" echo " clip duration in seconds (n>0)" echo " -s hh:mm:ss[.xxx]" echo " start time (default = 00:00:00)" echo " -kb <n>" echo " maximum kilobytes allowed (n>0; default = unlimited)" echo " -fps <n>" echo " frame rate (1<=n<=30; default = 30, may be adjusted to satisfy the maximum size)" echo " -size <WxH>" echo " width and height of output (imagemagick syntax; default height=120px, width=auto)" echo " -o <filename>" echo " output file (default = anim.gif)" echo " -c <n>" echo " restrict GIF colors to maximum n colors (n>=2)" echo " -speed <f>" echo " speed factor (0.1<=f<=10; default = 1.0)" echo " -d" echo " debug (don't delete the log file)" echo " -h" echo " this help" echo echo "Example: $SCRIPT_NAME -t 10 -s 00:05:25 -kb 1000 video.avi -o video.gif" echo "" echo "This is free software. You may redistribute copies of it under the terms" echo "of the GNU General Public License <http://www.gnu.org/licenses/gpl.html>." echo "There is NO WARRANTY, to the extent permitted by law." echo "" echo "Written by Douglas Adriano Augusto (daaugusto)." exit 1 } # ---------------------------------------------------------------------- # Check dependencies DEP="ffmpeg mplayer mogrify gifsicle calc du cut" for d in $DEP; do if ! type $d >> /dev/null 2>&1; then echo "Error: $d is required!"; echo -e "\nvideo2gif's dependencies:" echo "" echo "ffmpeg - http://ffmpeg.mplayerhq.hu" echo "mplayer - http://www.mplayerhq.hu" echo "mogrify - http://www.imagemagick.org" echo "calc - http://www.isthe.com/chongo/tech/comp/calc/index.html" echo "gifsicle - http://www.lcdf.org/gifsicle" echo "coreutils - http://www.gnu.org/software/coreutils" exit 1; fi done # ---------------------------------------------------------------------- CURDIR=`pwd` TMPDIR="/tmp/v2g-$$" LOG="$TMPDIR/video2gif.log" mkdir -p $TMPDIR; # Print the command-line into LOG file (echo "$*"; echo) >> $LOG # ---------------------------------------------------------------------- RESIZE="x120" # pixels FPS=30 # first try START="00:00:00" DURATION="" MAXSIZE=0 OUTPUT="anim.gif" FILE="" COLORS="" COLORS_CMD="" SPEED=1.0; DEBUG="" # ---------------------------------------------------------------------- while [ $# -ge 1 ]; do case $1 in -s) shift; START="$1";; -t) shift; DURATION="$1";; -kb) shift; MAXSIZE="$1";; -fps) shift; FPS="$1";; -size) shift; RESIZE="$1";; -o) shift; OUTPUT="$1";; -c) shift; COLORS="$1";; -speed) shift; SPEED="$1";; -d) DEBUG="1";; -h) usage;; *) FILE="$1";; esac shift done # ---------------------------------------------------------------------- # check input args if [ -z "$DURATION" ]; then echo "Error: missing '-t'." usage fi if [ -z "$OUTPUT" ]; then echo "Error: -o is invalid." usage fi if [ ! -e "$FILE" ]; then echo "Error: a valid source video (filename) is required." usage fi if [ `echo "$SPEED < 0.1 || $SPEED > 10.0" | calc -p` -eq 1 ]; then echo "Error: option '-speed' is out of range." usage fi if [ `echo "$FPS < 1 || $FPS > 30.0" | calc -p` -eq 1 ]; then echo "Error: option '-fps' is out of range." usage fi if [ -n "$COLORS" ]; then if [ `echo "$COLORS < 2" | calc -p` -eq 1 ]; then echo "Error: option '-colors' is out of range." usage else COLORS_CMD="--colors $COLORS" fi fi if [ `echo "$MAXSIZE < 0" | calc -p` -eq 1 ]; then echo "Error: option '-kb' is out of range." usage fi # ---------------------------------------------------------------------- echo "video2gif - Convert a video clip into an animated GIF (v. $VERSION)" echo "" echo "> Log file: $LOG" SIZE=0 echo; echo "> Trying with FPS=$FPS..."; while true; do rm -f $TMPDIR/[0-9]*.png $TMPDIR/[0-9]*.gif $TMPDIR/*.avi # ---------------------------------------------------------------------- # mplayer -ss is inaccurate CMD_FFMPEG="ffmpeg -y -b 2000k -an -ss $START -t $DURATION -i $FILE -r $FPS $TMPDIR/ffmpeg.avi >> $LOG 2>&1" echo $CMD_FFMPEG >> $LOG echo; echo "Running ffmpeg..."; if ! eval $CMD_FFMPEG; then echo "An error occurred in ffmpeg, aborting..."; exit 1; fi # ---------------------------------------------------------------------- CMD_MPLAYER="mplayer -nosound -vf hqdn3d,pp=lb/ha:128:7/va/dr ffmpeg.avi -vo png:z=1 >> $LOG 2>&1" echo $CMD_MPLAYER >> $LOG cd $TMPDIR echo; echo "Running mplayer..."; if ! eval $CMD_MPLAYER; then echo "An error occurred in mplayer, aborting..."; exit 1; fi cd $CURDIR # ---------------------------------------------------------------------- CMD_MOGRIFY="mogrify -resize $RESIZE -format gif $TMPDIR/[0-9]*.png >> $LOG 2>&1" echo $CMD_MOGRIFY >> $LOG echo; echo "Running mogrify..."; if ! eval $CMD_MOGRIFY; then echo "An error occurred in mogrify, aborting..."; exit 1; fi # ---------------------------------------------------------------------- CMD_GIFSICLE="gifsicle --loop=forever $COLORS_CMD -O2 -d $(echo "round((100/$FPS)/$SPEED)"|calc -p) $TMPDIR/[0-9]*.gif -o $OUTPUT >> $LOG 2>&1" echo $CMD_GIFSICLE >> $LOG echo; echo "Running gifsicle..."; if ! eval $CMD_GIFSICLE; then echo "An error occurred in gifsicle, aborting..."; exit 1; fi # ---------------------------------------------------------------------- rm -f $TMPDIR/[0-9]*.png $TMPDIR/[0-9]*.gif $TMPDIR/*.avi # ---------------------------------------------------------------------- # check the final size (in KB) SIZE=$(echo "round(`du -b $OUTPUT | cut -f 1`/1024)"|calc -p) if [ $MAXSIZE -eq 0 -o $SIZE -le $MAXSIZE -o $FPS -eq 1 ]; then # delete only if DEBUG mode isn't enabled if [ -z "$DEBUG" ]; then rm -f $LOG; rmdir $TMPDIR; fi echo; echo "Done! Saved GIF as $OUTPUT (FPS=$FPS, final size=${SIZE}KB)" exit 0; else # calculating the next FPS guess FPS=`echo "floor($FPS * $MAXSIZE/$SIZE)"|calc -p` if [ $FPS -lt 1 ]; then FPS=1; fi fi echo; echo "> Trying with FPS=$FPS... (last size was ${SIZE}KB)"; done
Script para balanceamento de link's de internet
Instalar última versão do Java automaticamente em "todas as plataformas"
Tradução de endereços de uma rede interna
Melhorando o tempo de boot do Fedora e outras distribuições
Como instalar as extensões Dash To Dock e Hide Top Bar no Gnome 45/46
E a guerra contra bots continua
Tradução do artigo do filósofo Gottfried Wilhelm Leibniz sobre o sistema binário
Conheça o firewall OpenGFW, uma implementação do (Great Firewall of China).
Instalando o FreeOffice no LMDE 6
Anki: Remover Tags de Estilo HTML de Todas as Cartas
Colocando uma opção de redimensionamento de imagem no menu de contexto do KDE
Terminal não funciona [RESOLVIDO] (8)
material de assembly x64 [RESOLVIDO] (4)
Problema com alias usando locate (6)
Como adicionar módulo de saúde da bateria dos notebooks Acer ao kernel... (20)
Alguém pode me ajudar porfavor como executar comandos ao iniciar no i3... (1)
[Shell Script] Script para desinstalar pacotes desnecessários no OpenSuse
[Shell Script] Script para criar certificados de forma automatizada no OpenVpn
[Shell Script] Conversor de vídeo com opção de legenda
[C/C++] BRT - Bulk Renaming Tool
[Shell Script] Criação de Usuarios , Grupo e instalação do servidor de arquivos samba