Além do método de várias ferramentas mostrado no link , isso também pode ser feito por meio de um único comando longo.
ffmpeg -i a1.jpg -i a2.jpg -i a3.jpg -i a4.jpg -i a5.jpg
-filter_complex
"[1]settb=1/1000,setpts=PTS+0.06/TB[b];
[2]settb=1/1000,setpts=PTS+0.054/TB[c];
[3]settb=1/1000,setpts=PTS+0.07/TB[d];
[4]split[4a][4b];
[4a]settb=1/1000,setpts=PTS+0.023/TB[e];
[4b]settb=1/1000,setpts=PTS+0.04/TB[f];
[0][b][c][d][e][f]concat=n=6"
-vsync vfr -r 1000 -video_track_timescale 1000 vt.mp4
Para cada imagem, exceto a primeira, os filtros timebase e timestamp são aplicados. Como você precisa de precisão em milissegundos, a base de tempo é definida como 1/1000 seg = 1 milissegundo. Em seguida, os setpts adicionam o atraso necessário (em segundos). Como acredito que o último quadro do vídeo tenha, na verdade, a duração padrão determinada pela taxa de quadros do codec, a última imagem precisa ser duplicada. A primeira cópia é configurada com o valor PTS de acordo com seu atraso, e a segunda tem seu PTS configurado para a duração desejada da última imagem.