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 ffprobe
e 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_frames
opçã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