修复编码器错乱的问题

This commit is contained in:
CN-JS-HuiBai
2026-04-03 01:59:39 +08:00
parent 517814610d
commit 2a0ec0ead5
3 changed files with 191 additions and 23 deletions

View File

@@ -82,6 +82,8 @@ document.addEventListener('DOMContentLoaded', () => {
let controlsHideTimeout = null;
let controlsHovered = false;
let controlsPointerReleaseTimeout = null;
let availableEncoders = [];
let defaultEncoder = 'software';
if (videoPlayer) {
videoPlayer.controls = false;
@@ -114,9 +116,43 @@ document.addEventListener('DOMContentLoaded', () => {
const createStreamSessionId = () => `${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;
const syncEncoderOptions = () => {
if (!encoderSelect) return;
const selectedCodec = codecSelect?.value || 'h264';
const previousValue = encoderSelect.value || defaultEncoder;
const supportedEncoders = availableEncoders.filter((encoder) => (
Array.isArray(encoder.availableCodecs) && encoder.availableCodecs.includes(selectedCodec)
));
encoderSelect.innerHTML = '';
if (supportedEncoders.length === 0) {
const option = document.createElement('option');
option.value = 'software';
option.textContent = 'Software';
encoderSelect.appendChild(option);
encoderSelect.disabled = true;
return;
}
supportedEncoders.forEach((encoder) => {
const option = document.createElement('option');
option.value = encoder.key;
option.textContent = encoder.label;
encoderSelect.appendChild(option);
});
encoderSelect.disabled = false;
const nextValue = supportedEncoders.some((encoder) => encoder.key === previousValue)
? previousValue
: (supportedEncoders.some((encoder) => encoder.key === defaultEncoder) ? defaultEncoder : supportedEncoders[0].key);
encoderSelect.value = nextValue;
};
const buildStreamUrl = (targetSeconds = null) => {
const codec = codecSelect?.value || 'h264';
const encoder = encoderSelect?.value || 'vaapi';
const encoder = encoderSelect?.value || defaultEncoder;
const streamSessionId = createStreamSessionId();
let streamUrl = `/api/stream?bucket=${encodeURIComponent(selectedBucket)}&key=${encodeURIComponent(selectedKey)}&codec=${encodeURIComponent(codec)}&encoder=${encodeURIComponent(encoder)}&streamSessionId=${encodeURIComponent(streamSessionId)}`;
if (typeof targetSeconds === 'number' && Number.isFinite(targetSeconds) && targetSeconds > 0) {
@@ -581,9 +617,12 @@ document.addEventListener('DOMContentLoaded', () => {
if (!res.ok) throw new Error('Failed to load config');
const data = await res.json();
const title = data.title || 'S3 Media Transcoder';
availableEncoders = Array.isArray(data.encoders) ? data.encoders : [];
defaultEncoder = data.defaultEncoder || 'software';
topBanner.textContent = title;
topBanner.classList.remove('hidden');
document.title = title;
syncEncoderOptions();
} catch (err) {
console.error('Config load failed:', err);
}
@@ -909,7 +948,7 @@ document.addEventListener('DOMContentLoaded', () => {
try {
const codec = codecSelect?.value || 'h264';
const encoder = encoderSelect?.value || 'vaapi';
const encoder = encoderSelect?.value || defaultEncoder;
if (!selectedBucket) throw new Error('No bucket selected');
const streamUrl = buildStreamUrl();
videoPlayer.src = streamUrl;
@@ -1122,6 +1161,9 @@ document.addEventListener('DOMContentLoaded', () => {
await fetchVideos(selectedBucket);
});
}
if (codecSelect) {
codecSelect.addEventListener('change', syncEncoderOptions);
}
// Initial state: require login before loading data
showLogin();