Works on any site
HTML, WordPress, PHP, Laravel, React, or a static landing page.
A streaming-style video player for your website. Embed trailers, VOD, or HLS streams with quality selection, ads, chapters, captions, and share — using one script and a simple configuration object.
For website owners
PlayerV is the player you drop into a page. You provide video URLs (and optional ads / chapters). Visitors get a polished YouTube-like experience — play, seek, quality, captions, fullscreen, and more.
HTML, WordPress, PHP, Laravel, React, or a static landing page.
Load playerv.js from axwb.ro, then call PlayerV.create.
Titles, sources, ads, and features are options you pass in — no custom UI coding required.
CDN base:
https://axwb.ro/
— player script:
https://axwb.ro/v1/playerv.js
Try it
Real PlayerV loaded from axwb.ro — sample clip hosted on this site (Sintel trailer, Blender Foundation).
Tip: open Settings for quality & speed · try Share · resume is on for this demo.
Generator
Tick the features you want, fill in your media URLs, then copy the generated config or HTML. Use Apply to demo to preview instantly above.
Product
Built-in controls and options available to every embed.
Play, pause, seek, volume, speed, mute, fullscreen, picture-in-picture, keyboard shortcuts.
Offer 480p / 720p / 1080p (or more). Viewers pick quality in Settings.
Adaptive .m3u8 streams with automatic quality switching.
Pre-roll / mid-roll / post-roll video ads, or VAST/VMAP tags from your ad server.
Named markers on the timeline so viewers jump to scenes.
WebVTT subtitles with size / color / background styling.
“Continue watching” plus shareable links with a start time (?t=).
One-click copy of the current timestamp link.
Auto-pause after 5–45 minutes or at the end of the video.
AirPlay / Remote Playback where the device supports it.
Cinematic backdrop and theater layout on desktop pages.
Optional view counter and “next / related” cards when the video ends.
Getting started
Pick the method that matches your site. Most clients use Method 1.
<div id="player"> where the video should appear.
PlayerV.create('#player', { … }) with your video config.
<div id="player" style="width:100%;aspect-ratio:16/9;background:#000"></div>
<script src="https://axwb.ro/v1/playerv.js" crossorigin="anonymous"></script>
<script>
PlayerV.create('#player', {
content: {
mode: 'mp4',
title: 'Official Trailer',
poster: 'https://media.example.com/poster.jpg',
mp4Qualities: [
{ id: '720p', label: '720p', height: 720, src: 'https://media.example.com/trailer-720.mp4' },
{ id: '1080p', label: '1080p', height: 1080, src: 'https://media.example.com/trailer-1080.mp4' }
]
},
resume: { enabled: true },
ambient: true,
share: true,
adBreaks: []
})
</script>
Best when your CMS or security policy blocks custom scripts. Your page only includes an iframe.
<iframe
src="https://axwb.ro/v1/frame.html?config=ENCODED_JSON"
title="Video"
style="width:100%;aspect-ratio:16/9;border:0;background:#000"
allow="fullscreen; autoplay; picture-in-picture"
allowfullscreen
></iframe>
ENCODED_JSON is your configuration object turned into a URL-encoded JSON string.
Ask your developer or PlayerV contact to generate it, or build it in your backend
(encodeURIComponent(JSON.stringify(config))).
<div
data-playerv
data-config='{"content":{"mode":"mp4","title":"Trailer","mp4Qualities":[{"id":"720p","label":"720p","height":720,"src":"https://media.example.com/v.mp4"}]},"adBreaks":[]}'
style="width:100%;aspect-ratio:16/9;background:#000"
></div>
<script src="https://axwb.ro/v1/playerv.js" crossorigin="anonymous"></script>
<script src="/path/to/playerv-init.js"></script>
playerv-init.js only needs:
document.addEventListener('DOMContentLoaded', () => PlayerV.autoInit())
Configuration
Host your media on any HTTPS video CDN. Then describe it in the config you pass to PlayerV.
{
"content": {
"mode": "mp4",
"title": "Official Trailer",
"poster": "https://media.example.com/poster.jpg",
"mp4Qualities": [
{ "id": "720p", "label": "720p", "height": 720, "src": "https://media.example.com/t-720.mp4" },
{ "id": "1080p", "label": "1080p", "height": 1080, "src": "https://media.example.com/t-1080.mp4" }
]
},
"resume": { "enabled": true },
"adBreaks": []
}
{
"content": {
"mode": "hls",
"title": "Feature film",
"poster": "https://media.example.com/poster.jpg",
"hlsUrl": "https://media.example.com/master.m3u8"
},
"live": false,
"adBreaks": []
}
{
"content": { "mode": "mp4", "title": "Trailer", "mp4Qualities": [/* … */] },
"adBreaks": [
{
"id": "pre",
"type": "preroll",
"ads": [{
"id": "ad1",
"title": "Sponsor",
"src": "https://media.example.com/ads/pre.mp4",
"skipAfterSeconds": 5,
"clickThroughUrl": "https://sponsor.example.com"
}]
},
{
"id": "mid",
"type": "midroll",
"offsetSeconds": 60,
"ads": [{
"id": "ad2",
"src": "https://media.example.com/ads/mid.mp4",
"skipAfterSeconds": 5
}]
}
]
}
Prefer an ad server? Use
"ads": { "vastTagUrl": "https://yoursite.com/ads/vast.xml" }
instead of (or in addition to) local adBreaks.
{
"content": {
"mode": "mp4",
"title": "Episode 1",
"poster": "https://media.example.com/poster.jpg",
"mp4Qualities": [/* … */],
"captions": [
{ "src": "https://media.example.com/en.vtt", "label": "English", "srclang": "en", "default": true }
]
},
"chapters": [
{ "time": 0, "title": "Cold open" },
{ "time": 90, "title": "Title" },
{ "time": 240, "title": "Climax" }
],
"stats": {
"viewsKey": "show-s1e1",
"description": "Season 1 · Episode 1"
},
"endScreen": {
"next": { "title": "Episode 2", "href": "/watch/s1e2", "poster": "https://media.example.com/ep2.jpg" }
},
"resume": { "enabled": true, "key": "show-s1e1" },
"ambient": true,
"share": true,
"cast": true,
"sleepTimer": true,
"events": true,
"adBreaks": []
}
Reference
The settings clients use most often. All are optional except content.
| Option | What it does | Example |
|---|---|---|
content |
Video source, title, poster, captions | mode: "mp4" | "hls" |
adBreaks |
Local video ads (pre / mid / post) | See Configure → With ads |
ads.vastTagUrl |
Remote VAST tag | Your ad-tag URL |
chapters |
Timeline chapter markers | [{ time: 0, title: "Start" }] |
resume |
“Continue watching” prompt | { enabled: true } |
share |
Show share button | true (default) |
cast |
Show cast / AirPlay control | true (default) |
sleepTimer |
Sleep timer in Settings | true (default) |
ambient |
Blurred cinematic backdrop | true |
theater / miniPlayer |
Layout modes on desktop | Set false inside tight layouts / iframes |
stats.viewsKey |
Built-in view counter key | "trailer-42" |
events |
Fire JS events (play, complete, …) | true |
startTime |
Start at a given second | 30 |
const player = PlayerV.create('#player', config)
player.play()
player.pause()
player.seek(45)
player.on('complete', () => { /* video finished */ })
player.destroy() // remove when leaving the page (SPA)
FAQ
Answers for marketing, CMS, and site owners.
No. You only load playerv.js and pass a configuration. React is already inside the player file.
On your media host or CDN (MP4 files or an HLS playlist). PlayerV only plays the HTTPS URLs you put in the config.
Always use
https://axwb.ro/v1/playerv.js.
Prefer /v1/ in production — not /latest/.
Yes. Any page that can include a script or an iframe works. If the CMS blocks scripts, use the iframe method.
Either list MP4 ad creatives in adBreaks, or point ads.vastTagUrl to your VAST tag. Mid-rolls appear as markers on the progress bar; viewers can skip after the configured delay.
Set flags to false, e.g. share: false, cast: false, sleepTimer: false, theater: false.
Yes — iOS Safari and Android Chrome are supported. Autoplay usually requires starting muted (muted: true, autoplay: true).
The media server must allow your website origin (CORS) for the playlist and segments, and URLs must be HTTPS.
About 850 KB uncompressed (~265 KB gzipped), including the UI and HLS support. Your CDN should serve it compressed.
Client guide:
https://axwb.ro/
· Player script:
https://axwb.ro/v1/playerv.js
· iframe:
https://axwb.ro/v1/frame.html?config=…