import subprocess, sys, statistics
def frames_raw(f, vf, w, h):
    raw = subprocess.run(["ffmpeg","-v","error","-i",f,"-vf",vf,"-pix_fmt","gray","-f","rawvideo","-"],
                         capture_output=True).stdout
    fs=w*h
    return [raw[i*fs:(i+1)*fs] for i in range(len(raw)//fs) if len(raw[i*fs:(i+1)*fs])==fs], w, h
def best_shift(rowa, rowb, maxd=10):
    best=(None,1e9)
    n=len(rowa)
    for d in range(-maxd,maxd+1):
        x0=max(0,-d); x1=min(n,n-d)
        s=sum(abs(rowa[x]-rowb[x+d]) for x in range(x0,x1))/(x1-x0)
        if s<best[1]: best=(d,s)
    return best
for f in sys.argv[1:]:
    # x-t：天空横条带取每帧的行平均 -> 水平漂移
    W,H=512,32
    fr,_,_ = frames_raw(f, "crop=iw:ih*0.14:0:ih*0.04,scale=%d:%d"%(W,H), W, H)
    rows=[[sum(fr[i][y*W:(y+1)*W])/W for y in range(1)][0:0] for i in range(0)]  # placeholder
    band=[]
    for i in range(len(fr)):
        px=fr[i]; row=[sum(px[y*W:(y+1)*W])/W for y in range(H)]
        band.append(row)
    hsh=[best_shift(band[i-1],band[i])[0] for i in range(1,len(band))]
    # y-t：竖直条带取每帧的列平均 -> 垂直漂移
    W2,H2=16,512
    fr2,_,_ = frames_raw(f, "crop=iw*0.12:ih:iw*0.44:0,scale=%d:%d"%(W2,H2), W2, H2)
    cols=[]
    for i in range(len(fr2)):
        px=fr2[i]; col=[sum(px[y*W2:(y+1)*W2])/W2 for y in range(H2)]
        cols.append(col)
    vsh=[best_shift(cols[i-1],cols[i])[0] for i in range(1,len(cols))]
    mh=statistics.mean(hsh); mv=statistics.mean(vsh)
    print("%-42s 水平漂移=%+.2f px/帧(512宽)  垂直漂移=%+.2f px/帧(512高)  水平/垂直=%.2f" %
          (f.split('/')[-1], mh, mv, abs(mh)/max(abs(mv),1e-6)))
