Javascript Client Side Video Converter

Lets Create a Progressive Web App (PWA) that converts videos entirely on the client-side without any server-side processing is a bit challenging due to the processing power and memory limitations of browsers, especially for large video files. However, for smaller videos or educational purposes, we can create a basic PWA that allows users to convert videos using JavaScript and the browser’s built-in capabilities.

Below is a simplified example of how you can create a PWA that converts videos from one format to another using the MediaRecorder API and HTML5 <video> element for recording and playback. This example will allow users to record a video using their device’s camera, convert it to another format, and download the converted video.

html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Video Converter PWA</title>
<style>
#videoElement {
width: 100%;
max-width: 640px;
}
</style>
</head>
<body>
<h1>Video Converter PWA</h1>
<input type="file" accept="video/*" id="fileInput">
<video id="videoElement" autoplay controls style="display: none;"></video>
<label for="outputFormat">Select Output Format:</label>
<select id="outputFormat">
<option value="mp4">MP4</option>
<option value="webm">WebM</option>
</select>
<button id="convertButton">Convert</button>
<a id="downloadLink" style="display: none;" download="converted_video.mp4">Download Converted Video</a>

<script>
let selectedFile;
let recordedChunks = [];

const fileInput = document.getElementById('fileInput');
const videoElement = document.getElementById('videoElement');
const outputFormatSelect = document.getElementById('outputFormat');
const convertButton = document.getElementById('convertButton');
const downloadLink = document.getElementById('downloadLink');

fileInput.addEventListener('change', function(event) {
selectedFile = event.target.files[0];
if (selectedFile) {
videoElement.src = URL.createObjectURL(selectedFile);
videoElement.style.display = 'block';
}
});

convertButton.addEventListener('click', function() {
if (!selectedFile) {
console.log('No file selected');
return;
}

const outputFormat = outputFormatSelect.value;

try {
const videoURL = URL.createObjectURL(selectedFile);
const video = document.createElement('video');
video.src = videoURL;
video.controls = true;
video.style.display = 'none';
document.body.appendChild(video);

video.addEventListener('loadedmetadata', function() {
const canvas = document.createElement('canvas');
const ctx = canvas.getContext('2d');
canvas.width = video.videoWidth;
canvas.height = video.videoHeight;
ctx.drawImage(video, 0, 0, canvas.width, canvas.height);
canvas.toBlob(function(blob) {
recordedChunks.push(blob);
const outputFileName = `converted_video.${outputFormat}`;
downloadLink.href = URL.createObjectURL(new Blob(recordedChunks, { type: `video/${outputFormat}` }));
downloadLink.download = outputFileName;
downloadLink.style.display = 'inline-block';
downloadLink.click();
}, `video/${outputFormat}`);
});

video.play();
} catch (error) {
console.error('Error converting video:', error);
}
});
</script>
</body>
</html>

Explanation:

  • The HTML now includes a dropdown menu (<select>) labeled “Select Output Format” where users can choose between “MP4” and “WebM” formats.
  • The JavaScript code retrieves the selected output format from the dropdown menu (outputFormatSelect.value).
  • The selected output format is used to set the type attribute when creating the output blob and the download attribute when setting the download link’s filename.
  • Users can now select the desired output format before converting the video.

This modification gives users the flexibility to choose the output video format according to their preferences.

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *