

1·
6 days agoThe version I have was copied from stackoverflow. It doesn’t work very well, it makes a rough estimate to get the video file size under the set value. As an example
resize video.mp4 10
Which then resizes the video to 10 megabytes if possible.
resize.sh code
file=$1
target_size_mb=$2 # target size in MB
target_size=$(( $target_size_mb * 1000 * 1000 * 8 )) # target size in bits
length=`ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "$file"`
length_round_up=$(( ${length%.*} + 1 ))
total_bitrate=$(( $target_size / $length_round_up ))
audio_bitrate=$(( 128 * 1000 )) # 128k bit rate
video_bitrate=$(( $total_bitrate - $audio_bitrate ))
ffmpeg -i "$file" -b:v $video_bitrate -maxrate:v $video_bitrate -bufsize:v $(( $target_size / 20 )) -b:a $audio_bitrate "${file}-${target_size_mb}mb.mp4"
I’ll probably replace it eventually.


I might add one for scaling. I just don’t use it as frequently as trying to meet a file size limit. The scaling is also much easier to remember
ffmpeg -i in.mp4 -vf "scale=600:-1" -an out.mp4It does get complicated though, when scaling many videos and images, I’ve used something like the following in the past
find . -exec ffmpeg -i {} -vf "scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:-1:-1:color=black" {}.mp4 \;Those were the only two that showed up when I typed
history | grep scale.after commenting, I also added a new video file resizer.
It works significantly better than the one I previously posted. It’s also copied from stackoverflow.
bitrate="$(awk "BEGIN {print int($2 * 1024 * 1024 * 8 / $(ffprobe \ -v error \ -show_entries format=duration \ -of default=noprint_wrappers=1:nokey=1 \ "$1" \ ) / 1000)}")k" ffmpeg \ -y \ -i "$1" \ -c:v libx264 \ -preset medium \ -b:v $bitrate \ -pass 1 \ -an \ -f mp4 \ /dev/null \ && \ ffmpeg \ -i "$1" \ -c:v libx264 \ -preset medium \ -b:v $bitrate \ -pass 2 \ -an \ "${1%.*}-$2mB.mp4"