修复编码器错乱的问题
This commit is contained in:
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user