abundant-magician-17307
12/23/2025, 8:37 AM[ALIGN] set video.width=${el.width}, video.height=${el.height}, dpr=${dpr});
} catch (e) { logConsole('[ALIGN ERROR] ' + e); }
}
async function attachWithRetry(track, el, maxRetries=6, interval=300){
const ms = new MediaStream(); ms.addTrack(track.mediaStreamTrack);
el.srcObject = ms;
el.play().catch(()=>{});
let attempts=0;
while(attempts<maxRetries){
await new Promise(r=>setTimeout(r, interval));
const iw = el.videoWidth||0, ih = el.videoHeight||0;
logConsole([ATTEMPT] try=${attempts+1} intrinsic=${iw}x${ih});
if(iw>0 && ih>0){ alignVideoPixels(el); return true; }
attempts++;
}
logConsole('[ATTACH WARN] intrinsic 仍为 0');
return false;
}
(async ()=>{
setStatus('加载脚本...');
try{ await loadScript(UMD_URL); }catch(e){ logConsole('[ERROR] script load failed', e); setStatus('脚本加载失败'); return; }
await new Promise(r=>setTimeout(r,50));
const LK = window.LiveKit || window.LivekitClient || window.Livekit || window.Livekitclient || null;
if(!LK){ logConsole('[ERROR] 未找到 LiveKit 全局'); setStatus('脚本未找到'); return; }
setStatus('LiveKit 已加载');
const params = new URLSearchParams(window.location.search);
const url = params.get('url'), token = params.get('token');
if(!url || !token){ setStatus('缺少 url/token'); logConsole('[ERROR] missing params'); return; }
const room = new LK.Room({ autoSubscribe:true });
room.on(LK.RoomEvent.TrackSubscribed, async (track, pub, participant) => {
logConsole([EVENT] TrackSubscribed kind=${track.kind} participant=${participant?.identity||'unknown'});
if(track.kind==='video') await attachWithRetry(track, videoEl);
});
room.on(LK.RoomEvent.TrackUnsubscribed, (t)=>{ logConsole('[EVENT] TrackUnsubscribed'); if(t.kind==='video') videoEl.srcObject=null; });
room.on(LK.RoomEvent.Connected, ()=>{ setStatus('已连接'); console.log('START_RECORDING'); });
room.on(LK.RoomEvent.Disconnected, ()=> setStatus('已断开'));
try { await room.connect(url, token); logConsole('[ACTION] connect resolved'); } catch(e){ logConsole('[ERROR] connect failed', e); setStatus('连接失败'); }
})();
dumpBtn.addEventListener('click', ()=> {
const rect = videoEl.getBoundingClientRect();
logConsole([DUMP] css:${Math.round(rect.width)}x${Math.round(rect.height)} intrinsic:${videoEl.videoWidth}x${videoEl.videoHeight} dpr:${window.devicePixelRatio});
alert(css:${Math.round(rect.width)}x${Math.round(rect.height)} intrinsic:${videoEl.videoWidth}x${videoEl.videoHeight} dpr:${window.devicePixelRatio});
});
hideBtn.addEventListener('click', ()=> { document.documentElement.classList.add('hide-debug'); logConsole('[ACTION] hide controls'); });
})();
</script>
</body>
</html>基于此html,代码中加入图形加速功能,不区分场景,一直启用锐化tall-airline-16756
12/23/2025, 8:37 AMtall-airline-16756
12/23/2025, 8:37 AMvideo {
width: 100%;
height: 100%;
object-fit: contain;
/* GPU / compositing hints */
will-change: filter;
backface-visibility: hidden;
contain: strict;
transform: translateZ(0);
-webkit-font-smoothing: antialiased;
/* 恒定启用的锐化 + 细微色彩调整 */
filter: url(#sharpen_final) contrast(1.03) saturate(1.08);
}
要点:`will-change`、`translateZ(0)`、`contain: strict` 这些是对浏览器的渲染提示,有助于把元素提升为合成层,从而更可能由 GPU 处理滤镜。
2) 将 SVG filter 做小修正(保持核不变,但增加 id、preserveAlpha):
<svg id="filters" width="0" height="0" style="position:absolute">
<defs>
<filter id="sharpen_final" x="-10%" y="-10%" width="120%" height="120%" color-interpolation-filters="sRGB">
<feConvolveMatrix order="3"
kernelMatrix="0 -0.3 0 -0.3 2.2 -0.3 0 -0.3 0"
divisor="1" bias="0" preserveAlpha="true"/>
</filter>
</defs>
</svg>
要点:`preserveAlpha="true"` 可在有透明度需求时保持正确行为;给 svg 一个 id(可选)避免链接问题。
3) 保持 JavaScript 不去切换或移除 CSS filter 你的代码目前没有任何会动态移除或覆盖 filter 的逻辑,所以滤镜会一直生效。不要在 JS 中做如 video.style.filter = '' 的操作即可。
4) 性能与兼容性说明(简短)
• 大多数主流浏览器在被提升为合成层时,会对 CSS filter 做 GPU 加速,但 SVG 的 feConvolveMatrix 在不同浏览器上的 GPU 加速行为可能不同。上述提示最大化走 GPU 的概率,但并不能在所有浏览器强制硬件加速。
• 如果需要更确定的跨浏览器 GPU 加速(特别是高性能场景),可以考虑用 WebGL / fragment shader 实现同样的锐化内核 —— 这会是一个替代方案(我可以提供示例实现)。
如果你希望,我可以:
• 提供将该核搬到 WebGL(着色器)的最小示例;
• 或者把上面 CSS/SVG 片段直接替换到你完整的 HTML 文件中并返回完整文件。
你想先要哪种?abundant-magician-17307
12/23/2025, 8:45 AMtall-airline-16756
12/23/2025, 8:45 AMabundant-magician-17307
12/23/2025, 8:46 AM