FFMPEG Overlay preciso

1

Vamos direto ao ponto, estou tendo um problema com o recurso de sobreposição do ffmpeg. Eu tenho dois vídeos. Um é 2865 quadros, o segundo é 2865 quadros. Ambos estão em 30000/1001 fps. Eu verifiquei ambos os timestamps antes de sobrepor e registrei em um arquivo que eu colocaria no meu post como uma imagem se eu tivesse a reputação, então, por enquanto, você terá que confiar que estou dizendo a verdade quando dizem que seus timestamps são exatamente os mesmos.

Agora, apesar da correspondência de framerates de vídeo, o resultado desse comando:

"ffmpeg", "-i", fmt.Sprintf("%s%s", CCME.PathsToUse[0], CCME.UnderlayVideo),
                   "-i", fmt.Sprintf("%s%s", CCME.PathsToUse[1], CCME.VideoName), 
                   "-filter_complex", "overlay=0:0", "-vsync", "0", "-crf", "18", "-y", "-shortest", "-strict", "-2",
                   fmt.Sprintf("%s%s.%s", CCME.PathsToUse[2], CCME.FinalVideoName, CCME.VidFormat

Resultados em dois quadros extras sendo adicionados ao final do vídeo, o que seria ótimo, pois posso excluir ou remover quadros adicionais adicionados ao final. No entanto, quando executado pela análise, os seguintes avisos aparecem:

Frame 770: Repeated

Frame 1500: Repeated

Frame 2276: Repeated

Missing Or Mangled Frame(s) After Frame 2591

QR DATA: 2593

3 frames repeated and or added.

Parece que, apesar do framerate exato, número do frame e timestamps sendo usados, o ffmpeg tem dificuldade em sobrepor o vídeo de forma a alinhar cada frame ao seu respectivo frame para o outro vídeo. Para o propósito deste projeto eu preciso de precisão absoluta em como esses quadros estão alinhados e não estou recebendo isso. Eu tenho batido minha cabeça contra a parede há duas semanas e não tenho uma resposta sobre o porquê isso está acontecendo ou que outras opções eu posso usar para evitar as duplicações de quadros, quedas e quadros adicionados ao final do vídeo.

Alguém tem alguma idéia de por que isso estaria acontecendo eo que está faltando no comando acima ou o que pode ser adicionado para obter esses vídeos para alinhar e ou evitar repetições e queda de quadros? Tanto quanto eu sei, isso não deveria estar acontecendo, mas parece que tudo que eu fiz até agora não conseguiu consertá-lo.

    
por SuperUser_Novice 30.04.2018 / 18:53

2 respostas

0

Seus dois arquivos não têm taxas de quadros ou duração idênticas. Mas se você tem certeza de que o vídeo principal deve ser de taxa de quadros constante, você pode gerar novos timestamps suaves para os dois fluxos de vídeo e, em seguida, executar a sobreposição.

ffmpeg -i main.mp4 -i overlay -filter_complex
    "[0]setpts=1001*N/30000/TB[m];
     [1]setpts=1001*N/30000/TB[o];
     [m][o]overlay=shortest=1"
 -crf 18 out.mp4
    
por 30.04.2018 / 20:26
0

Enquanto Gyan recebeu a resposta, vou explicar como consegui que isso funcionasse.

Como as chances de eu conseguir corresponder a duração exata e a taxa de quadros de um filme e, portanto, obter uma sobreposição perfeita de dois vídeos, são improváveis na melhor das hipóteses, impossíveis na pior das hipóteses, decidi adotar uma abordagem alternativa.

A sobreposição perfeita de quadros pode ser feita desconstruindo o vídeo de destino em seus quadros individuais:

exec.Command("ffmpeg", "-i", fmt.Sprintf("%s%s", CCME.PathsToUse[0], CCME.UnderlayVideo),
                             "-start_number", "0", "-qscale:v", "2", fmt.Sprintf("%s%s%%d.jpg", TempDirPath[0], VideoName))

Sobrepondo os quadros individualmente:

for x:=0; x<len(files)-2; x++ {
    overlayFile := exec.Command("ffmpeg", "-i", fmt.Sprintf("%s%s%d.jpg", TempDirPath[0], VideoName, x),
                                "-i", fmt.Sprintf("%s%s%d.png", CCME.PathsToUse[1], CCME.VideoName, x),
                                "-filter_complex", "overlay", "-y", fmt.Sprintf("%s%s%d.jpg", TempDirPath[1], VideoName, x))

(Nota: -2 não precisa estar lá na maioria dos casos. O TempDir é feito em contém um subdiretório e arquivo de áudio que precisava ser contabilizado.)

Em seguida, Reconstruindo o vídeo baseado fora do framerate e videotype, pegou analisando a saída do arquivo ffmpeg -i:

cmdConstruct := exec.Command("ffmpeg", "-framerate", AudioFS[1], "-i", fmt.Sprintf("%s%s%%d.jpg", TempDirPath[1], VideoName),
                            "-c:v", "libx264", "-crf", "18", "-pix_fmt", "yuv420p", "-y",
                            "-vsync", "0", "-strict", "-2", fmt.Sprintf("%s%s.%s", CCME.PathsToUse[2], CCME.FinalVideoName, VideoFormat))

Usando esse método, o áudio também precisava ser adicionado novamente. No meu caso, simplesmente extrair o áudio do arquivo principal e alterá-lo sobre o novo vídeo funcionou para mim.

    
por 02.05.2018 / 01:29