Enquanto o link do link @Mulvya realmente responde à pergunta com ffmpeg
:
ffmpeg -i input \
-vf "tblend=average,framestep=2,tblend=average,framestep=2,setpts=0.25*PTS" \
-r srcfps -{encoding parameters} output
... observe que ( link ):
The tblend (time blend) filter takes two consecutive frames from one single stream, and outputs the result obtained by blending the new frame on top of the old frame.
Então, apenas combina dois quadros, o que significa que para mesclar quatro quadros, você precisa repetir tblend=average,framestep=2
duas vezes, como no exemplo acima.
Mas, quero misturar 700 imagens de quadro de entrada por imagem de quadro de saída (e duvido que tblend=average,framestep=2
repetido 350+ vezes seja analisado corretamente por ffmpeg
). Então, decidi primeiro descompactar os quadros e depois fazer meu próprio processamento usando Python. Para desempacotar:
mkdir ofrs # original frames
mkdir outfrs # out frames
ffmpeg -i myvideo.mp4 ofrs/img-%05d.png
... e então eu uso este script python com python blendManyImages.py
; já que ter cada imagem com o mesmo peso na mesclagem não resultou nos recursos de imagem necessários, esse script usa uma fórmula que dá maior peso às imagens anteriores no fluxo:
python blendManyImages.py
:
# http://stackoverflow.com/questions/25102461/python-rgb-matrix-of-an-image
# http://stackoverflow.com/questions/40810716/how-to-get-a-list-of-float-rgba-pixels-values-using-pillow
from PIL import Image
import numpy
import math
# open an image, to get the data size:
im = Image.open('ofrs/img-00001.png')
#~ data = numpy.asarray(im)
data = numpy.array(im) # same as .asarray
print("Array dimensions: %s"%(repr(data.shape)))
data = data.astype(float)
print("[20, 30]=%s"%(repr(data[20, 30])))
#~ print(data)
#[[[240. 240. 240.]
# [240. 240. 240.] ...
#~ data = numpy.divide(data, 255.0)
#[[[ 0.94117647 0.94117647 0.94117647]
# [ 0.94117647 0.94117647 0.94117647] ...
# erase data:
data.fill(0)
#~ print(data)
inputframes = 44100
outptframes = 60
decimate = inputframes/outptframes # 735
k = 1.0/decimate # 0.001360
print(decimate, k)
i = 1 # input frame counter
o = 1 # output frame counter
while i <= 44100:
data.fill(0)
for dcnt in xrange(0, decimate):
ifname = "ofrs/img-%05d.png"%(i)
#print(ifname)
tdata = numpy.divide(numpy.array(Image.open(ifname)).astype(float), 255.0)
# manually tuned formula: give more weight to earlier frames
data += numpy.multiply(tdata, k*70*pow(math.e,-0.05*dcnt))
i = i+1
# data should be done here; save
ofname = "outfrs/img-%02d.png"%(o)
print(ofname)
oim = Image.fromarray(numpy.multiply(data, 255).astype('uint8')).convert('RGB')
oim.save(ofname)
o = o+1
E, assim que a sequência de imagens do quadro de saída é calculada, pode-se fazer um vídeo, usando novamente ffmpeg
:
ffmpeg -framerate 60 -i outfrs/img-%02d.png output.mp4