How to encode for YouTube with ffmpeg?
Use

ffmpeg -i in.mp4 -vf yadif,format=yuv420p -force_key_frames expr:gte(t\,n_forced/2) -c:v libx264 -crf 18 -bf 2 -c:a aac -q:a 1 -ac 2 -ar 48000 -use_editlist 0 -movflags +faststart out.mp4


-vf specifies video filters

yadif will deinterlace videos if they're interlaced.

format=yuv420p will produce pixel format with 4:2:0 chroma subsampling.

-force_key_frames expr:gte(t\,n_forced/2) will place keyframes every half-second, so that will be the GOP size.

-c:v libx264 will use the x264 encoder to produce a H264 video stream.

-crf 18 will produce a visually lossless file. Better than setting  a bitrate manually.

-bf 2 will limit consecutive B-frames to 2

-c:a aac will use the native encoder to produce an AAC audio stream.

-q:a 1 sets the highest quality for the audio. Better than setting  a bitrate manually.

-ac 2 rematrixes audio to stereo.

-ar 48000 resamples audio to 48000 Hz.

-use_editlist 0 avoids writing edit lists.

-movflags +faststart places moov atom/box at front of the output file.