REM Make a copy of this batch file before modifying. Setlocal EnableDelayedExpansion rem Convert video into a file size acceptable in a Mastodon post. Set /a MaxFileSizeInMegaBytes = 98 Title %MaxFileSizeInMegaBytes% MG Conversion Echo MaxFileSizeInMegaBytes = %MaxFileSizeInMegaBytes% Set /a AudioBitRateInKiloBits = 128 Echo AudioBitRateInKiloBits = %AudioBitRateInKiloBits% Set /a MaxFileSizeInKiloBytes = MaxFileSizeInMegaBytes * 1000 Echo MaxFileSizeInKiloBytes = %MaxFileSizeInKiloBytes% Set /a FileSizeInBytes = 0 Set /a FileSizeInBytes = %~z1 Echo FileSizeInBytes = %FileSizeInBytes% Set /a FileSizeInKiloBytes = FileSizeInBytes / 1024 Echo FileSizeInKiloBytes = %FileSizeInKiloBytes% If %FileSizeInKiloBytes% EQU 0 ( Echo File size is too large to fit in 32 bit variable Set /a FileSizeInKiloBytes = MaxFileSizeInKiloBytes + 1 ) If %FileSizeInKiloBytes% LEQ %MaxFileSizeInKiloBytes% ( Echo %~1 Echo File is already smaller than %MaxFileSizeInMegaBytes% megabytes. Choice /c y /t 999 /d y /m "Press Y to exit." Endlocal Exit ) For /f %%a in ('C:\MediaInfo\MediaInfo.exe --Inform^=General^;%%Duration%% ^"%~1^"') Do Set /a DurationInMilliseconds=%%a Echo DurationInMilliseconds = %DurationInMilliseconds% Set /a DurationInSeconds = DurationInMilliseconds / 1000 Echo DurationInSeconds = %DurationInSeconds% Set /a CenterTimeInSeconds = DurationInSeconds / 2 Echo CenterTimeInSeconds = %CenterTimeInSeconds% c:\ffmpeg\ffmpeg.exe -ss %CenterTimeInSeconds% -i "%~1" -frames:v 1 -y "%~d1%~p1%~n1_Thumbnail.png" Set /a MaxFileSizeInMegaBits = 8388 * MaxFileSizeInMegaBytes Echo MaxFileSizeInMegaBits = %MaxFileSizeInMegaBits% Set /a TotalBitRateInKiloBits = MaxFileSizeInMegaBits / DurationInSeconds Echo TotalBitRateInKiloBits = %TotalBitRateInKiloBits% Set /a TargetBitRateInKiloBits = TotalBitRateInKiloBits - AudioBitRateInKiloBits Echo TargetBitRateInKiloBits = %TargetBitRateInKiloBits% If %TargetBitRateInKiloBits% LEQ 0 ( Echo %~1 Echo File is too large to convert. Choice /c y /t 999 /d y /m "Press Y to exit." Endlocal Exit ) c:\ffmpeg\ffmpeg.exe -i "%~1" -tune film -preset slow -vf fps=30,scale='min(1920,iw)':-2 -vcodec libx264 -b:v %TargetBitRateInKiloBits%k -pass 1 -an -f null null && ^ c:\ffmpeg\ffmpeg.exe -i "%~1" -tune film -preset slow -vf fps=30,scale='min(1920,iw)':-2 -vcodec libx264 -b:v %TargetBitRateInKiloBits%k -pass 2 -ac 1 -b:a %AudioBitRateInKiloBits%k -y -movflags faststart -fs %MaxFileSizeInMegaBytes%M "%~d1%~p1%~n1_4Mastodon.mp4" REM c:\ffmpeg\ffmpeg.exe -i "%~d1%~p1%~n1_4Mastodon.mp4" -i "%~d1%~p1%~n1_Thumbnail.png" -map 0 -map 1 -c copy -c:v:1 png -disposition:v:1 attached_pic -y "%~d1%~p1%~n1_4MastodonWithThumbnail.mp4" timeout /t 999 Endlocal