Altera o framerate no ffmpeg sem reencodificar

8

Eu tenho um vídeo mkv (h264) com 23.976 fps (24000/1001), mas quero convertê-lo para 25 fps sem precisar reconfigurar e perder a qualidade. Eu sei que o mkvmerge pode fazer isso (com a opção --default-duration '0: 25fps'), mas eu gostaria de fazê-lo diretamente do ffmpeg se possível De acordo com os documentos, isso deve funcionar:

ffmpeg -i input.mkv -r 25 -vcodec copy output.mkv

mas quando eu executo eu só recebo o mesmo vídeo fps. Qual é o método correto para fazer isso (se existir) no ffmpeg?

    
por phate89 12.06.2016 / 19:02

1 resposta

8

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!

    
por 17.06.2016 / 14:55