ffmpeg rende l'animazione di sovrapposizione liscia


0

sto usando l'ultima versione di ffmpeg e ho aggiunto la sovrapposizione di immagini al video e sto cercando di animare la sovrapposizione di immagini sul video, funziona bene ma il movimento di sovrapposizione non è liscio è tremolante / glitch, quindi qualsiasi idea su come rendere l'animazione liscia

ffmpeg.exe -y -i small.mp4 -loop 1  -i google.png -filter_complex   [1]fade=t=in:st=1:d=1,fade=t=out:st=4.6:d=1[over1];[0:v][over1]overlay=x=20+((t-1)*85):shortest=1:y=66+((t-1)*23.04):enable='between(t,1,5.6)' -c:v libx264 output.mp4

input video: http://techslides.com/demos/sample-videos/small.mp4

Immagine : https://i.imgur.com/yLqJciB.png

uscita video: https://vimeo.com/286859270

Aggiornamento: spiegazione del fattore di sovrapposizione

x = 20 + ((t-1) * 85): breve = 1: y = 66 + ((t-1) * 23.04)

85? 23.04?

85 e 23.04 è la velocità di spostamento x e y attraverso la quale devo raggiungere la destinazione x_end e y_end da x_start e y_start

x_start = 20, y_start = 66

x_end = 411, y_end = 172

x_diff = 391 y_diff = 106

overlay_start_time = 1 overlay_end_time = 5.6

duration = overlay_end_time - overlay_start_time

durata = 5,6 - 1

durata = 4.6

shift_x_rate = x_diff / duration

shift_x_rate = 391 / 4.6 = 85

shift_y_rate = y_diff / duration

shift_y_rate = 106 / 4.6 = 23.04

x = x_start + (t-overlay_start_time) * shift_x_rate

x = 20 + (t-1) * 85

lascia se t = 5.6

x = 20 + (5.6-1) * 85

x = 411 // destinazione x

y = y_start + (t-overlay_start_time) * shift_y_rate

y = 66 + (t-1) * 23.04

lascia se t = 5.6

y = 66 + (5.6-1) * 23.04

y = 171 // destinazione y

Risposte:


1

Ci sono più problemi qui:

a) sebbene le espressioni siano continue e uniformi nel tempo, il video è una serie di frame discreti, quindi la serie effettiva di valori temporali viene quantizzata. Quindi, la velocità del movimento dovrebbe essere un multiplo integrale del framerate del video, in termini di x-pixel / sec e y-pixel / sec. In questo modo, il delta xey in ogni fotogramma è costante, producendo così un movimento rettilineo. Nel tuo caso, questi differiscono fotogramma per fotogramma a causa del troncamento.

b) dovuto a chroma subsampling , la posizione finale valutata dell'overlay è soggetta a un ulteriore arrotondamento fino a un valore pari. Quindi, calcolato (314,6,56,3) verrà arrotondato a (314,56) e (316,8,57,4) verrà arrotondato a (316,56) ottenendo così un movimento orizzontale in quel fotogramma anche se il delta puro delle espressioni è inclinato. La soluzione consiste nel dire che l'overlay viene emesso con un campionamento completo del croma e downconvert in seguito.

Questi problemi sono in gioco durante tutte le animazioni di sovrapposizione, ma poiché il tuo video ha una bassa risoluzione, il glitch è visibile in modo visibile. Il tuo video è a 30 fps, quindi ho impostato x e y delta a multipli di quello.

Così,

ffmpeg.exe -y -i small.mp4 -loop 1 -i google.png -filter_complex [1]fade=t=in:st=0.9:d=1,fade=t=out:st=4.6:d=1[over1];[0:v][over1]overlay=x=20+((t-0.9)*60):shortest=1:y=66+((t-0.9)*30):enable='between(t,0.9,5.6)':format=yuv444,format=yuv420p -c:v libx264 output.mp4

la sovrapposizione ora è liscia con framerate * 60 con x e * 30 con y, ho usato 68 e 18.6 perché dovevo raggiungere una destinazione specifica, ora con * 60 e * 30 l'overlay non raggiungerà la destinazione, ho aggiornato la domanda , se non ti dispiace puoi guardarlo, ho spiegato i due fattori su come li sto calcolando per raggiungere la destinazione, mi chiedo se devo usare framerate il loro posto come posso raggiungere a destinazione xy punti
user44570
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.