:: by JaCk | DevStable 08/21/2017| https://pastebin.com/JGL83SM8 | ffmpeg_gifme.bat --- Creates a palette file from input file, then proceeds to generate a gif file with the same name as input file. :: :: Based on command: ffmpeg -an -sn -ss 01:30 -i "video.mkv" -i "%temp%\fgme_palette.png" -vf "select='not(mod(n,60))',setpts='N/17/TB',scale=-1:360" -r 2/3 -y "out.gif" :: :: Over-Engineered Mauch? Naw... *waves jedi/witcher hand signs* There is no script... :: Its ugly? You Dont say... Even a mother loves her ugly-ass turdling. :: @echo off && setlocal EnableDelayedExpansion && (for /f "tokens=1 delims==" %%a in ('set fgme_') do set "%%a=") 2>nul 1>nul :: Setting Script Parameters to Variables set "fgme_input_file=%~1" set "fgme_output_file=%~2" set "fgme_palette_file=%~3" :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::: :::::: :::: Development Version :::: :::: USE AT YOUR OWN RISK :::: :::::: :::::: :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::::::::::: ::: ::: :: User Vars :: :: User Settings :: ::: ::: ::::::::::::::::::::::::::::::::::::::: :: Hard Coded User Settings :: - if Not Set, script will prompt set "fgme_start_time=01:30" rem :: Default: 01:30 --- Description: starting time offset - ffmpeg will skip this duration before processing set "fgme_duration_rate=2/3" rem :: Default: 2/3 --- Description: Total duration of each frame in the gif that is to be created set "fgme_scale_image_base=360" rem :: Default: 360 --- Description: base width of the output file -- Height will be auto-magiclly calculated set "fgme_input_filev=" rem :: Default: --- Description: when defined, it uses this filename AND its location when specified; when location is unspecified uses cd. Params DO NOT overset var set "fgme_output_filev=" rem :: Default: --- Description: when defined, it uses this filename AND its location when specified; when location is unspecified uses cd. Params DO NOT overset var set "fgme_palette_filev=" rem :: Default: --- Description: when defined, it uses this filename AND its location when specified; when location is unspecified uses cd. Params DO NOT overset var :::::::::::::::::: ::::::::::::::::::: :::::: :::::: :::::::::::::::: :::: ::::::::::::::::: ::::::::::::::::::::::::::::::::::::::: ::: ::: :: Script Vars :: :: Script Settings :: ::: ::: ::::::::::::::::::::::::::::::::::::::: :: Notes on Usage :: -Default: Not Set --- This means that the default setting was/is: empty, blank, null, nil, undefined :: -Default: false; Type: Boolean --- When var is undefined it is still [false]. Being undefined, the boolean function will consider it [false] :: -Type: Boolean --- No matter how long the string is, only first character is used to determine setting [t/a/p/y/1/def] or [f/und/n/0/nul]. When first character is a white space, then it is considered false/NotSet. :: False States: [undefined] : no; false; 0; :: True States: [defined=>true] : yes; true; 1; pass; :: rem :: Default: Not Set --- Type: String --- Required: Optional :: Description: output location of the palette file. When set, uses set directory name. When unset, uses %temp%. Relative paths are relative to the video file. Absolute paths, are absolute/fully-qualified set "fgme_palette_dir=palette\" rem :: Default: Not Set --- Type: String --- Required: Optional :: Description: when set, uses set file name. When unset, uses: video-filename.png set "fgme_palette_name=" rem :: Default: false --- Type: Boolean --- Required: Optional :: Description: when true, palette file is not deleted after use. set "fgme_keep_palette=true" rem :: Default: true --- Type: Boolean --- Required: Optional :: Description: Increases the rate value ten-fold to increase creation. set "fgme_fast_palette=true" rem :: Default: false --- Type: Boolean --- Required: Optional :: Description: makes sure not to overwrite already created files set "fgme_wfilelock_bool=" rem Default: Not Set --- Type: String --- Required: Optional :: Description: base filters, the image-scaling will be appended to this var further down this script - [scale=-1:!fgme_scale_image_base!:flags=lanczos] set "fgme_filters=" rem Default: Not Set --- Type: String --- Required: Optional :: Description: specific settings for ffmpeg gif muxer rem Accepts: rem -loop 0 --- Number of times to loop the output: -1 - no loop, 0 - infinite loop. From -1 to 65535 rem -final_delay -1 --- Force delay, in centiseconds, after the last frame. From -1 to 65535 set "fgme_ffmpeg_gifOpt=" rem :: Default: true --- Type: Boolean --- Required: Optional :: Description: when true, line numbers will be dumped for debug messages. set "fgme_debug_dline=true" :::::::::::::::::: ::::::::::::::::::: :::::: :::::: :::::::::::::::: :::: ::::::::::::::::: ::::::::::::::::::::::::::::::::::::::: ::: ::: :: Prompt for input :: ::: ::: ::::::::::::::::::::::::::::::::::::::: :: Input the dam file... please if defined fgme_input_filev if not defined fgme_input_file set "fgme_input_file=!fgme_input_filev!" if not defined fgme_input_file call :func_get_user_input "fgme_input_file" "Input: Enter Video file [and relative path if needed]" if not exist "!fgme_input_file!" ( echo/ Error: Unable to locate Input file !fgme_input_file! goto :eof ) :: drop the out file on the var... NOW if not defined fgme_output_file if defined fgme_output_filev ( set "fgme_output_file=!fgme_output_filev!" ) else ( call :func_get_user_input fgme_output_file "Input: Enter Output file name [and outpath path if needed]" if defined fgme_output_file set "fgme_output_file=!fgme_output_file:"=!" echo/ ) :: I hope this palette is to you palettes liking -- Making the external, internal if defined fgme_palette_filev if not defined fgme_palette_file set "fgme_palette_file=!fgme_palette_filev!" if defined fgme_palette_file for %%P in ("!fgme_palette_file!") do ( set "fgme_palette_dir=%%~dpP" set "fgme_palette_name=%%~nxP" if "%%~xP" equ "" set "fgme_palette_name=%%~nP.png" ) :: Did someone order a pallet of palettes -- oh well, to temp you go... rem If we created the dir successfully then set remove bool if defined fgme_palette_dir ( if not exist "!fgme_palette_dir!" ( echo/ Info: Creating dir: "!fgme_palette_dir!" mkdir "!fgme_palette_dir!" if !errorlevel! equ 0 if not defined fgme_keep_palette ( set "fgme_dpalette_dir=true" ) ) ) else ( set "fgme_palette_dir=%temp%" set "fgme_dpalette_dir=" ) if defined fgme_palette_name ( set "fgme_palette=!fgme_palette_dir!\!fgme_palette_name!" ) else ( for /f "tokens=1* delims=" %%z in ("!fgme_input_file!") do ( if "%%~n" neq "" ( set "fgme_palette_name=%%~nz.png" set "fgme_palette=!fgme_palette_dir!\!fgme_palette_name!" ) ) ) :: out from in -- maybe if not defined fgme_output_file ( for /f "tokens=1* delims=" %%z in ("!fgme_input_file!") do ( if "%%~n" neq "" set "fgme_output_file=%%~dpnz.gif" ) if defined fgme_output_file ( echo/ echo/ - Info: Self Defined Output File name: !fgme_output_file! echo/ ) else ( echo/ echo/ - Error: Unble to auto define Output file and one has not been defined echo/ goto :eof ) ) :: Strip path to just the name to print purdy :: Verify extension is gif for /f "tokens=1* delims=" %%Z in ("!fgme_output_file!") do ( if "%%~xZ" neq ".gif" ( set "fgme_output_fname=%%~nxZ.gif" set "fgme_output_file=%%~Z.gif" ) else ( set "fgme_output_fname=%%~nZ.gif" ) ) if not defined fgme_output_fname set "fgme_output_fname=!fgme_output_file!" :: Over-Right [unlike over-left] if exist "!fgme_output_file!" ( echo/ echo/ echo/ - Warning: File Already Exits if not defined fgme_wfilelock_bool ( call :func_get_bool_input "fgme_wfile_bool" "Input: User: Overwrite file [Yes/No]" "No" if not defined fgme_wfile_bool goto :eof ) else ( set "fgme_wfile_bool=" goto :eof ) ) :: Skip to time if not defined fgme_start_time ( echo/ echo/ call :func_get_user_input fgme_start_time "Input: Optional: Enter the time capture starting point of video" "01:30" ) :: fgme_duration_rate of gif if not defined fgme_duration_rate ( echo/ echo/ call :func_get_user_input fgme_duration_rate "Input: Optional: Enter the desired duration for the gif" 2/3 ) :: Filter Setttings if not defined fgme_scale_image_base ( echo/ echo/ call :func_get_user_input fgme_scale_image_base "Input: Optional: Enter the desired scale base [123,360,480,720,etc]" 360 ) :::::::::::::::::: ::::::::::::::::::: :::::: :::::: :::::::::::::::: :::: ::::::::::::::::: :: give it some lazlow and we are gtg if defined fgme_filters ( set "fgme_filters=!fgme_filters!,select='not(mod(n,60))',setpts='N/17/TB',scale=-1:!fgme_scale_image_base!:flags=lanczos" ) else ( set "fgme_filters=select='not(mod(n,60))',setpts='N/17/TB',scale=-1:!fgme_scale_image_base!:flags=lanczos" ) ::::::::::::::::::::::::::::::::::::::: ::: ::: :: tyme fowda EphEphEm-Paegg :: ::: ::: ::::::::::::::::::::::::::::::::::::::: :: Call ffmpeg to do teh magic :: Palette and gif File Creation if exist "!fgme_output_file!" ( if defined fgme_wfile_bool ( call :func_set_sstime 5 60 if not exist "!fgme_palette!" ( call :func_ffm_palette ) if exist "!fgme_palette!" ( call :func_ffm_pfsrc_gfout ) else ( call :func_ffm_nopf_gfout ) ) ) else ( call :func_set_sstime 5 60 if not exist "!fgme_palette!" ( call :func_ffm_palette ) if exist "!fgme_palette!" ( call :func_ffm_pfsrc_gfout ) else ( call :func_ffm_nopf_gfout ) ) :: k, thnx, bai if not defined fgme_keep_palette del /q /f "!fgme_palette!" if defined fgme_dpalette_dir del /q /f "!fgme_palette_dir!" :::::::::::::::::: ::::::::::::::::::: :::::: :::::: :::::::::::::::: :::: ::::::::::::::::: ::::::::::::::::::::::::::::::::::::::: :: :: :: Fin-Finito :: :: :: ::::::::::::::::::::::::::::::::::::::: (for /f "tokens=1 delims==" %%a in ('set fgme_') do set "%%a=") 2>nul 1>nul endlocal goto :eof :::::::::::::::::: ::::::::::::::::::: :::::: :::::: :::::::::::::::: :::: ::::::::::::::::: ::::::::::::::::::::::::::::::::::::::: :: :: :: Functions :: :: :: ::::::::::::::::::::::::::::::::::::::: rem Parses through this script and looks for the line numbers containing uniqueParseMessage, such as the call to the/a function rem When function encounters an error, it will clear the variable fgme_debug_line rem When function is called without a uniqueParseMessage, it will clear the variable fgme_debug_line and leave function :: Usage: func_dump_debug_line uniqueParseMessage :func_dump_debug_line if "%~1" equ "" ( set "fgme_debug_line=" goto :eof ) set "fgme_debug_line=" for /f "eol=- tokens=1 delims=[]" %%a in ('find /N %* "%~dpnx0"') do ( if "%%~a" neq "" if defined fgme_debug_line ( set "fgme_debug_line=!fgme_debug_line!,%%a" ) else ( set "fgme_debug_line=%%a" ) ) goto :eof rem Prints messages from params 1 and 2 and dumps all script vars if param 3 is undef rem Examples - rem To dump all vars and not print other messages -- rem func "" "" rem To print MsgHeader and MsgText without dumping Vars -- rem func "INIT: " "Errorlevel is !errorlevel!" 0 rem To print MsgText and dump all vars -- rem func "get_fduration all vars" :: Usage :: func_dump_debug_msg MsgTextORHeaderText-Optional MsgText-Optional doNotDumpVarsFlag-Optional :func_dump_debug_msg if "%~3" equ "" if "%~1" equ "" goto :eof if "%~1" neq "" ( if defined fgme_debug_dline ( call :func_dump_debug_line %* ) ) if "%~1" neq "" ( if defined fgme_debug_line ( echo/ Debug: Line: [!fgme_debug_line!]: %~1%~2 ) else ( echo/ Debug: %~1%~2 ) ) if "%~3" equ "" ( if defined fgme_debug_line ( call :func_dump_debug_vars "!fgme_debug_line!: " ) else ( call :func_dump_debug_vars " " ) ) goto :eof :: Usage :: func_dump_debug_vars MsgOrHeaderText-Optional :func_dump_debug_vars set "_varCnt=0" for /f "tokens=1,* delims==" %%a in ('set fgme_ ') do ( if "%%~a" neq "" ( set /a "_varCnt+=1" echo/ Debug: %~1Variable[!_varCnt!]: [%%~a]: [%%~b] ) ) for /f "tokens=1,* delims==" %%a in ('set _fgme_') do ( if "%%~a" neq "" ( set /a "_varCnt+=1" echo/ Debug: %~1Variable[!_varCnt!]: [%%~a]: [%%~b] ) ) set "_varCnt=" goto :eof rem Prompts User for input rem Quoted parameters optional, double-quotes will be dropped regardless, White-spaces ignored between params rem Example usage: rem func varUserFeedback "Input: User: Did you like %~nx0" "N/A" :: Usage :: func_get_user_input returnVar msgText-Optional defaultResponse-Optional :func_get_user_input if "%~1" equ "" ( goto :eof ) if "%~2" neq "" ( echo/ %~2 ) if "%~3" neq "" ( echo/ [Default: %~3] set "%~1=%~3" ) set /p "%~1= ~> " goto :eof rem Prompts User for input, then calls func_bool_bistate to check booleans, returns 'true' otherwise unsets returnVar rem Quoted parameters optional, double-quotes will be dropped regardless, White-spaces ignored between params rem Example usage: rem func boolUserFileOverwrite "Input: User: Overwrite file Yes/No" "No" :: Usage :: func_get_bool_input returnVar msgText-Optional defaultResponse-Optional :func_get_bool_input if "%~1" equ "" goto :eof if "%~2" neq "" echo/ %~2 if "%~3" neq "" echo/ [Default: %~3] set /p "%~1= -> " if not defined %~1 set "%~1=%~3" if "!%~1:~0,1!" equ "" (set "%~1=") if "!%~1:~0,1!" equ "1" (set "%~1=true") if /i "!%~1:~0,1!" equ "y" (set "%~1=true") if /i "!%~1:~0,1!" equ "p" (set "%~1=true") if /i "!%~1:~0,1!" equ "a" (set "%~1=true") if /i "!%~1:~0,1!" equ "t" (set "%~1=true") else (set "%~1=") goto :eof rem Gets video duration from file using ffmpeg rem Note - when encountering errors sets returnVar to 0 rem Note - when function is called incorrectly does not set vars and leave func rem Note - Returns returnVar rounded to the nearest second :: Usage :: func_get_fduration returnVar "videoFile.ext" :func_get_fduration if "%~1" equ "" (goto :eof) if "%~2" equ "" (goto :eof) for /f "tokens=2 delims=, " %%d in ('call ffmpeg -i "%~2" 2^>^&1 ^| findstr /c:"Duration: "') do set "%~1=%%~d" rem var will cause problems if unset if "!%~1!" equ "" ( set "%~1=0" goto :eof ) rem strip out trailing zeros for batch calc not to confuse octal vs decimal set "%~1=!%~1::0=:!" for /f "tokens=1-4 delims=:." %%a in ("!%~1!") do ( set "%~1=0" if "%%~a" neq "" ( if %%a gtr 0 set /a "%~1+=%%~a * 3600" if %%b gtr 0 set /a "%~1+=%%~b * 60" if %%c gtr 0 set /a "%~1+=%%~c" if %%~d geq 50 set /a "%~1+=1" ) ) goto :eof rem From param2-sendTime, Returns param1-returnVar in seconds rem Note - when encountering errors sets returnVar to 0 rem Note - when function is called incorrectly does not set vars and leave func rem Note - Returns returnVar rounded to the nearest second rem Accepted notations - rem HH:MM:SS.MS rem HH:MM:SS rem MM:SS.MS rem MM:SS rem SS.MS rem SS rem rem Examples - rem func "DurationInSecs" "01:11:54.71" rem func "DurationInSecs" "23:15.11" rem func "DurationInSecs" "11:55" rem func "DurationInSecs" "1.85" :: Usage :: func_get_secs_duration returnVar sendTime :func_get_secs_duration if "%~1" equ "" goto :eof if "%~2" equ "" goto :eof for /f "tokens=1,2 delims=." %%A in ("%~2") do ( set "%~1=0" if "%%~B" equ "" if "%%~A" neq "" ( for /f "tokens=1,2,3 delims=:" %%a in ("%%A") do ( if "%%~c" equ "" if "%%~b" equ "" if "%%~a" neq "" ( set /a "%~1+=%%~a" ) if "%%~c" equ "" if "%%~b" neq "" ( set /a "%~1+=%%~a * 60" set /a "%~1+=%%~b" ) if "%%~c" neq "" ( set /a "%~1+=%%~a * 3600" set /a "%~1+=%%~b * 60" set /a "%~1+=%%~c" ) ) ) if "%%~B" neq "" if %%~B geq 50 ( set /a "%~1+=1" ) ) 2>nul if "!%~1!" equ "" ( set "%~1=0" ) goto :eof rem From param2-sendTime, Returns param1-returnVar in HH:MM:SS notation rem Note - Checks input validity except when param1 is missing rem Note - when encountering errors sets returnVar to 00:00:00 rem Note - when function is called incorrectly does not set vars and leave func rem Example --- func "varDuration" "6430" rem func_get_time_from_secs returnVar sendTime :func_get_time_from_secs if "%~1" equ "" (goto :eof) if "%~2" equ "" ( set "%~1=00:00:00" goto :eof ) set /a "%~2*=1" 2>nul if !errorlevel! neq 0 ( set "%~1=00:00:00" goto :eof ) if not %~2 gtr 0 ( set "%~1=00:00:00" goto :eof ) rem calc and pad/strip zeros if %~2 lss 60 ( set "%~1=00:00:%~2" ) else ( set /a "_%~1h=%~2/3600" set /a "_%~1m=(%~2 - (!_%~1h! * 3600))/60" set /a "_%~1s=(%~2 - (!_%~1m! * 60) - (!_%~1h! * 3600))" if "!_%~1h:~0,2!" equ "!_%~1h!" ( set "_%~1h=00!_%~1h!" set "_%~1h=!_%~1h:~-2! ) set "_%~1m=00!_%~1m!" set "_%~1s=00! set "%~1=!_%~1h!:!_%~1m:~-2!:!_%~1s:~-2!" set "_%~1h=" set "_%~1m=" set "_%~1s=" ) if "!%~1!" equ "" set "%~1=00:00:00" goto :eof rem Checks to see if the value is "t","a","p","y" or "1" and sets returBoolVar to "true" rem Otherwise, unsets the var rem Case is ignored and White-spaces ignored between params rem Optional - Double Quoted parameters - double-quotes will be dropped regardless, rem Optional - Un-setting the var - var will be overwritten except when param1 is missing rem Optional - Un/Pre-setting the var - param1s value can be passed as param2 - "setTestValue-Optional" rem - When param2 is defined - before param1 is evaluated - overwrites/sets param1 with param2 rem Example usage: rem func flag_overwrite "true" rem func flag_disable_state rem func_bool_bistate returBoolVar setTestValue-Optional :func_bool_bistate if "%~1" equ "" (goto :eof) if "%~2" neq "" (set "%~1=%~2") if "!%~1:~0,1!" equ "1" (set "%~1=true") if /i "!%~1:~0,1!" equ "y" (set "%~1=true") if /i "!%~1:~0,1!" equ "p" (set "%~1=true") if /i "!%~1:~0,1!" equ "a" (set "%~1=true") if /i "!%~1:~0,1!" equ "t" (set "%~1=true") else (set "%~1=") goto :eof rem Checks to see if the value is "t","a","p","y" or "1" and sets returBoolVar to "true" rem Checks to see if the value is "f","n" or "0" and sets returBoolVar to "false" rem Otherwise, unsets the var rem Case is ignored and White-spaces ignored between params rem Optional - Double Quoted parameters - double-quotes will be dropped regardless, rem Optional - Un-setting the var - var will be overwritten except when param1 is missing rem Optional - Un/Pre-setting the var - param1s value can be passed as param2 - "setTestValue-Optional" rem Example usage: rem func check_machine_status false rem func true rem func_bool_tristate returBoolVar setTestValue-Optional :func_bool_tristate if "%~1" equ "" (goto :eof) if "%~2" neq "" (set "%~1=%~2") if "!%~1:~0,1!" equ "0" (set "%~1=false") if /i "!%~1:~0,1!" equ "n" (set "%~1=false") if /i "!%~1:~0,1!" equ "f" (set "%~1=false" goto :eof) if "!%~1:~0,1!" equ "1" (set "%~1=true") if /i "!%~1:~0,1!" equ "y" (set "%~1=true") if /i "!%~1:~0,1!" equ "p" (set "%~1=true") if /i "!%~1:~0,1!" equ "a" (set "%~1=true") if /i "!%~1:~0,1!" equ "t" (set "%~1=true" goto :eof) else (set "%~1=") goto :eof rem Cleans up MSOffice AutoFsckYou character swaps when coppie/pasta and etc. rem Example usage: rem func "UserInputVar" rem func_fix_funky_chars Send-Return-var :func_fix_funky_chars if "%~1" equ "" goto :eof if "!%~1: = !" neq "!%~1!" ( set "%~1=!%~1: = !" ) if "!%~1:–=-!" neq "!%~1!" ( set "%~1=!%~1:–=-!" ) if "!%~1:“="!" neq "!%~1!" ( set "%~1=!%~1:“="!" ) if "!%~1:”="!" neq "!%~1!" ( set "%~1=!%~1:”="!" ) goto :eof rem Gets, checks and compares Skip_Start_Time with Total_File_Duration. rem When total is less than start+Pad, sets start to 1 or newTime-Optional rem Example -- func 5 60 rem Example -- func "" 90 rem func_set_sstime newTime-Optional padTimeSecs-Optional :func_set_sstime call :func_get_fduration "_fgme_fdur" "!fgme_input_file!" call :func_get_secs_duration "_fgme_stm" "!fgme_start_time!" if "%~1" neq "" ( call :func_get_secs_duration _fgme_stmSecsOne "%~1" call :func_get_time_from_secs _fgme_stmStdOne "%~1" ) if "%~2" neq "" ( call :func_get_secs_duration _fgme_stmSecsPTwo "%~2" if defined _fgme_stmSecsPTwo ( set /a "_fgme_stm+=!_fgme_stm!" ) else ( set /a "_fgme_stm+=%~2" ) ) if !_fgme_fdur! leq !_fgme_stm! ( if "%~1" neq "" ( if %~1 geq 10 ( call :func_get_time_from_secs _fgme_stm "%~1" set "fgme_start_time=!_fgme_stm!" ) else ( set "fgme_start_time=00:00:%~1" ) ) else ( set "fgme_start_time=00:00:01" ) ) set "_fgme_stm=" set "_fgme_fdur=" goto :eof rem Duration Time Multiplier to decrease palette creation time rem Note: Multiplier Default is 10 - unless a valid setMultiplierValue-Optional is passed rem Note: When currentRateValue is less than zero, it's considered as zero rem Note: setMultiplierValue-Optional valid values are a positive number or an equation. rem -- processed in OOP -- ((equationORvalue) + 1) rem Note: Predefined returnVar rem when number - multiplier is added to it rem when string - treated as undefined rem when mixed - preceeding numbers are used rem func_calc_fast_palette returBoolVar currentRateValue setMultiplierValue-Optional :func_calc_fast_palette if "%~1" equ "" goto :eof if "%~2" equ "" goto :eof set /a "%~1*=1" if "%~3" neq "" ( set /a "%~1+=(( %~3 ) + 1) * (( %~2 ) + 1)" ) else ( set /a "%~1+=( 10 ) * (( %~2 ) + 1)" ) goto :eof rem echo/ Info: Create Palette: [Dir:!fgme_palette_dir!] [File:!fgme_palette_name!] rem test params -metadata "JIF=%~nx0,JIF_CREATED_ON=!Date! !time!" :func_ffm_palette set "fmge_palette_rate=!fgme_duration_rate!" call :func_calc_fast_palette fmge_palette_rate !fgme_duration_rate! 100 if "!fgme_duration_rate:~0,2!" neq "!fmge_palette_rate:~0,2!" ( echo/ Info: Create Palette: Faster Mode: [!fgme_palette_name!] ) else ( echo/ Info: Create Palette: Normal Mode: [!fgme_palette_name!] ) call ffmpeg -an -sn -dn -v warning -ss !fgme_start_time! -i "!fgme_input_file!" -filter_complex "!fgme_filters!, palettegen=stats_mode=diff" -r !fmge_palette_rate! -y "!fgme_palette!" if not errorlevel 0 ( echo/ Error: Create Palette: Removing "!fgme_palette_name!" if exist "!fgme_palette_name!" del /q "!fgme_palette_name!" ) goto :eof :func_ffm_nopf_gfout echo/ Info: Create Gif w/o Palette file: [!fgme_output_fname!] call ffmpeg -an -sn -dn -v warning -ss !fgme_start_time! -i "!fgme_input_file!" -vf "!fgme_filters!" -r !fgme_duration_rate! -y "!fgme_output_file!" goto :eof :func_ffm_pfsrc_gfout echo/ Info: Create Gif with Palette file: [!fgme_output_fname!] call ffmpeg -an -sn -dn -v warning -ss !fgme_start_time! -i "!fgme_input_file!" -i "!fgme_palette!" -filter_complex "!fgme_filters!,paletteuse" -r !fgme_duration_rate! -y "!fgme_output_file!" goto :eof