File size: 2,045 Bytes
da72558
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
"""Headless end-to-end check. Runs before app.py exists, and keeps working after."""
import argparse, pathlib, sys, time
sys.path.insert(0, str(pathlib.Path(__file__).parent))
import rife_core as R


def main() -> int:
    ap = argparse.ArgumentParser()
    ap.add_argument("src")
    ap.add_argument("-o", "--out", default="out.mp4")
    ap.add_argument("-x", "--factor", type=int, default=2)
    ap.add_argument("--budget", type=float, default=100.0, help="seconds per segment")
    a = ap.parse_args()

    clip = R.probe(a.src)
    print(f"[probe]  {clip.width}x{clip.height} {clip.fps:.3f}fps "
          f"{clip.frames} frames {clip.duration:.2f}s")

    be = R.OnnxBackend()
    print(f"[backend] {be.name}, {R.CPUS} threads")
    rate = R.measure_rate(be, clip.height, clip.width)
    new_frames = clip.frames * (a.factor - 1)
    print(f"[rate]   {rate:.3f} s/frame -> est {rate*new_frames:.1f}s "
          f"for {new_frames} generated frames")

    seg_s = R.plan_segments(clip, a.factor, rate, a.budget)
    nseg = max(1, int(clip.duration / seg_s + 0.999))
    print(f"[plan]   {nseg} segment(s) of {seg_s:.2f}s")

    parts, t0 = [], time.time()
    tmpdir = pathlib.Path(a.out).parent / "_segs"
    tmpdir.mkdir(exist_ok=True)
    total = 0
    for i in range(nseg):
        p = str(tmpdir / f"seg{i:04d}.mp4")
        n = R.interpolate_segment(a.src, p, i * seg_s, seg_s, a.factor, be, clip)
        total += n
        parts.append(p)
        print(f"[+{time.time()-t0:6.1f}s] [{i+1}/{nseg}] {n} frames -> {pathlib.Path(p).name}")
    R.concat(parts, a.out)
    print(f"[done]   {total} frames in {time.time()-t0:.1f}s -> {a.out}")

    got = R.probe(a.out)
    print(f"[verify] {got.width}x{got.height} {got.fps:.3f}fps {got.frames} frames "
          f"{got.duration:.2f}s")
    ok = abs(got.fps - clip.fps * a.factor) < 0.5 and got.frames >= clip.frames * a.factor * 0.8
    print(f"[verify] fps x{a.factor} and frame count plausible: {ok}")
    return 0 if ok else 1


if __name__ == "__main__":
    raise SystemExit(main())