Ok, I know what to do. I played a little with ffmpeg and avconv (ffmpeg's fork, libav, conversion utility) converting 3D YouTube videos to play at the Nintendo 3DS. Anyways, I'll pretend you're using ffmpeg, I prefer libav but ffmpeg is much more common (both are made available by portage, there is virtual/ffmpeg now). Their syntax is a little different by the way, if you prefer using libav just look at libav changelog (/usr/share/doc/libav-version/CHANGELOG.bz2, or something close to that).
ffmpeg -i file1.avi -i file2.avi -vcodec copy -acodec copy -async 12 -o output.avi You can use multiple input files, not just 2. If their codec match, you can copy, if they don't match then you'll need to re-encode the files (or the just the ones with the different codec). The -async 12 option do the synchronization trick. The 12 indicates that ffmpeg should try to correct synchronization at most 12 times per second. You could use less, try and see the results yourself. I'd say that even 5 or 3 would give great results, but 12 doesn't seem to increase file size either.

