Adicione quadro-chave ao meio do vídeo sem recodificar o vídeo inteiro

Adicione quadro-chave ao meio do vídeo sem recodificar o vídeo inteiro

Preciso adicionar quadros I no meio dos mp4s nos intervalos comerciais para poder segmentar para HLS e ter quadros I quando o vídeo voltar. Sei como fazer isso enquanto recodifica o vídeo inteiro e força os quadros-chave em particular pontos, mas prefiro cortar o ponto (talvez 1 segundo de vídeo) onde o quadro-chave é necessário, adicionar o quadro-chave e depois unir o vídeo novamente. Isso deve reduzir bastante o tempo de codificação, já que posso copiar principalmente codecs, exceto um segundo de vídeo em que o quadro I está sendo adicionado.

O único problema é que o perfil e as configurações do vídeo mudam onde estou adicionando o I-frame e não consigo uma costura limpa ao juntar tudo novamente. Entendo que posso fazer uma recodificação com o concat, mas estou tentando evitar esse tempo de processamento.

Alguns exemplos simples do que estou tentando fazer com o ffmpeg:

ffmpeg -i input.mp4 -ss 30 -t 1 -c:a copy -y -copyts clipped2.mp4

ffmpeg -i input.mp4 -t 30 -c copy -y -copyts clipped1.mp4

ffmpeg -i "concat:clipped1.mp4|clipped2.mp4" -c copy -y newOutput.mp4

Talvez eu precise usar ffprobee especificar a taxa de bits, o perfil e outras configurações para o clipe de 1 segundo, para que o padrão não seja algum material aleatório, mas ainda não consigo fazer isso funcionar direito.

Alguém conseguiu isso? Isso está sendo feito especificamente para inserção de anúncios no servidor.

Responder1

estou copiandoesta resposta:

Você pode usar o ffmpeg para inserir quadros-chave onde desejar usando a -force_key_framesopção.

por exemplo:

./ffmpeg -i input.mp4 -c:a copy -c:v copy -force_key_frames 0:05:00,0:10:00 out.mp4

colocará um quadro-chave o mais próximo possível da marca 5 e 10. Os valores de tempo podem estar no formato hh:mm:ss ou apenas segundos (valores únicos, sem dois pontos).

Você pode verificar se há quadros inseridos onde deseja usando:

./ffprobe -select_streams v:0 -skip_frame nokey -show_entries frame=pkt_pts_time out.mp4

informação relacionada