Audio out of sync: what causes it and what you can actually change
There is no audio delay slider in the app, and this article says so up front rather than sending you looking for one.
There is no audio delay control in the app. No slider, no keyboard nudge, no setting. I went looking for one before writing this. I could not find it: nothing in the code, nothing in the settings screens, nothing in the string catalogue. If you came here for that control, it does not exist, and knowing now saves you a search.
What this article can do is tell you which of 4 places your offset is coming from. 3 of them are fixable in your room, and only 1 would need the missing control.
Constant or growing?
Establish this first. It splits the causes cleanly.
A constant offset, the same at the start of a programme and 20 minutes in, and the same again tomorrow, is a latency problem. Something in the chain is adding a fixed delay to one signal and not the other.
A growing offset, fine at first and worse the longer you watch, is a clock problem in the stream itself. The audio and video timestamps are drifting apart at the source, and nothing downstream can correct that without resampling.
Growing drift is the provider's, and it is the 1 case of the 4 below that nothing in your room can fix. Try a different quality or a different server if your provider offers one. If the drift follows you across all of them, the encoder is the cause.
Timed against a clock on screen, the two look like this:
start of programme +250 ms +250 ms
20 minutes in +250 ms +900 ms
verdict latency clock drift at the source
The four places latency comes from
The display. The biggest and the most often missed. A television doing motion smoothing, noise reduction or upscaling holds frames in a buffer to do it, and that delays the picture while the sound goes straight through. This is why the same stream can be in sync on a monitor and out of sync on a television.
The fix is on the television: switch it to Game mode or PC mode, which disables most of that processing. On many sets this alone resolves the whole problem.
The receiver. Audio to a receiver and video straight to the screen is 2 paths with 2 latencies. Most receivers have a lip sync or audio delay setting for exactly this. That is the control this app does not have, and your receiver almost certainly does.
Passthrough. Turning audio passthrough on moves decoding out of the app and into your receiver, which changes the audio path's latency, usually by adding some. Toggle it as a test. If sync changes when passthrough goes on or off, the problem is in the audio path rather than the video one.
This is also why the console behaves differently. It always decodes to PCM, because its player build ships no module for passthrough and the platform does not allow third-party apps to bitstream anyway. A console and a desktop showing different sync on the same channel through the same receiver is consistent with that difference, not a fault.
The stream. Least common as a constant offset. Most common as a growing one.
What the app does have
An audio track selector, with automatic one-shot selection from your profile's default language. Check it if a channel carries several audio tracks: an alternate track can have different timing, and picking the primary one sometimes resolves an offset that looked structural.
A subtitle timing offset, clamped to plus or minus 60 seconds, on on-demand playback only. That shifts subtitles against video, not audio against video, so it will not help here. It is mentioned so you do not find it and assume it is the control you wanted.
Why the player does not detect this for you
The playback detector classifies 9 distinct faults. None of them is a synchronisation fault. It watches for stalls, freezes, black frames and rebuffering loops, all conditions where something stopped.
Drift is not a stop. Audio and video are both flowing, both decoding, both being presented; they just disagree about when. Detecting that reliably needs a reference the player does not have, and a detector that guessed would raise false alarms on every channel whose encoder is merely a little loose.
So this is a thing you diagnose, not a thing the app catches. Start with the television's picture processing. It accounts for more of these than everything else combined.
If the picture is not merely late but stopped while sound continues, that is a different and detected condition: sound but no picture, and video freezes while audio continues for the detection mechanics.
What this article measured22 claims, each with the evidence behind it
| Claim | Evidence | Counted |
|---|---|---|
| The app ships no audio delay or audio offset control. A subtitle timing offset exists and an audio track selector exists; neither shifts audio against video. | n = 1 | Aug 31, 2026 |
| The subtitle timing offset is clamped to plus or minus 60,000 milliseconds and is shown on on-demand playback only. | n = 1 | Aug 31, 2026 |
| Audio passthrough hands an undecoded bitstream to the receiver and opens the output device in exclusive mode, which moves decode latency out of the app and into hardware we cannot measure. | n = 1 | Aug 23, 2026 |
| The console decodes audio to PCM in all cases, because its player build ships no audio output module for passthrough and the platform does not permit third-party bitstreaming. | n = 1 | Aug 23, 2026 |
| Alternate audio track selection ships, with a sectioned track menu and a one-shot automatic selection from the profile's default language. | n = 1 | Aug 14, 2026 |
| The in-player video settings are one record shared by the live, film and episode players, applied live to the running player and persisted to a local file only when a Remember toggle is on. | n = 1 | Sep 1, 2026 |
| Every stored value is clamped into its valid range on load, defensively against a hand-edited file, and an unrecognised aspect mode falls back to Fit rather than being rejected. | n = 1 | Sep 1, 2026 |
| Two of the picture controls, sharpness and deinterlacing, cannot be applied to a stream already playing: they attach on the next stream open. | n = 2 | Sep 1, 2026 |
| Deinterlacing has three settings, Off, Auto and a forced Yadif, and defaults to Off. | n = 3 | Sep 1, 2026 |
| The playback rate control ranges from 0.5 to 2.0 and is documented as applying to films and episodes only, so it is not a lever on a live channel. | n = 1 | Sep 1, 2026 |
| The named picture profile is computed from the slider values rather than stored, because a persisted profile id would go stale the moment somebody moved a slider. | n = 1 | Sep 1, 2026 |
| Subtitle colour, size and screen position are applied when the player instance is created rather than per stream, because the text renderer reads its configuration once at construction and silently ignores the same switches supplied per media. | n = 1 | Sep 1, 2026 |
| Subtitle size is applied through a core text-scale option rather than a font size, so it also scales closed captions and other stream-styled text that a font default would not touch. | n = 1 | Sep 1, 2026 |
| A subtitle style left at its defaults emits no switches at all, keeping an untouched player byte-identical to earlier builds. | n = 1 | Sep 1, 2026 |
| Subtitle sourcing shipped behind a provider-neutral seam, with an online provider configured by key and a null implementation that keeps the dialog honest when nothing is configured. | n = 1 | Aug 24, 2026 |
| The live closed-caption picker is shown only when the stream genuinely carries a track, rather than being offered and then found empty. | n = 1 | Aug 17, 2026 |
| Automatic audio track selection from the profile's default language runs once per playback rather than continuously, so a manual change is not immediately overridden. | n = 1 | Aug 14, 2026 |
| Counters are permitted to stall for 5 seconds after a seek without raising suspicion, which is why scrubbing does not itself trigger a fault. | n = 1 | Sep 1, 2026 |
| The colour controls map directly onto the player's own adjust filter ranges: brightness and contrast 0 to 2, saturation 0 to 3, gamma 0.01 to 10, hue minus 180 to 180, all neutral at their midpoint. | n = 5 | Sep 1, 2026 |
| The colour adjustments are gated behind their own enable flag, so a stored set of slider values does nothing until that flag is on. | n = 1 | Sep 1, 2026 |
| Applying a named picture profile writes only the colour and sharpness values and deliberately leaves aspect, zoom, subtitle offset, deinterlacing, speed and the remember flag untouched. | n = 6 | Sep 1, 2026 |
| None of the nine classified playback faults is an audio-video synchronisation fault. The detector watches for stalls and freezes, not for drift. | n = 9 | Aug 31, 2026 |