修改了前端界面,增加了编码方式和硬件编码器的选择,并添加了播放按钮和转码进度显示。同时在后端引入了fluent-ffmpeg库来处理视频转码,并使用WebSocket实时传输转码进度信息到前端。
This commit is contained in:
@@ -9,8 +9,6 @@
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;600;800&display=swap" rel="stylesheet">
|
||||
<link rel="stylesheet" href="/css/style.css">
|
||||
<!-- hls.js for HLS streaming support -->
|
||||
<script src="https://cdn.jsdelivr.net/npm/hls.js@latest"></script>
|
||||
</head>
|
||||
<body>
|
||||
<div class="background-effects">
|
||||
@@ -21,7 +19,7 @@
|
||||
<div class="container">
|
||||
<header>
|
||||
<h1>S3 Media <span>Transcoder</span></h1>
|
||||
<p>Seamlessly stream videos from AWS S3 dynamically via FFmpeg HLS Transcoding</p>
|
||||
<p>Seamlessly transcode videos from AWS S3 to MP4 for browser playback</p>
|
||||
</header>
|
||||
|
||||
<main class="dashboard">
|
||||
|
||||
@@ -246,7 +246,7 @@ document.addEventListener('DOMContentLoaded', () => {
|
||||
if (data.error) throw new Error(data.error);
|
||||
|
||||
if (!wsConnected) {
|
||||
pollForHlsReady(key, data.hlsUrl);
|
||||
pollForHlsReady(key, data.mp4Url);
|
||||
}
|
||||
} catch (err) {
|
||||
console.error(err);
|
||||
@@ -254,7 +254,7 @@ document.addEventListener('DOMContentLoaded', () => {
|
||||
}
|
||||
};
|
||||
|
||||
// Poll the backend to check if the generated m3u8 file is accessible
|
||||
// Poll the backend to check if the generated MP4 file is accessible
|
||||
const pollForHlsReady = (key, hlsUrl) => {
|
||||
let attempts = 0;
|
||||
const maxAttempts = 120; // 60 seconds max wait for first segment
|
||||
@@ -291,35 +291,22 @@ document.addEventListener('DOMContentLoaded', () => {
|
||||
}
|
||||
};
|
||||
|
||||
// Initialize HLS Player
|
||||
// Initialize MP4 Player
|
||||
const playHlsStream = (url) => {
|
||||
transcodingOverlay.classList.add('hidden');
|
||||
videoPlayer.classList.remove('hidden');
|
||||
playBtn.classList.add('hidden');
|
||||
resetProgress();
|
||||
|
||||
if (Hls.isSupported()) {
|
||||
const hls = new Hls();
|
||||
hls.loadSource(url);
|
||||
hls.attachMedia(videoPlayer);
|
||||
hls.on(Hls.Events.MANIFEST_PARSED, () => {
|
||||
if (playBtn) {
|
||||
playBtn.disabled = false;
|
||||
playBtn.textContent = 'Play';
|
||||
playBtn.classList.remove('hidden');
|
||||
}
|
||||
});
|
||||
} else if (videoPlayer.canPlayType('application/vnd.apple.mpegurl')) {
|
||||
// Safari uses native HLS
|
||||
videoPlayer.src = url;
|
||||
videoPlayer.addEventListener('loadedmetadata', () => {
|
||||
if (playBtn) {
|
||||
playBtn.disabled = false;
|
||||
playBtn.textContent = 'Play';
|
||||
playBtn.classList.remove('hidden');
|
||||
}
|
||||
}, { once: true });
|
||||
}
|
||||
videoPlayer.src = url;
|
||||
videoPlayer.load();
|
||||
videoPlayer.addEventListener('loadedmetadata', () => {
|
||||
if (playBtn) {
|
||||
playBtn.disabled = false;
|
||||
playBtn.textContent = 'Play';
|
||||
playBtn.classList.remove('hidden');
|
||||
}
|
||||
}, { once: true });
|
||||
};
|
||||
|
||||
// Bind events
|
||||
|
||||
Reference in New Issue
Block a user