Low latency by default
Tuned LL-HLS playback ~2 s behind the live edge, with catch-up, drift ceiling, and stall-free start built in. No knobs required.
Low-latency HLS + DRM playback by Oddin.gg — a copy-paste iframe or a typed JavaScript SDK, around five seconds glass-to-glass.
<!-- Quickest possible integration — see the guide for production hardening. -->
<iframe
src="https://player-dev.oddin-video.gg/embed/?baseUrl=https%3A%2F%2Ffeed-dev.oddin-video.gg&matchUrn=od%3Amatch%3A1234&apiKey=pk_test_your_key"
allow="autoplay; encrypted-media; picture-in-picture; fullscreen"
allowfullscreen
referrerpolicy="no-referrer"
style="border: 0; width: 100%; aspect-ratio: 16 / 9"
></iframe>import { mountEmbed } from '@oddin-gg/havik-player';
const embed = mountEmbed({
container: document.querySelector('#player')!,
src: 'https://player-dev.oddin-video.gg/embed/',
baseUrl: 'https://feed-dev.oddin-video.gg',
matchUrn: 'od:match:1234',
apiKey: 'pk_test_your_key', // dev only — see the embed guide
onEvent: (msg) => console.log(msg.type),
});
embed.play();import { createPlayer } from '@oddin-gg/havik-player';
const player = await createPlayer({
video: document.querySelector('video')!,
baseUrl: 'https://feed-dev.oddin-video.gg',
matchUrn: 'od:match:1234',
credential: { apiKey: 'pk_test_your_key' },
muted: true,
waitForLive: true,
});import { resolveStream, licenseRequestHeaders } from '@oddin-gg/havik-player';
const cred = { apiKey: 'pk_test_your_key' };
const stream = await resolveStream({
baseUrl: 'https://feed-dev.oddin-video.gg',
matchUrn: 'od:match:1234',
credential: cred,
waitForLive: true,
});
// stream = { manifestUrl, drm: { widevine: { licenseUrl } }, … } — feed it to
// YOUR player and attach licenseRequestHeaders(stream, cred) on license calls.
// Full hls.js wiring: see the Bring-your-own-player guide.Your api-key only works from origins Oddin has allow-listed — onboard your domains before the first play. Streams need a match URN and a publishable api-key; both come with onboarding.