From f032b8c798b8dd2b7e7a5ba046d325ccf6420290 Mon Sep 17 00:00:00 2001 From: mofeng-git Date: Sat, 1 Feb 2025 14:40:28 +0000 Subject: [PATCH] fix --- Makefile | 2 +- build/init.sh | 13 ++----- configs/janus/janus.plugin.ustreamer.jcfg | 4 -- configs/kvmd/override.yaml | 1 + web/kvm/index.html | 2 +- web/kvm/navbar-system.pug | 2 +- web/share/js/kvm/stream.js | 7 +--- web/share/js/kvm/stream_janus.js | 45 +++++++++++++++++++++++ 8 files changed, 54 insertions(+), 22 deletions(-) diff --git a/Makefile b/Makefile index f561d354..cc352ffc 100644 --- a/Makefile +++ b/Makefile @@ -294,7 +294,7 @@ run-build-dev: --push run-build-release: - $(DOCKER) buildx build -t registry.cn-hangzhou.aliyuncs.com/silentwind/kvmd -t silentwind0/kvmd:dev \ + $(DOCKER) buildx build -t registry.cn-hangzhou.aliyuncs.com/silentwind/kvmd -t silentwind0/kvmd \ --progress plain \ --platform linux/amd64,linux/arm64,linux/arm/v7 \ --build-arg CACHEBUST=$(date +%s) \ diff --git a/build/init.sh b/build/init.sh index 0b00cd85..a7e46035 100755 --- a/build/init.sh +++ b/build/init.sh @@ -188,15 +188,10 @@ EOF fi fi - # 设置默认视频模式为 mjpeg - if ! grep -q "mjpeg_default:" /etc/kvmd/override.yaml; then - cat >> /etc/kvmd/override.yaml << EOF - -streamer: - mjpeg_default: true # 首次访问默认使用 MJPEG 模式 - h264_bitrate: 5000 # 默认码率 5000 Kbps -EOF - log_info "已设置首次访问默认使用 MJPEG 模式" + if [ ! -z "$H264PRESET" ]; then + if sed -i "s/ultrafast/$H264PRESET/g" /etc/kvmd/override.yaml; then + log_info "H264 预设已设置为 $H264PRESET" + fi fi if [ ! -z "$VIDEOFORMAT" ]; then diff --git a/configs/janus/janus.plugin.ustreamer.jcfg b/configs/janus/janus.plugin.ustreamer.jcfg index 70e35ac4..e8b8b5e4 100644 --- a/configs/janus/janus.plugin.ustreamer.jcfg +++ b/configs/janus/janus.plugin.ustreamer.jcfg @@ -5,7 +5,3 @@ audio: { device = "hw:0" tc358743 = "/dev/video0" } -aplay: { - device = "plughw:UAC2Gadget,0" - check = "/run/kvmd/otg/uac2.usb0@meta.json" -} \ No newline at end of file diff --git a/configs/kvmd/override.yaml b/configs/kvmd/override.yaml index 6adad387..fae578cf 100644 --- a/configs/kvmd/override.yaml +++ b/configs/kvmd/override.yaml @@ -66,6 +66,7 @@ kvmd: - "--jpeg-sink-mode=0660" - "--h264-bitrate={h264_bitrate}" - "--h264-gop={h264_gop}" + - "--h264-preset=ultrafast" - "--slowdown" gpio: drivers: diff --git a/web/kvm/index.html b/web/kvm/index.html index 30b350c5..d85733e4 100644 --- a/web/kvm/index.html +++ b/web/kvm/index.html @@ -260,7 +260,7 @@ - Audio volume: + Audio volume: diff --git a/web/kvm/navbar-system.pug b/web/kvm/navbar-system.pug index 33740cfb..4affe185 100644 --- a/web/kvm/navbar-system.pug +++ b/web/kvm/navbar-system.pug @@ -68,7 +68,7 @@ li(id="system-dropdown" class="right") input(type="radio" id="stream-orient-radio-270" name="stream-orient-radio" value="270") label(for="stream-orient-radio-270") 270° tr(id="stream-audio" class="feature-disabled") - td Audio volume: + td(i18n="kvm_text19") Audio volume: td(class="value-slider") #[input(type="range" id="stream-audio-volume-slider" class="slider")] td(id="stream-audio-volume-value" class="value-number") tr(id="stream-mic" class="feature-disabled") diff --git a/web/share/js/kvm/stream.js b/web/share/js/kvm/stream.js index 95ab69c4..1ce85768 100644 --- a/web/share/js/kvm/stream.js +++ b/web/share/js/kvm/stream.js @@ -117,11 +117,6 @@ export function Streamer() { //hidden stream-record-stop-button document.getElementById('stream-record-stop-button').disabled = true; - - // 修改这里:设置默认模式为 mjpeg - let defaultMode = "mjpeg"; - let mode = tools.storage.get("stream.mode", defaultMode); - tools.radio.clickValue("stream-mode-radio", mode); }; /************************************************************************/ @@ -230,7 +225,7 @@ export function Streamer() { tools.feature.setEnabled($("stream-mic"), false); } - let mode = tools.storage.get("stream.mode", "mjpeg"); // 这里也改为默认 mjpeg + let mode = tools.storage.get("stream.mode", "mjpeg"); if (mode === "janus" && !has_janus) { mode = "media"; } diff --git a/web/share/js/kvm/stream_janus.js b/web/share/js/kvm/stream_janus.js index 449450b7..556c8f7a 100644 --- a/web/share/js/kvm/stream_janus.js +++ b/web/share/js/kvm/stream_janus.js @@ -3,6 +3,7 @@ # KVMD - The main PiKVM daemon. # # # # Copyright (C) 2018-2024 Maxim Devaev # +# Copyright (C) 2023-2025 SilentWind # # # # This program is free software: you can redistribute it and/or modify # # it under the terms of the GNU General Public License as published by # @@ -311,6 +312,50 @@ export function JanusStreamer(__setActive, __setInactive, __setInfo, __orient, _ } }, + // 添加对 Janus 0.x 的支持 + "onremotestream": function(stream) { + if (stream === null) { + // https://github.com/pikvm/pikvm/issues/1084 + // 这种情况不应该发生,但有时 Janus 在 unmute 时可能会收到 null 事件 + // 作为解决方案,我们重启 Janus + __logError("Got invalid onremotestream(null). Restarting Janus..."); + __destroyJanus(); + return; + } + + let tracks = stream.getTracks(); + __logInfo("Got a remote stream changes:", stream, tracks); + + let has_video = false; + for (let track of tracks) { + if (track.kind == "video") { + has_video = true; + break; + } + } + + if (!has_video && __isOnline()) { + // Chrome 在 ICE 状态为 disconnected 时会发送 muted 通知 + // Janus.js 会从可用轨道列表中移除已静音的轨道 + // 但轨道实际上仍然存在,所以可以安全地忽略这种情况 + return; + } + + _Janus.attachMediaStream($("stream-video"), stream); + __sendKeyRequired(); + __startInfoInterval(); + + // FIXME: 延迟减少但在关键帧上会出现卡顿 + // - https://github.com/Glimesh/janus-ftl-plugin/issues/101 + /*if (__handle && __handle.webrtcStuff && __handle.webrtcStuff.pc) { + for (let receiver of __handle.webrtcStuff.pc.getReceivers()) { + if (receiver.track && receiver.track.kind === "video" && receiver.playoutDelayHint !== undefined) { + receiver.playoutDelayHint = 0; + } + } + }*/ + }, + "oncleanup": function() { __logInfo("Got a cleanup notification"); __stopInfoInterval();