Eu já vi esse problema antes, e a única solução é usar o offset e o mapa.
ffmpeg -i 00402.MTS -itsoffset 0.455556 -i 00402.MTS -map 1:0 -map 0:1 -s 1280x720 -ss 0:00:05.38608 -vcodec libxvid -qscale:v 2 -acodec ac3 -ar 48000 -ab 256k -t 0:00:06.61391 m001.avi
Esta página tem uma boa explicação do porquê e como funciona.
link
(Não está mais disponível no link original; agora em web-beta.archive.org)
EDIT Existem duas ferramentas principais aqui para estar ciente de: 1) seu deslocamento 2) mapear
itsoffset existe para compensar um fluxo que está fora de sincronia, enquanto o mapa informa ao ffmpeg para usar determinados fluxos de entradas específicas e aplicá-los à saída.
Neste exemplo, estamos usando a mesma entrada duas vezes, mapeando os fluxos dessa forma: Usamos o fluxo de vídeo da primeira entrada (que parece estar começando às 00: 00: 00.00) Usamos a segunda entrada como o fluxo de áudio, mas compensamos o tempo de entrada 0.455556 segundos.
Do site mencionado acima:
Here "-map 1:0" tells ffmpeg to use the second input file (1) and take its first stream (0) as the video source. Since that's the input that follows the "-itsoffset" switch, that's the stream that will be delayed. Then "-map 0.1" tells it to use the second stream from the first input as the audio. Since there's no offset applied to the first input file, it will be processed normally.