vid2ani/vid2ani.cmd

322 lines
9.8 KiB
Batchfile
Executable File
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

@ECHO OFF
:: By: MDHEXT, Nabi KaramAliZadeh <nabikaz@gmail.com>
:: 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)
SETLOCAL ENABLEDELAYEDEXPANSION
SET input="%~1"
SET vid="%~dpnx1"
SET output=%~dpn1
SET FILEPATH=%~dp1
:: Storing Paths
SET "filetype="
SET "scale="
SET "fps="
SET "mode="
SET "dither="
SET "bayerscale="
SET "start_time="
SET "webp_lossy="
SET "duration="
SET "colormax="
SET "version="
SET "build="
:: Clearing all variables
SET WD=%TEMP%\VID2ANI
SET palette=%WD%\template
FOR /F "delims=" %%a in ('ffmpeg -version') DO (
IF NOT DEFINED version (
SET "version=%%a"
) ELSE IF NOT DEFINED build (
SET "build=%%a"
)
)
GOTO :help_check_1
:: Setting the path to the Working Directory and storing FFmpeg Version String
:help_message
ECHO:
ECHO Video to GIF/APNG/WEBP converter v5.5
ECHO ^(C^) 2017-2022, MDHEXT ^&^ Nabi KaramAliZadeh ^<nabikaz@gmail.com^>
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 -t Output filetype: gif, png, webp.
ECHO The default is gif.
ECHO -o Output file.
ECHO The default is the same name as the input video.
ECHO -r Scale or size.
ECHO Width of the animation in pixels.
ECHO The default is the same scale as the original video.
ECHO -f Framerate in frames per second.
ECHO The default is 15.
ECHO -m Palettegen mode - one of 3 modes listed below.
ECHO The default is 1 (diff).
ECHO -d Dithering algorithm to be used.
ECHO The default is 0 (None).
ECHO -b Bayer Scale setting. (Optional)
ECHO This can only be used when Bayer dithering is applied.
ECHO See more information below.
ECHO -l Set lossy WebP compression and quality
ECHO Value 0-100, default 75.
ECHO (Default for WebP is lossless)
ECHO -c The maximum amount of colors useable per palette.
ECHO (Optional value up to 256)
ECHO This option isn't used by default.
ECHO -s Start of the animation (HH:MM:SS.MS)
ECHO (Optional)
ECHO -e Duration of the animation (HH:MM:SS.MS)
ECHO (Optional)
ECHO -k Enables error diffusion.
ECHO (Optional)
ECHO -p Opens the resulting animation in your default Photo Viewer.
ECHO (Optional)
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 Dithering Options:
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 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 The option must be an integer value in the range [0,5].
ECHO The Default is 2. Bayer Scale is optional.
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
:help_check_1
IF %input% == "" GOTO :help_message
IF %input% == "help" GOTO :help_message
IF %input% == "-?" GOTO :help_message
IF %input% == "--help" GOTO :help_message
GOTO :varin
:: Checking for blank input or help commands
:varin
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 "duration=%~2" & SHIFT
IF "%~1" =="-c" SET "colormax=%~2" & SHIFT
IF "%~1" =="-l" SET "webp_lossy=%~2" & SHIFT
IF "%~1" =="-k" SET "errorswitch=0"
IF "%~1" =="-p" SET "picswitch=0"
SHIFT & GOTO :varin
)
GOTO :help_check_2
:: Using SHIFT command to go through the input and storing each setting into its own variable
:help_check_2
IF NOT DEFINED filetype SET "filetype=gif"
IF NOT DEFINED scale SET "scale=-1"
IF NOT DEFINED fps SET fps=15
IF NOT DEFINED mode SET mode=1
IF NOT DEFINED dither SET dither=0
GOTO :safchek
:: Noob proofing the script to prevent it from breaking should critical settings not be defined
:safchek
echo %filetype% | findstr /r "\<gif\> \<png\> \<apng\> \<webp\>" >nul
IF %errorlevel% NEQ 0 (
ECHO Not a valid file type
GOTO :EOF
)
IF %mode% GTR 3 (
ECHO Not a valid mode
GOTO :EOF
) ELSE IF %mode% LSS 1 (
ECHO Not a valid mode
GOTO :EOF
)
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
)
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
)
)
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% EQU 1 GOTO :script_start
IF %dither% NEQ 1 (
ECHO This setting only works with bayer dithering
GOTO :EOF
)
)
)
GOTO :script_start
:: Setting a clear range of acceptable setting values and noob proofing bayerscale
:script_start
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
:: Set output file name
ECHO %version%
ECHO %build%
ECHO Output file: %output%
ECHO Creating Working Directory...
MD "%WD%"
:: Displaying FFmpeg Version String and Creating the Working Directory
:palettegen
ECHO Generating Palette...
IF DEFINED start_time (
IF DEFINED duration SET "trim=-ss !start_time! -t !duration!"
IF NOT DEFINED duration (
ECHO Please input a duration
GOTO :cleanup
)
)
IF NOT DEFINED start_time (
IF DEFINED duration (
ECHO Please input a start time
GOTO :cleanup
)
)
:: Noob Proofing clipping
SET frames=%palette%_%%05d
SET filters=fps=%fps%,scale=%scale%:-1:flags=lanczos
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
IF DEFINED colormax (
IF %mode% LEQ 2 SET "mcol=:max_colors=%colormax%"
IF %mode% EQU 3 SET "mcol==max_colors=%colormax%"
)
ffmpeg -v warning %trim% -i %vid% -vf "%filters%,%encode%%mcol%" -y "%frames%.png"
IF NOT EXIST "%palette%_00001.png" (
IF NOT EXIST "%palette%.png" (
ECHO Failed to generate palette file
GOTO :cleanup
)
)
:: Putting together command to generate palette, executing it, and then checking if the file is in the Working Directory, if not, cleaning up working files
ECHO Encoding animation...
IF %mode% EQU 1 SET decode=paletteuse
IF %mode% EQU 2 SET "decode=paletteuse=new=1"
IF %mode% EQU 3 SET decode=paletteuse
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"
)
IF "%filetype%" == "webp" (
IF DEFINED webp_lossy (
SET "webp_lossy=-lossless 0 -pix_fmt yuv420p -quality %webp_lossy%"
) ELSE SET "webp_lossy=-lossless 1"
)
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!
:: Setting variables to put the command together; checking for Error Diffusion if using Bayer Scale and adjusting the command accordingly
IF NOT DEFINED bayerscale SET "bayer="
IF DEFINED bayerscale SET bayer=:bayer_scale=%bayerscale%
:: Checking for Bayer Scale and adjusting command
ffmpeg -v warning %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%"
IF NOT EXIST "%output%" (
ECHO Failed to generate animation
GOTO :cleanup
)
:: Checking if file was created and cleaning up if not
IF DEFINED picswitch START "" "%output%"
:cleanup
ECHO Deleting Temporary files...
RMDIR /S /Q "%WD%"
ENDLOCAL
ECHO Done!