fix(waveform): add -readrate_initial_burst to eliminate audio lag
The decode head lagged the player by a constant ε (ffmpeg startup latency) because ffmpeg paced at -readrate <speed> started behind mpv and, advancing at the same rate, never caught up — bars were a few seconds behind for the entire playback. Add -readrate_initial_burst LEAD_SECONDS so ffmpeg emits 3s of audio immediately on start, then paces at realtime after. The decode head leads the player by a stable ~3s from the very first frame; read() samples at the exact player position and always finds fresh samples. Add a sustained render-loop test that simulates ~5s of real playback, asserting ffmpeg stays alive, the decode head maintains a positive lead, and read() returns full windows. Uses real wall-clock time (documented exception) since ffmpeg's decode pacing can't be tested deterministically.
This commit is contained in:
@@ -168,8 +168,9 @@ export function RealtimeWaveform(props: RealtimeWaveformProps) {
|
||||
if (!cava?.isReady || !reader?.running || !sampleBuffer) return;
|
||||
|
||||
// Sample the FFT window at the player's position, not the decode
|
||||
// head — the reader decodes independently and only the position clock
|
||||
// ties the bars to what's actually playing.
|
||||
// head — the reader decodes independently (paced at the player's
|
||||
// clock rate with a LEAD_SECONDS burst head start) and only the
|
||||
// position clock ties the bars to what's actually playing.
|
||||
const target = smoothPosition();
|
||||
const count = reader.read(sampleBuffer, target);
|
||||
// Never feed a partial FFT window to cava.
|
||||
|
||||
Reference in New Issue
Block a user