Example: HLS example code
Last modified: Tuesday May 21, 2024.
This example code enables you to view the live and recorded video streams from two cameras connected to your Alta Video deployment, and to view a bookmarked saved clip. The output can be viewed in a browser using <localhost>.
To view the camera streams:
- Create an Alta Video user with only the permissions needed for your stream type (live stream or playback ). Ensure that this user is assigned to a suitable, minimum permission, User Group.
- Modify the example code to match the information from your Alta Video deployment.
Values you need to change are:- <deploymentname> — The first part of the URL you use to access your Alta Video deployment.
- <region> — The second part of the URL you use to access your Alta Video deployment.
- <deviceGUID> — Find this information by using the Alta Video
Devices tool , and selecting the required camera. - <username> — The user name that has been set up with the minimum necessary permissions.
- <password> — The password for the user.
- Save the modified HTML file to a convenient location on your computer.
- If viewing across the web, ensure that you configure the CORS list. See Configure cross-origin resource sharing in Alta Video.
- From a Command Prompt, run the command
npx http-server -p 80
.
This creates a simple static HTTP server to enable you to test the example code locally. - Open a Chrome browser window, and enter
localhost/<location and filename>
The Demo page loads, and after a few seconds, the video streams are displayed.
The following example uses 3rd-party Javascript HLS client libraries from https://cdn.jsdelivr.net.
<DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Alta Video HLS Demo</title>
<style>
.video-container {
display: flex;
justify-content: space-between;
align-items: center;
gap: 20px;
}
.video-wrapper {
flex: 1;
text-align: center;
}
video {
width: 100%;
}
</style>
</head>
<body>
<h1>Alta Video HLS Demo</h1>
<div class="video-container">
<div class="video-wrapper">
<h2>Live video</h2>
<video id="video1" controls autoplay muted>
Your browser does not support the video tag.
</video>
</div>
<div class="video-wrapper">
<h2>Playback recorded video</h2>
<video id="video2" controls autoplay muted>
Your browser does not support the video tag.
</video>
</div>
<div class="video-wrapper">
<h2>Bookmarked saved clip</h2>
<video id="video3" controls autoplay muted>
Your browser does not support the video tag.
</video>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/hls.js@latest"></script>
<script>
function setupHlsPlayer(videoElementId, streamUrl, username, password) {
var hls = new Hls({
xhrSetup: function(xhr, url) {
var basicAuth = 'Basic ' + btoa(username + ':' + password);
xhr.setRequestHeader('Authorization', basicAuth);
xhr.withCredentials = true;
},
maxBufferLength: 120,
maxMaxBufferLength: 180,
maxBufferSize: 200 * 1024 * 1024,
maxBufferHole: 0.1,
lowBufferWatchdogPeriod: 1,
highBufferWatchdogPeriod: 5,
startLevel: -1,
capLevelToPlayerSize: true,
enableWorker: true,
liveSyncDurationCount: 3,
enableSoftwareAES: false,
debug: true
});
var video = document.getElementById(videoElementId);
video.autoplay = true;
video.muted = true;
if (Hls.isSupported()) {
hls.attachMedia(video);
hls.on(Hls.Events.MEDIA_ATTACHED, function () {
console.log(`video and hls.js are now bound together for ${videoElementId}!`);
hls.loadSource(streamUrl);
hls.on(Hls.Events.MANIFEST_PARSED, function(event, data) {
console.log(`manifest loaded for ${videoElementId}, found ${data.levels.length} quality levels`);
video.play();
});
});
hls.on(Hls.Events.ERROR, function (event, data) {
var errorType = data.type;
var errorDetails = data.details;
var errorFatal = data.fatal;
console.warn(`HLS error for ${videoElementId}: ${errorType} - ${errorDetails}`);
if (errorFatal) {
switch (data.type) {
case Hls.ErrorTypes.NETWORK_ERROR:
console.error(`Fatal network error encountered for ${videoElementId}, trying to recover...`);
hls.startLoad();
break;
case Hls.ErrorTypes.MEDIA_ERROR:
console.error(`Fatal media error encountered for ${videoElementId}, trying to recover...`);
hls.recoverMediaError();
break;
default:
hls.destroy();
break;
}
}
});
} else if (video.canPlayType('application/vnd.apple.mpegurl')) {
video.src = streamUrl;
video.addEventListener('canplay', function() {
video.play();
});
}
}
var streamUrl1 = 'https://<deploymentname>.stream.<region>.alta.avigilon.com/hls/streams/index?deviceId=<deviceGUID>';
var streamUrl2 = 'https://<deploymentname>.stream.<region>.alta.avigilon.com/hls/playback/index?deviceId=<deviceGUID>&startTimestamp=<timestamp>';
var streamUrl3 = 'https://<deploymentname>.stream.<region>.alta.avigilon.com/hls/bookmark/<BookmarkToken>&node=<source>/index';
setupHlsPlayer('video1', streamUrl1, '<username>', '<password>');
setupHlsPlayer('video2', streamUrl2, '<username>', '<password');
setupHlsPlayer('video3', streamUrl3, '<username>', '<password');
</script>
</body>
</html>
When developing your own integrations using hls.js or other HLS player libraries, ensure that you enable support for 3rd-party cookies on the XmlHttpRequest used by the player. The example shown achieves this by using xhr.withCredentials = true
.