Хотя ссылка на @Mulvya https://video.stackexchange.com/q/16552/1871 действительно отвечает на вопрос ffmpeg
:
ffmpeg -i input \ -vf "tblend=average,framestep=2,tblend=average,framestep=2,setpts=0.25*PTS" \ -r srcfps - output
... обратите внимание, что ( https://ffmpeg.org/ffmpeg-filters.html ):
Фильтр tblend (смешение по времени) берет два последовательных кадра из одного потока и выводит результат, полученный путем смешивания нового кадра поверх старого кадра.
Таким образом, он смешивает только два кадра, что означает, что для смешивания четырех кадров вы должны повторить tblend=average,framestep=2
дважды, как в примере выше.
Но я хочу смешать 700 изображений входного кадра на каждое изображение выходного кадра (и я сомневаюсь, что tblend=average,framestep=2
повторные 350+ раз будут правильно проанализированы ffmpeg
). Поэтому я решил сначала распаковать кадры, а затем выполнить собственную обработку с использованием Python. Распаковать:
mkdir ofrs # original frames mkdir outfrs # out frames ffmpeg -i myvideo.mp4 ofrs/img-%05d.png
... а потом я использую этот скрипт Python с python blendManyImages.py
; поскольку наличие в изображении каждого изображения с равным весом не дает нужных мне функций изображения, в этих сценариях используется формула, которая придает больший вес изображениям, находящимся ранее в потоке:
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
И как только эта последовательность изображений выходного кадра будет вычислена, можно сделать из нее видео, снова используя ffmpeg
:
ffmpeg -framerate 60 -i outfrs/img-%02d.png output.mp4