Aqui está o método usando as versões atuais do FFmpeg. Ele depende do demuxer de concat não redimensionar o PTS de entradas após o primeiro arquivo, mas simplesmente aplicando um deslocamento fixo. Digamos que você tenha um fluxo de 30 fps com uma escala de tempo de 15360
(típica da saída do FFmpeg). Isso significa que o frame 0
tem PTS 0
e o frame 30
tem PTS 15360
. Isso se tornaria um fluxo de 45 fps se pudéssemos mudar a escala de tempo para 23040
sem afetar os valores de PTS.
Essencialmente, é o que o método abaixo faz.
1 . Identifique as propriedades de origem.
Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 1171 kb/s,
30 fps, 30 tbr, 15360 tbn (default)
Você deseja observar as propriedades de origem, especialmente a resolução e tbn
.
2a . (Opcional) Altere a escala de tempo para algo conveniente, para simplificar os cálculos.
ffmpeg -i in.mp4 -c copy -an -video_track_timescale 30 in-v30.mp4
Isso nos leva
Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 1171 kb/s, \
30 fps, 30 tbr, 30 tbn (default
Se você fizer essa etapa, a nova escala de tempo deverá ser igual ou um múltiplo integral da taxa de quadros original.
2b . Calcule a escala de tempo necessária, para que, para a taxa de quadros de destino x
, o PTS do quadro # x
na origem tenha o mesmo valor que o novo tbn
.
Se você realizou o passo 2a, isso é muito fácil e é simplesmente a nova taxa de quadros. Assim, para fps alvo 45
, o novo tbn
deve ser 45
.
3 . Gere um vídeo fictício.
ffmpeg -f lavfi -i color=s=1280x720:r=45:d=1 -profile:v main -video_track_timescale 45 0.mp4
Todas as propriedades devem ser iguais a resolução, perfil H.264, formato de pixel, refs count..etc para obter melhores resultados.
4 Concatize os vídeos.
Primeiro, faça um arquivo de texto
file '0.mp4'
file 'in-v30.mp4'
Então, a concat
ffmpeg -f concat -i list.txt -c copy -video_track_timescale 45 45fps.mp4
O arquivo de saída terá o segundo vídeo reproduzido a 45 fps.
5 . Agora, apegue o preroll falso
ffmpeg -ss 1.1 -i 45fps.mp4 -c copy -avoid_negative_ts make_zero in45.mp4
e você tem
Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 1757 kb/s, \
45 fps, 45 tbr, 11520 tbn (default)
Eu disse que isso foi complicado!