import time import psutil import multiprocessing as mp from multiprocessing import Process def f(thread, duty, freq, q): p = psutil.Process() p.cpu_affinity([thread]) while True: while not q.empty(): duty = float(q.get()) t0 = time.time() while time.time() - t0 < duty / freq: pass t1 = time.time() dest = t0 + 1 / freq delay = dest - t1 if delay > 0: time.sleep(delay) if __name__ == '__main__': p = psutil.Process() threads = p.cpu_affinity() workers = [] ctx = mp.get_context('spawn') bpp = 4 width = 16 height = 4 fps = 2.0 gain = 1.0 for thread in threads: q = ctx.Queue() duty = 1 # Uncomment to fade from 0 to 100% from left to right # duty = (thread % width) / (width - 1) p = Process(target=f, args=(thread, duty, fps, q)) p.start() workers.append({"p": p, "q": q}) # ffmpeg -i input.mp4 -vf scale=16:4,hue=s=0 -r 2 -c:v rawvideo -pix_fmt rgb32 out.rgb # scale=width:height # -r : fps f = open("out.rgb", "rb") video = f.read() f.close() frames = len(video) // (bpp * width * height) for frame in range(frames): for j, worker in enumerate(workers): pixel = video[frame * bpp * width * height + j * bpp] / 256. * gain worker["q"].put(1.0 - pixel) time.sleep(1 / fps) for worker in workers: worker["p"].kill()