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