2026-10-02 17:02:43 -05:00
<!doctype html>
< html lang = "en" > < meta charset = "utf-8" > < meta name = "viewport" content = "width=device-width" >
2026-10-02 21:47:13 -05:00
< meta http-equiv = "Content-Security-Policy" content = "default-src 'self'; connect-src 'self'; media-src 'self' blob:; style-src 'self'; object-src 'none'; base-uri 'none'" >
< title > A/V Test< / title >
2026-10-02 17:02:43 -05:00
< link rel = "stylesheet" href = "style.css" >
2026-10-02 21:47:13 -05:00
< main > < h1 > A/V Test< / h1 >
2026-10-11 11:35:36 -05:00
< p > Select a camera and microphone. Numeric metrics report automatically; audio and video never upload.< / p >
2026-10-02 17:02:43 -05:00
< div > < button id = "devices" > Choose devices…< / button >
< label > Video < select id = "video-device" > < / select > < / label >
< label > Microphone < select id = "audio-device" > < / select > < / label > < / div >
< div > < button id = "start" disabled > Start 2-minute check< / button > < button id = "stop" disabled > Stop< / button > < button id = "export" disabled > Save metrics< / button > < / div >
2026-10-03 16:21:28 -05:00
< label title = "Recognize externally supplied coded colors and tones. Reports a diagnostic processing-time estimate, not calibrated lip sync or latency." > < input id = "paired-signal" type = "checkbox" > Paired test signal< / label >
2026-10-11 11:35:36 -05:00
< label title = "Optional browser-only A/V replay and download. Off by default. Cleared on the next test or page close. Recording uses extra browser resources and can affect timing; it does not establish calibrated sync. Limited to 3 minutes and 128 MiB." > < input id = "record-review" type = "checkbox" > Record for review< / label >
2026-10-02 17:02:43 -05:00
< p id = "status" role = "status" > Stopped< / p >
2026-10-02 21:47:13 -05:00
< p id = "report-status" role = "status" > Reporting starts with the test.< / p >
2026-10-02 17:02:43 -05:00
< video id = "preview" autoplay muted playsinline > < / video >
2026-10-11 11:35:36 -05:00
< p id = "record-status" role = "status" > Not recording< / p >
< section id = "review" hidden aria-label = "Local recording review" >
< h2 > Review< / h2 >
< video id = "replay" controls playsinline > < / video >
< div > < a id = "download-recording" > Download clip< / a > < button id = "discard-recording" > Clear clip< / button > < / div >
< / section >
2026-10-02 17:02:43 -05:00
< pre id = "metrics" > No observations.< / pre >
2026-10-02 21:47:13 -05:00
< p > Audio/video sync and end-to-end delay: < strong > not measured by this check< / strong > .
2026-10-02 17:02:43 -05:00
Video callback gaps can include browser scheduling. Silence is not proof of audio loss.
2026-10-02 21:47:13 -05:00
A separate paired-signal measurement is needed to verify synchronization.< / p >
2026-10-02 17:02:43 -05:00
< / main > < script type = "module" src = "observer.js" > < / script > < / html >