Thursday, September 4

ConvertVideoForMastodon.bat


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