This is a common issue when e-mailing or uploading video files.
One note is that you should make the filesize you choose below about 20% smaller than you need. For example I took a 219MB video and told it to be 20M. The resulting file was still about 21.9M but it was OK when I said 18M and was barely below the 20M size.
ffmpeg is our friend here, just use this command:
ffmpeg -i TheLargeVideo.mp4 -fs 100M TheLargeVideo-resize.mp4
Sometimes what you tell it to do is impossible, for example on a 652MB file that was about 4:55 in length. The above command made it 15MB as we specified -fs 15M, but the problem is that it only had 22 seconds of video. In other words ffmpeg will try to do something impossible and stops at the filesize you specify, even if some of the video gets chopped off! It doesn't explicitly error out, so be sure to make sure the time of the output/smaller video is the same as the original.
We told it to do something that was impossible with the codec and default quality settings.
You could also try setting a different, more efficient codec like x264 with -vcodec x264 and use crf with a higher value, even though the default is usually CRF 28.
CRF's highest value is 51 and results in a very blocky/pixelated video.
ffmpeg -i TheLargeVideo.mp4 -crf 35 -fs 100M -vcodec libx265 TheLargeVideo-resize.mp4
If you have a newer computer/version if you can try libx265 which looks better and may produce a small filesize. If not then use libx264
If CRF 35 was a bit too small, you could try going for 32
If it still doesn't work out above, you will have to increase the -crf value which results in lower quality and also a lower filesize.
What did fix it was setting -crf to a high value (40), which results in much lower quality, you could also try 35-38 to see if it still meets the target size, as the quality will be better too.
ffmpeg -i TheLargeVideo.mp4 -fs 100M -crf 40 -vcodec libx265 TheLargeVideo-resize.mp4