diff --git a/skills/watch/scripts/frames.py b/skills/watch/scripts/frames.py index 18f0aa9..d8194e7 100755 --- a/skills/watch/scripts/frames.py +++ b/skills/watch/scripts/frames.py @@ -117,9 +117,10 @@ def _sync_option(executable: str) -> tuple[str, str]: result = run_text([executable, "-hide_banner", "-h", "full"], timeout=30) if result.returncode == 0: help_text = result.stdout + result.stderr - if re.search(r"(?m)^\s*-fps_mode\s", help_text): + # FFmpeg 9 lists options with stream specifiers, e.g. "-fps_mode[:]". + if re.search(r"(?m)^\s*-fps_mode\b", help_text): return "-fps_mode", "vfr" - if re.search(r"(?m)^\s*-vsync\s", help_text): + if re.search(r"(?m)^\s*-vsync\b", help_text): return "-vsync", "vfr" raise SystemExit(f"{executable} did not advertise -fps_mode or -vsync; check the FFmpeg installation. {diagnostic(result.stderr)}") diff --git a/tests/test_runtime.py b/tests/test_runtime.py index 0f5d8c8..9feba73 100644 --- a/tests/test_runtime.py +++ b/tests/test_runtime.py @@ -53,7 +53,7 @@ def test_invalid_probe_metadata(monkeypatch, data): frames.get_metadata('test.mp4') -@pytest.mark.parametrize('help_text,expected', [('-vsync set video sync', '-vsync'), ('-fps_mode set fps\n-vsync set sync', '-fps_mode'), ('-fps_mode set fps', '-fps_mode'), ('unknown option: fps_mode', None)]) +@pytest.mark.parametrize('help_text,expected', [('-vsync set video sync', '-vsync'), ('-fps_mode set fps\n-vsync set sync', '-fps_mode'), ('-fps_mode set fps', '-fps_mode'), ('-fps_mode[:] set framerate mode for matching video streams', '-fps_mode'), ('unknown option: fps_mode', None)]) def test_sync_capability_probe(monkeypatch, help_text, expected): calls = [] def help_run(cmd, **kw):