Encode video to lower file size with ffmpeg
I have this script which I am working on to encode a video into smaller file size:
echo off
set arg1=%1
set _filename=%~n1
set _extension=%~x1
shift
ffmpeg -i %arg1% -c:v h264_amf -crf 18 -preset slow -c:a aac -b:a 128k -movflags +faststart -vf scale=-2:480,format=yuv420p %_filename%.480P%_extension%
It accepts one argument which is the video file and outputs a new file.
Testing with a video file size of 815,050 KB the output was even bigger 1,554,650 KB specifically.
I'm using h264_amf
for the reason I am encoding on a machine with AMD GPU on Windows.
My goal here is to convert a ton of videos to about 500MB (or lower if the input size is lower than 500MB) each regardless of the quality since it will be played in a AI-enhancing video player so quality of the output is not important.
What's the correct ffmpeg parameters to achieve this?
h264_amf does not support -crf
or -preset
. If you want a specific output file size with this encoder then use -rc cbr
and set the appropriate bitrate with -b:v
.
Example for 1000 second input with approximate 500 MB output:
(500 MB * 8000) = 4000000 kb / 1000 seconds - 128kb audio bitrate - ~1% muxing overhead = -b:v 3832k
Simple example command:
ffmpeg -i input -c:v h264_amf -rc cbr -b:v 3832k -c:a aac -b:a 128k output.mp4
-
Get duration with
ffprobe
. - See
ffmpeg -h encoder=h264_amf
for more options specific to this encoder.