@ECHO OFF :: By: MDHEXT, Nabi KaramAliZadeh :: Description: Video to GIF/APNG/WEBP converter :: Version: 5.5 :: Url: https://github.com/MDHEXT/video2gif, forked from https://github.com/NabiKAZ/video2gif :: What this script is based on: http://blog.pkh.me/p/21-high-quality-gif-with-ffmpeg.html :: License: GNU General Public License v3.0 (GPLv3) :: Enable delayed variable expension SETLOCAL ENABLEDELAYEDEXPANSION :: Storing Paths SET input="%~1" SET vid="%~dpnx1" SET output=%~dpn1 SET FILEPATH=%~dp1 :: Setting the path to the Working Directory SET WD=%TEMP%\VID2ANI :: Clearing all variables SET "filetype=" SET "scale=" SET "fps=" SET "mode=" SET "dither=" SET "bayerscale=" SET "start_time=" SET "end_time=" SET "webp_lossy=" SET "colormax=" SET "version=" SET "build=" SET "loglevel=" GOTO :varin :varin :: Checking for blank input or help commands IF %input% == "" GOTO :help_message IF %input% == "-?" GOTO :help_message IF %input% == "/?" GOTO :help_message IF %input% == "help" GOTO :help_message IF %input% == "--help" GOTO :help_message :: Using SHIFT command to go through the input and storing each setting into its own variable IF NOT "%~1" =="" ( IF "%~1" =="-r" SET "scale=%~2" & SHIFT IF "%~1" =="-f" SET "fps=%~2" & SHIFT IF "%~1" =="-m" SET "mode=%~2" & SHIFT IF "%~1" =="-d" SET "dither=%~2" & SHIFT IF "%~1" =="-b" SET "bayerscale=%~2" & SHIFT IF "%~1" =="-t" SET "filetype=%~2" & SHIFT IF "%~1" =="-o" SET "output=%~dpnx2" & SHIFT IF "%~1" =="-s" SET "start_time=%~2" & SHIFT IF "%~1" =="-e" SET "end_time=%~2" & SHIFT IF "%~1" =="-c" SET "colormax=%~2" & SHIFT IF "%~1" =="-l" SET "webp_lossy=%~2" & SHIFT IF "%~1" =="-v" SET "loglevel=%~2" & SHIFT IF "%~1" =="-k" SET "errorswitch=0" IF "%~1" =="-p" SET "picswitch=0" SHIFT & GOTO :varin ) GOTO :help_check_2 :help_check_2 :: Noob proofing the script to prevent it from breaking should critical settings not be defined IF NOT DEFINED filetype SET "filetype=gif" IF NOT DEFINED scale SET "scale=-1" IF NOT DEFINED loglevel SET "loglevel=error" IF NOT DEFINED fps SET fps=15 IF NOT DEFINED mode SET mode=1 IF NOT DEFINED dither SET dither=0 GOTO :safchek :safchek :: Setting a clear range of acceptable setting values and noob proofing bayerscale :: Output file type echo %filetype% | findstr /r "\ \ \ \" >nul IF %errorlevel% NEQ 0 ( ECHO Not a valid file type GOTO :EOF ) IF "%filetype%"=="png" SET filetype=apng IF "%filetype%"=="apng" SET output=%output%.png IF "%filetype%"=="webp" SET output=%output%.webp IF "%filetype%"=="gif" SET output=%output%.gif :: Palettegen IF %mode% GTR 3 ( ECHO Not a valid palettegen mode GOTO :EOF ) ELSE IF %mode% LSS 1 ( ECHO Not a valid palettegen mode GOTO :EOF ) :: Dithering IF %dither% GTR 8 ( ECHO Not a valid dither algorithm GOTO :EOF ) ELSE IF %dither% LSS 0 ( ECHO Not a valid dither algorithm GOTO :EOF ) :: Bayerscale IF DEFINED bayerscale ( IF !bayerscale! GTR 5 ( ECHO Not a valid bayerscale value GOTO :EOF ) ELSE IF !bayerscale! LSS 0 ( ECHO Not a valid bayerscale value GOTO :EOF ) IF !bayerscale! LEQ 5 ( IF %dither% NEQ 1 ( ECHO This setting only works with bayer dithering GOTO :EOF ) ) ) :: Lossy WEBP IF DEFINED webp_lossy ( IF NOT "%filetype%" == "webp" ( ECHO Lossy is only valid for filetype webp GOTO :EOF ) ELSE IF !webp_lossy! GTR 100 ( ECHO Not a valid lossy quality value GOTO :EOF ) ELSE IF !webp_lossy! LSS 0 ( ECHO Not a valid lossy quality value GOTO :EOF ) ) :: Noob Proofing clipping IF DEFINED start_time ( IF DEFINED end_time SET "trim=-ss !start_time! -to !end_time!" IF NOT DEFINED end_time ( ECHO Please input the end time GOTO :EOF ) ) IF NOT DEFINED start_time ( IF DEFINED end_time ( ECHO Please input the start time GOTO :EOF ) ) GOTO :script_start :script_start :: Storing FFmpeg version string FOR /F "delims=" %%a in ('ffmpeg -version') DO ( IF NOT DEFINED version ( SET "version=%%a" ) ELSE IF NOT DEFINED build ( SET "build=%%a" ) ) :: Displaying FFmpeg version string and creating the working directory ECHO %version% ECHO %build% ECHO Output file: %output% ECHO Creating working directory... MD "%WD%" :palettegen :: Putting together command to generate palette SET palette=%WD%\palette SET frames=%palette%_%%05d SET filters=fps=%fps%,scale=%scale%:-1:flags=lanczos :: Palettegen mode IF %mode% EQU 1 SET encode=palettegen=stats_mode=diff IF %mode% EQU 2 SET encode="palettegen=stats_mode=single" IF %mode% EQU 3 SET encode=palettegen :: Max colors IF DEFINED colormax ( IF %mode% LEQ 2 SET "mcol=:max_colors=%colormax%" IF %mode% EQU 3 SET "mcol==max_colors=%colormax%" ) :: Executing command to generate palette ECHO Generating palette... ffmpeg -v %loglevel% %trim% -i %vid% -vf "%filters%,%encode%%mcol%" -y "%frames%.png" :: Checking if the palette file is in the Working Directory, if not cleaning up IF NOT EXIST "%palette%_00001.png" ( IF NOT EXIST "%palette%.png" ( ECHO Failed to generate palette file GOTO :cleanup ) ) :: Setting variables to put the encode command together :: Checking for Error Diffusion if using Bayer Scale and adjusting the command accordingly IF %mode% EQU 1 SET decode=paletteuse IF %mode% EQU 2 SET "decode=paletteuse=new=1" IF %mode% EQU 3 SET decode=paletteuse :: Error diffusion IF DEFINED errorswitch ( IF %mode% EQU 1 SET "errordiff==diff_mode=rectangle" IF %mode% EQU 2 SET "errordiff=:diff_mode=rectangle" IF %mode% EQU 3 SET "errordiff==diff_mode=rectangle" ) :: WEBP pixel format and lossy quality IF "%filetype%" == "webp" ( IF DEFINED webp_lossy ( SET "webp_lossy=-lossless 0 -pix_fmt yuv420p -quality %webp_lossy%" ) ELSE SET "webp_lossy=-lossless 1" ) :: Dither algorithm IF %dither% EQU 0 SET ditheralg=none IF %dither% EQU 1 SET ditheralg=bayer IF %dither% EQU 2 SET ditheralg=heckbert IF %dither% EQU 3 SET ditheralg=floyd_steinberg IF %dither% EQU 4 SET ditheralg=sierra2 IF %dither% EQU 5 SET ditheralg=sierra2_4a IF %dither% EQU 6 SET ditheralg=sierra3 IF %dither% EQU 7 SET ditheralg=burkes IF %dither% EQU 8 SET ditheralg=atkinson IF NOT %mode% EQU 2 ( IF DEFINED errorswitch SET ditherenc=:dither=!ditheralg! IF NOT DEFINED errorswitch SET ditherenc==dither=!ditheralg! ) ELSE SET ditherenc=:dither=!ditheralg! :: Checking for Bayer Scale and adjusting command IF NOT DEFINED bayerscale SET "bayer=" IF DEFINED bayerscale SET bayer=:bayer_scale=%bayerscale% :: Executing the encoding command ECHO Encoding animation... ffmpeg -v %loglevel% %trim% -i %vid% -thread_queue_size 512 -i "%frames%.png" -lavfi "%filters% [x]; [x][1:v] %decode%%errordiff%%ditherenc%%bayer%" -f %filetype% %webp_lossy% -loop 0 -plays 0 -y "%output%" :: Checking if file was created and cleaning up if not IF NOT EXIST "%output%" ( ECHO Failed to generate animation GOTO :cleanup ) :: Starting default Photo Viewer IF DEFINED picswitch START "" "%output%" :cleanup :: Cleaning up ECHO Deleting temporary files... RMDIR /S /Q "%WD%" ENDLOCAL ECHO Done! GOTO :EOF :help_message :: Print usage message ECHO: ECHO Video to GIF/APNG/WEBP converter v5.5 ECHO ^(C^) 2017-2022, MDHEXT ^&^ Nabi KaramAliZadeh ^ ECHO: ECHO You can download this fork from here: ECHO https://github.com/MDHEXT/video2gif ECHO You can download the original release here: ECHO https://github.com/NabiKAZ/video2gif ECHO This tool uses ffmpeg, you can download that here: ECHO https://www.ffmpeg.org/download.html#build-windows ECHO This tool wouldn't be possible without the research listed here: ECHO https://blog.pkh.me/p/21-high-quality-gif-with-ffmpeg.html ECHO: ECHO Usage: ECHO vid2ani [input_file] [Arguments] ECHO: ECHO Arguments: ECHO: ECHO -t Output file type. ECHO Valid: 'gif' (default), 'png', 'webp'. ECHO: ECHO -o Output file. ECHO The default is the same name as the input video. ECHO: ECHO -r Scale or size. ECHO Width of the animation in pixels. ECHO The default is the same scale as the original video. ECHO: ECHO -s Start time of the animation (HH:MM:SS.MS) ECHO: ECHO -e End time of the animation (HH:MM:SS.MS) ECHO: ECHO -f Framerate in frames per second. ECHO The default is 15. ECHO: ECHO -d Dithering algorithm to be used. ECHO The default is 0 (None). ECHO: ECHO -b Bayer Scale setting. ECHO This can only be used when Bayer dithering is applied. ECHO Range 0 - 5, default is 2. ECHO: ECHO -m Palettegen mode - one of 3 modes listed below. ECHO The default is 1 (diff). ECHO: ECHO -c The maximum amount of colors useable per palette. ECHO Range 3 - 256 (default) ECHO: ECHO -k Enables paletteuse error diffusion. ECHO: ECHO -l Enable lossy WebP compression and quality. ECHO The default for WebP is lossless. ECHO Range 0 - 100, default 75. ECHO: ECHO -v Set FFmpeg log level, for troubleshooting. ECHO The default log level is 'error' ECHO: ECHO -p Opens the resulting animation in your default Photo Viewer. ECHO: ECHO Dithering Modes: ECHO 0: None ECHO 1: Bayer ECHO 2: Heckbert ECHO 3: Floyd Steinberg ECHO 4: Sierra2 ECHO 5: Sierra2_4a ECHO 6: sierra3 ECHO 7: burkes ECHO 8: atkinson ECHO: ECHO Palettegen Modes: ECHO 1: diff - only what moves affects the palette ECHO 2: single - one palette per frame ECHO 3: full - one palette for the whole animation ECHO: ECHO About Bayerscale: ECHO When bayer dithering is selected, the Bayer Scale option defines the ECHO scale of the pattern (how much the crosshatch pattern is visible). ECHO A low value means more visible pattern for less banding, a higher value ECHO means less visible pattern at the cost of more banding. ECHO: ECHO People who made this project come to fruition: ECHO ubitux, Nabi KaramAliZadeh, and the very kind and patient people in the ECHO Batch Discord Server. Without these people's contributions, this script ECHO would not be possible. Thank you all for your contributions and ECHO assistance^^! GOTO :EOF