修改编码器命名规则
This commit is contained in:
@@ -54,11 +54,7 @@
|
|||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
<div class="codec-panel">
|
<div class="codec-panel">
|
||||||
<label for="decoder-select">视频解码器:</label>
|
<label for="encoder-select">编码加速:</label>
|
||||||
<select id="decoder-select"></select>
|
|
||||||
</div>
|
|
||||||
<div class="codec-panel">
|
|
||||||
<label for="encoder-select">硬件编码器:</label>
|
|
||||||
<select id="encoder-select"></select>
|
<select id="encoder-select"></select>
|
||||||
</div>
|
</div>
|
||||||
<div id="loading-spinner" class="spinner-container">
|
<div id="loading-spinner" class="spinner-container">
|
||||||
|
|||||||
@@ -10,10 +10,7 @@ document.addEventListener('DOMContentLoaded', () => {
|
|||||||
const loginPasswordInput = document.getElementById('login-password');
|
const loginPasswordInput = document.getElementById('login-password');
|
||||||
const loginBtn = document.getElementById('login-btn');
|
const loginBtn = document.getElementById('login-btn');
|
||||||
const loginError = document.getElementById('login-error');
|
const loginError = document.getElementById('login-error');
|
||||||
const decoderSelect = document.getElementById('decoder-select');
|
|
||||||
const encoderSelect = document.getElementById('encoder-select');
|
const encoderSelect = document.getElementById('encoder-select');
|
||||||
const decoderLabel = document.querySelector('label[for="decoder-select"]');
|
|
||||||
const encoderLabel = document.querySelector('label[for="encoder-select"]');
|
|
||||||
const playerOverlay = document.getElementById('player-overlay');
|
const playerOverlay = document.getElementById('player-overlay');
|
||||||
const transcodingOverlay = document.getElementById('transcoding-overlay');
|
const transcodingOverlay = document.getElementById('transcoding-overlay');
|
||||||
const videoPlayer = document.getElementById('video-player');
|
const videoPlayer = document.getElementById('video-player');
|
||||||
@@ -92,12 +89,7 @@ document.addEventListener('DOMContentLoaded', () => {
|
|||||||
if (playbackSpeed) {
|
if (playbackSpeed) {
|
||||||
videoPlayer.playbackRate = parseFloat(playbackSpeed.value) || 1;
|
videoPlayer.playbackRate = parseFloat(playbackSpeed.value) || 1;
|
||||||
}
|
}
|
||||||
if (decoderLabel) {
|
|
||||||
decoderLabel.textContent = '视频解码器:';
|
|
||||||
}
|
|
||||||
if (encoderLabel) {
|
|
||||||
encoderLabel.textContent = '视频编码器:';
|
|
||||||
}
|
|
||||||
|
|
||||||
const formatBytes = (bytes) => {
|
const formatBytes = (bytes) => {
|
||||||
if (!bytes || bytes === 0) return '0 B';
|
if (!bytes || bytes === 0) return '0 B';
|
||||||
@@ -143,7 +135,7 @@ document.addEventListener('DOMContentLoaded', () => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const buildHlsPlaylistUrl = () => {
|
const buildHlsPlaylistUrl = () => {
|
||||||
const decoder = decoderSelect?.value || 'auto';
|
const decoder = 'auto';
|
||||||
const encoder = encoderSelect?.value || 'h264_rkmpp';
|
const encoder = encoderSelect?.value || 'h264_rkmpp';
|
||||||
let streamUrl = `/api/hls/playlist.m3u8?bucket=${encodeURIComponent(selectedBucket)}&key=${encodeURIComponent(selectedKey)}&decoder=${encodeURIComponent(decoder)}&encoder=${encodeURIComponent(encoder)}`;
|
let streamUrl = `/api/hls/playlist.m3u8?bucket=${encodeURIComponent(selectedBucket)}&key=${encodeURIComponent(selectedKey)}&decoder=${encodeURIComponent(decoder)}&encoder=${encodeURIComponent(encoder)}`;
|
||||||
if (s3Username) streamUrl += `&username=${encodeURIComponent(s3Username)}`;
|
if (s3Username) streamUrl += `&username=${encodeURIComponent(s3Username)}`;
|
||||||
@@ -542,7 +534,6 @@ document.addEventListener('DOMContentLoaded', () => {
|
|||||||
topBanner.textContent = title;
|
topBanner.textContent = title;
|
||||||
topBanner.classList.remove('hidden');
|
topBanner.classList.remove('hidden');
|
||||||
document.title = title;
|
document.title = title;
|
||||||
populateSelect(decoderSelect, data.videoDecoders || [], data.defaultVideoDecoder || 'auto');
|
|
||||||
populateSelect(encoderSelect, data.videoEncoders || [], data.defaultVideoEncoder || 'h264_rkmpp');
|
populateSelect(encoderSelect, data.videoEncoders || [], data.defaultVideoEncoder || 'h264_rkmpp');
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.error('Config load failed:', err);
|
console.error('Config load failed:', err);
|
||||||
|
|||||||
27
server.js
27
server.js
@@ -76,31 +76,14 @@ const transcodeProcesses = new Map();
|
|||||||
const wsSubscriptions = new Map();
|
const wsSubscriptions = new Map();
|
||||||
|
|
||||||
const AVAILABLE_VIDEO_ENCODERS = [
|
const AVAILABLE_VIDEO_ENCODERS = [
|
||||||
{ value: 'libx264', label: 'libx264 (Software H.264)' },
|
{ value: 'h264_rkmpp', label: 'H.264(RKMPP HighSpeed)' },
|
||||||
{ value: 'libx265', label: 'libx265 (Software H.265)' },
|
{ value: 'hevc_rkmpp', label: 'H.265(RKMPP HighSpeed)' },
|
||||||
{ value: 'h264_nvenc', label: 'h264_nvenc (NVIDIA H.264)' },
|
{ value: 'libx264', label: 'H.264(Software Slow)' },
|
||||||
{ value: 'hevc_nvenc', label: 'hevc_nvenc (NVIDIA HEVC)' },
|
{ value: 'libx265', label: 'H.265(Software Slow)' }
|
||||||
{ value: 'h264_qsv', label: 'h264_qsv (Intel QSV H.264)' },
|
|
||||||
{ value: 'hevc_qsv', label: 'hevc_qsv (Intel QSV HEVC)' },
|
|
||||||
{ value: 'h264_vaapi', label: 'h264_vaapi (VAAPI H.264)' },
|
|
||||||
{ value: 'hevc_vaapi', label: 'hevc_vaapi (VAAPI HEVC)' },
|
|
||||||
{ value: 'h264_rkmpp', label: 'h264_rkmpp (RKMPP H.264)' },
|
|
||||||
{ value: 'hevc_rkmpp', label: 'hevc_rkmpp (RKMPP HEVC)' },
|
|
||||||
{ value: 'mjpeg_rkmpp', label: 'mjpeg_rkmpp (RKMPP MJPEG)' }
|
|
||||||
];
|
];
|
||||||
|
|
||||||
const AVAILABLE_VIDEO_DECODERS = [
|
const AVAILABLE_VIDEO_DECODERS = [
|
||||||
{ value: 'auto', label: 'Auto Select Decoder' },
|
{ value: 'auto', label: 'Auto Select Decoder' }
|
||||||
{ value: 'av1_rkmpp', label: 'av1_rkmpp (RKMPP AV1)' },
|
|
||||||
{ value: 'h263_rkmpp', label: 'h263_rkmpp (RKMPP H.263)' },
|
|
||||||
{ value: 'h264_rkmpp', label: 'h264_rkmpp (RKMPP H.264)' },
|
|
||||||
{ value: 'hevc_rkmpp', label: 'hevc_rkmpp (RKMPP HEVC)' },
|
|
||||||
{ value: 'mjpeg_rkmpp', label: 'mjpeg_rkmpp (RKMPP MJPEG)' },
|
|
||||||
{ value: 'mpeg1_rkmpp', label: 'mpeg1_rkmpp (RKMPP MPEG-1)' },
|
|
||||||
{ value: 'mpeg2_rkmpp', label: 'mpeg2_rkmpp (RKMPP MPEG-2)' },
|
|
||||||
{ value: 'mpeg4_rkmpp', label: 'mpeg4_rkmpp (RKMPP MPEG-4)' },
|
|
||||||
{ value: 'vp8_rkmpp', label: 'vp8_rkmpp (RKMPP VP8)' },
|
|
||||||
{ value: 'vp9_rkmpp', label: 'vp9_rkmpp (RKMPP VP9)' }
|
|
||||||
];
|
];
|
||||||
|
|
||||||
const getProgressKey = (key) => key.split('/').map(segment => segment.replace(/[^a-zA-Z0-9_\-]/g, '_')).join('/');
|
const getProgressKey = (key) => key.split('/').map(segment => segment.replace(/[^a-zA-Z0-9_\-]/g, '_')).join('/');
|
||||||
|
|||||||
Reference in New Issue
Block a user