HTML5 audio and video player with full playback control, volume, seek, loop, and status API.
<iframe id="mp-demo" src="/online/webapp/media-player" width="100%" height="400" frameborder="0" style="border:1px solid #ccc; border-radius:4px;"></iframe>
<script>window._wsConnect('mp-demo', 'mpSocket');</script>
<iframe src="https://sgapps.io/online/webapp/media-player"
width="100%" height="400" frameborder="0"></iframe><iframe src="https://sgapps.io/online/webapp/media-player/url/aHR0cHM6Ly9leGFtcGxlLmNvbS92aWRlby5tcDQ="
width="100%" height="400" frameborder="0"></iframe>play, pause, stop -- Playback ControlBasic transport controls.
play starts playback from the current positionpause pauses without resetting positionstop pauses and seeks back to the beginningsocket.fire("webapp::instance::request", "play");
socket.fire("webapp::instance::request", "pause");
socket.fire("webapp::instance::request", "stop");<button onclick="window._ws('mpSocket')&&window.mpSocket.fire('webapp::instance::request','play')">Try: Play</button><button onclick="window._ws('mpSocket')&&window.mpSocket.fire('webapp::instance::request','pause')">Try: Pause</button><button onclick="window._ws('mpSocket')&&window.mpSocket.fire('webapp::instance::request','stop')">Try: Stop</button>
seek -- Seek to PositionJump to a specific time position in the media.
| Arg | Type | Description |
|---|---|---|
timeSeconds | number | Position in seconds |
callback | function | (err) |
socket.fire("webapp::instance::request", "seek", 30, function () {
console.log("Seeked to 30s");
});volume -- Get or Set VolumeWhen called with a number, sets the volume. When called with only a callback, returns the current volume.
| Arg | Type | Description |
|---|---|---|
level | number (optional) | 0 (muted) to 1 (full volume) |
callback | function | (err, currentVolume: number) |
// Set to 50%
socket.fire("webapp::instance::request", "volume", 0.5);
// Get current
socket.fire("webapp::instance::request", "volume", function (err, vol) {
console.log("Volume:", Math.round(vol * 100) + "%");
});<button onclick="window._ws('mpSocket')&&window.mpSocket.fire('webapp::instance::request','volume',0.25)">Try: 25% Volume</button><button onclick="window._ws('mpSocket')&&window.mpSocket.fire('webapp::instance::request','volume',1.0)">Try: 100% Volume</button>
mute -- Get or Set Mute| Arg | Type | Description |
|---|---|---|
muted | boolean (optional) | true to mute, false to unmute |
callback | function | (err, isMuted: boolean) |
socket.fire("webapp::instance::request", "mute", true); // mute
socket.fire("webapp::instance::request", "mute", false); // unmutegetStatus -- Get Playback StatusReturns a snapshot of the player's current state. Useful for building custom UI overlays.
socket.fire("webapp::instance::request", "getStatus", function (err, status) {
console.log(status);
// {
// paused: false,
// currentTime: 12.5,
// duration: 180,
// volume: 0.8,
// muted: false,
// playbackRate: 1,
// loop: false,
// readyState: 4,
// videoWidth: 1920,
// videoHeight: 1080
// }
});<button onclick="window._ws('mpSocket')&&window.mpSocket.fire('webapp::instance::request','getStatus',function(e,s){alert(JSON.stringify(s,null,2))})">Try: Get Status</button>
source -- Set Media SourceLoad a new media file. If the URL starts with /, it's resolved through the file system's readStreamUrl. Otherwise it's used as-is.
| Arg | Type | Description |
|---|---|---|
url | string | Media URL or file path |
callback | function | (err) |
socket.fire("webapp::instance::request", "source", "https://example.com/song.mp3");playbackRate -- Get or Set Speed| Arg | Type | Description |
|---|---|---|
rate | number (optional) | 0.5 = half speed, 1 = normal, 2 = double speed |
callback | function | (err, currentRate: number) |
socket.fire("webapp::instance::request", "playbackRate", 1.5); // 1.5x speed<button onclick="window._ws('mpSocket')&&window.mpSocket.fire('webapp::instance::request','playbackRate',0.5)">Try: 0.5x</button><button onclick="window._ws('mpSocket')&&window.mpSocket.fire('webapp::instance::request','playbackRate',1)">Try: 1x</button><button onclick="window._ws('mpSocket')&&window.mpSocket.fire('webapp::instance::request','playbackRate',2)">Try: 2x</button>
loop -- Get or Set Loop Mode| Arg | Type | Description |
|---|---|---|
enabled | boolean (optional) | true to loop, false to play once |
callback | function | (err, isLoop: boolean) |
socket.fire("webapp::instance::request", "loop", true); // enable loopingfullscreen -- Enter FullscreenRequests fullscreen mode for the video element.
socket.fire("webapp::instance::request", "fullscreen");<!DOCTYPE html>
<html>
<head><title>Custom Video Player</title></head>
<body>
<div style="display:flex;gap:8px;padding:10px;flex-wrap:wrap;">
<button id="play">Play</button>
<button id="pause">Pause</button>
<button id="status">Status</button>
<input id="seek" type="range" min="0" max="100" value="0">
<span id="time">0:00</span>
</div>
<iframe id="player" src="https://sgapps.io/online/webapp/media-player"
width="100%" height="400" frameborder="0"></iframe>
<script src="https://sgapps.io/components/window-socket/index.js"></script>
<script>
var socket = new WindowSocket(document.getElementById('player').contentWindow);
socket.start();
socket.on("webapp::connection::ping", function () {
socket.fire("webapp::instance::embed-mode", true);
});
document.getElementById('play').onclick = function () {
socket.fire("webapp::instance::request", "play");
};
document.getElementById('pause').onclick = function () {
socket.fire("webapp::instance::request", "pause");
};
document.getElementById('status').onclick = function () {
socket.fire("webapp::instance::request", "getStatus", function (err, s) {
document.getElementById('time').textContent =
Math.floor(s.currentTime) + 's / ' + Math.floor(s.duration) + 's';
});
};
document.getElementById('seek').oninput = function () {
socket.fire("webapp::instance::request", "getStatus", function (err, s) {
var time = (parseInt(document.getElementById('seek').value) / 100) * s.duration;
socket.fire("webapp::instance::request", "seek", time);
});
};
</script>
</body>
</html>