stream.m3u8
stream.m3u8VirtualCamera:支持ONVIF协议的专业电脑屏幕监控解决方案
2025-6-11 乱云飞 监控 评论(0) 浏览(302) 标签: RTSP VirtualCamera PConvif deskcamera screenlive
全局直角(保留圆形高性能版V2026)
// ==UserScript==
// @name 全局直角(修复内部图片圆形)000
// @namespace http://tampermonkey.net/
// @version 3.7
// @description 强制所有非圆形元素变为直角,保留圆形容器及其内部图片
// @author You
// @match http://*/*
// @match https://*/*
// @grant none
// @run-at document-start
// ==/UserScript==
(function() {
'use strict';
// 圆形元素选择器白名单
const CIRCULAR_SELECTORS = [
// 头像类
'[class*="avatar"]', '[class*="user-avatar"]', '[class*="profile-pic"]',
'.avatar', '.user-avatar', '.MuiAvatar-root', '.ant-avatar',
'img[class*="avatar"]', 'img[src*="avatar"]', 'img[src*="profile"]',
// 圆形装饰/图标类
'[class*="circle"]', '[class*="round"]', '.rounded-full', '.rounded-circle',
// 音乐播放器的唱片/CD封面容器(重点)
'.vg-disc-container', '.disc-container', '.cd-cover', '.album-cover',
'[class*="disc"]', '[class*="cd"]', '[class*="cover-art"]',
'.song-cover', '.music-cover', '.playlist-cover', '.vg-cover-container',
// 特定播放器
'.aplayer-pic', '.aplayer-cover', '.ncm-cover',
'.sakana-widget',
];
// 检查元素是否匹配圆形选择器白名单
function matchesCircularSelector(el) {
if (!el) return false;
for (const selector of CIRCULAR_SELECTORS) {
if (el.matches(selector)) return true;
}
// 模糊匹配类名中的关键词
const className = (el.className || '').toLowerCase();
if (className.includes('avatar') || className.includes('circle') ||
className.includes('round') || className.includes('disc') ||
className.includes('cover') || className.includes('album')) {
const rect = el.getBoundingClientRect();
if (rect.width > 0 && rect.height > 0) {
const style = window.getComputedStyle(el);
if (Math.abs(rect.width - rect.height) < 5 &&
(style.borderRadius === '50%' || style.borderRadius.includes('50%') ||
parseFloat(style.borderRadius) >= Math.min(rect.width, rect.height) / 2)) {
return true;
}
}
}
return false;
}
// 检查元素是否位于圆形容器内部(关键修复)
function isInsideCircularContainer(el) {
let parent = el.parentElement;
let level = 0;
// 向上查找最多5层,找到圆形容器
while (parent && level < 5) {
// 检查父元素是否匹配圆形选择器
if (matchesCircularSelector(parent)) return true;
// 检查父元素是否有圆形圆角样式
const style = window.getComputedStyle(parent);
const borderRadius = style.borderRadius;
if (borderRadius !== '0px' && borderRadius !== '0%' && borderRadius !== '') {
const rect = parent.getBoundingClientRect();
if (rect.width > 0 && rect.height > 0 && Math.abs(rect.width - rect.height) < 5) {
// 父元素是正方形且圆角足够大,判定为圆形容器
let radiusPx = 0;
if (borderRadius.includes('%')) {
radiusPx = Math.min(rect.width, rect.height) * (parseFloat(borderRadius) / 100);
} else if (borderRadius.includes('px')) {
radiusPx = parseFloat(borderRadius);
}
if (radiusPx >= Math.min(rect.width, rect.height) / 2 - 1) {
return true;
}
}
}
parent = parent.parentElement;
level++;
}
return false;
}
// 判断元素是否为图片且应该保持圆形
function isImageShouldKeepCircle(el) {
if (el.tagName !== 'IMG') return false;
// 如果图片在圆形容器内,应该保持圆形
if (isInsideCircularContainer(el)) return true;
// 如果图片本身匹配圆形选择器
if (matchesCircularSelector(el)) return true;
return false;
}
// 几何判断:是否为真圆形
function isPerfectCircle(el) {
const rect = el.getBoundingClientRect();
const width = rect.width;
const height = rect.height;
if (width === 0 || height === 0) return false;
if (Math.abs(width - height) > 2) return false;
const style = window.getComputedStyle(el);
const borderRadius = style.borderRadius;
if (borderRadius === '0px' || borderRadius === '0%') return false;
let radiusPx = 0;
if (borderRadius.includes('%')) {
radiusPx = Math.min(width, height) * (parseFloat(borderRadius) / 100);
} else if (borderRadius.includes('px')) {
radiusPx = parseFloat(borderRadius);
} else {
radiusPx = parseFloat(borderRadius);
}
return radiusPx >= Math.min(width, height) / 2 - 1;
}
// 判断是否应保留圆角(主函数)
function shouldKeepRadius(el) {
// 1. 白名单直接保留
if (matchesCircularSelector(el)) return true;
// 2. 圆形容器内部的图片,保留圆形
if (isImageShouldKeepCircle(el)) return true;
// 3. 几何正圆判断
if (isPerfectCircle(el)) return true;
return false;
}
// 强制非圆形元素变为直角
function makeSquareCorners() {
const allElements = document.querySelectorAll('*');
for (let i = 0; i < allElements.length; i++) {
const el = allElements[i];
if (el._radiusProcessed) continue;
const style = window.getComputedStyle(el);
const hasRadius = style.borderRadius !== '0px' && style.borderRadius !== '0%' && style.borderRadius !== '';
if (!hasRadius) {
el._radiusProcessed = true;
continue;
}
if (!shouldKeepRadius(el)) {
el.style.borderRadius = '0px';
el.style.setProperty('border-radius', '0px', 'important');
}
el._radiusProcessed = true;
}
}
// 初始化和动态监听
function init() {
makeSquareCorners();
let timer = null;
const observer = new MutationObserver(() => {
if (timer) clearTimeout(timer);
timer = setTimeout(() => {
const allEls = document.querySelectorAll('*');
for (let i = 0; i < allEls.length; i++) {
delete allEls[i]._radiusProcessed;
}
makeSquareCorners();
}, 150);
});
observer.observe(document.body, {
childList: true,
subtree: true
});
}
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', init);
} else {
init();
}
})();
仅 400M 大小的 "残废版" Win11 系统
https://www.123pan.com/s/c8zA-rZLN3.html
国标监控摄像机模拟器 GB28181模拟器
2025-5-27 乱云飞 评论(0) 浏览(108) 标签: GB28181 国标摄像机 国标监控 国标平台
进程守护
Do
If CheckExeIsRun("onvif.dll") Then
Sleep 6000
Else
ChDrive Left(App.Path, 1)
ChDir App.Path
Shell App.Path & "\onvif.dll " & App.Path & "\onvif.ini", vbHide
Sleep 6000
End If
Sleep 2000
Loop
如何消除 OBS 中的黄色边框
2025-5-14 乱云飞 评论(0) 浏览(154) 标签: 屏幕录像 黄色边框 录屏
一些 OBS 用户报告在尝试使用该程序进行录制时屏幕周围出现黄色边框。 虽然它看起来可能有点不便,但明亮的边框可能会让您和您的观众感到烦恼。 它可能会破坏他们的体验,尤其是当您在黑屏上进行流式传输时。
如果您受到这条讨厌的黄线的影响,您可能想知道这是一个错误还是其他类型的问题。 好消息是这不是错误 – 这是正常现象 Windows 10 台。 然而,坏消息是您将无法简单地打开或关闭它,尽管有一种有时有效的解决方法。
OBS 引入黄色边框并不是为了让用户抓狂。 它是 Windows 10 出于安全原因而实施的功能。
网络威胁无处不在,黑客访问您的屏幕以获取您的敏感数据的情况并不罕见。 您可能在浏览器中输入信用卡号,却从未意识到有人正在远程录制您的屏幕。 黄色边框正是为了防止这种情况发生。 每当你的 Windows 10 PC 注意到某个应用程序正在捕获您的屏幕,它会通过此功能提醒您。
强制所有元素(包括HTTPS和动态内容)变为直角
// ==UserScript==
// @name 全局直角
// @namespace http://tampermonkey.net/
// @version 1.2
// @description 强制所有元素(包括HTTPS和动态内容)变为直角
// @author You
// @match http://*/*
// @match https://*/*
// @grant GM_addStyle
// @run-at document-start
// ==/UserScript==
(function() {
'use strict';
// 1. 最高优先级CSS覆盖(包括HTTPS)
GM_addStyle(`
*,
*::before,
*::after {
border-radius: 0px !important;
}
*{border-radius: 0px;}
/* 处理SVG */
rect, circle, ellipse {
rx: 0 !important;
ry: 0 !important;
}
/* 覆盖常见UI库的圆角类名 */
[class*="rounded"], [class*="circle"], [class*="radius"] {
border-radius: 0px !important;
}
`);
// 2. 强制修改内联样式和动态内容
function forceSquareCorners() {
// 遍历所有元素
document.querySelectorAll('*').forEach(el => {
// 内联样式覆盖
if (el.style.borderRadius) {
el.style.borderRadius = '0px';
}
// 特殊处理SVG
if (el.tagName === 'rect' || el.tagName === 'circle' || el.tagName === 'ellipse') {
el.setAttribute('rx', '0');
el.setAttribute('ry', '0');
}
// 覆盖CSS变量(如: --radius)
if (el.style.getPropertyValue('--radius')) {
el.style.setProperty('--radius', '0px', 'important');
}
});
}
// 3. 初始化执行 + 监听动态内容
forceSquareCorners();
const observer = new MutationObserver(forceSquareCorners);
observer.observe(document.documentElement, {
childList: true,
subtree: true,
attributes: true
});
// 4. 确保页面加载完成后再次执行
window.addEventListener('load', forceSquareCorners);
})();
解决按键冲突
#NoEnv
#Persistent
#SingleInstance Force
#InstallKeybdHook
#UseHook
; --- 全局状态 ---
U_IsPressed := false
Zero_IsSent := false ; 标记是否已处理0键
; --- 检测U键按下 ---
~*U::
U_IsPressed := true
SetTimer, CheckU0Combo, -100 ; 100ms检测窗口
return
; --- 检测U键释放 ---
~*U up::
U_IsPressed := false
return
; --- 检测U+0组合 ---
CheckU0Combo:
if (U_IsPressed && GetKeyState("0", "P")) {
Run, calc.exe ; 触发计算器
;Zero_IsSent := true ; 标记0键已处理
}
return
U盘自动启动
#Persistent
#SingleInstance ignore
; === 配置部分 ===
Allowed_USB_IDs := ["EZSOFT", "bakevision"] ; 允许的U盘卷标列表
CheckInterval := 3000 ; 检测间隔(毫秒)
TargetExePath := "ezsoft\ez30.exe" ; 目标程序路径
TargetExeName := "ez30.exe" ; 目标进程名(不含路径)
ConfigExePath := "ezsoft\虚拟监控.exe" ; 配置程序路径(U盘根目录)
DebugMode := false ; 调试模式(true显示提示)
; === 全局变量 ===
CurrentUSBDrive := "" ; 当前检测到的U盘盘符
; === 托盘图标设置 ===
Menu, Tray, NoStandard ; 移除标准菜单项
Menu, Tray, Add, 设置, RunConfig ; 添加设置菜单
Menu, Tray, Add ; 添加分隔线
Menu, Tray, Add, 退出, ExitScript ; 添加自定义退出选项
Menu, Tray, Tip, USB监控程序 ; 设置托盘提示文本
Menu, Tray, Icon ; 显示托盘图标
; === 主循环:检测U盘 ===
SetTimer, CheckUSB, %CheckInterval%
return
CheckUSB:
DriveGet, driveList, List, Removable
foundValidDrive := false
Loop, Parse, driveList
{
driveLetter := A_LoopField ":\"
DriveGet, driveStatus, Status, %driveLetter%
if (driveStatus = "Ready")
{
; 获取U盘卷标
DriveGet, volumeName, Label, %driveLetter%
if (DebugMode)
MsgBox, [检测] U盘卷标:%volumeName%
; 检查是否是指定U盘之一
for index, allowedID in Allowed_USB_IDs
{
if (volumeName = allowedID)
{
foundValidDrive := true
CurrentUSBDrive := driveLetter ; 更新当前U盘盘符
; 检查目标程序是否已在运行
Process, Exist, %TargetExeName%
if (ErrorLevel = 0) ; 未运行
{
exePath := driveLetter . TargetExePath
if FileExist(exePath)
{
Run, %exePath%
if (DebugMode)
MsgBox, [操作] 启动程序:%exePath%
}
else if (DebugMode)
MsgBox, [错误] 未找到程序:%exePath%
}
else if (DebugMode)
MsgBox, [跳过] 程序已在运行(PID:%ErrorLevel%)
break ; 找到匹配的卷标后跳出循环
}
}
}
}
; 如果没有检测到有效U盘,清空当前盘符记录
if (!foundValidDrive)
CurrentUSBDrive := ""
return
; === 运行配置程序 ===
RunConfig:
if (CurrentUSBDrive = "")
{
MsgBox, 未检测到有效的U盘!
return
}
configExeFullPath := CurrentUSBDrive . ConfigExePath
if FileExist(configExeFullPath)
{
Run, %configExeFullPath%
if (DebugMode)
MsgBox, [操作] 启动配置程序:%configExeFullPath%
}
else
MsgBox, 未找到配置程序:%configExeFullPath%
return
; === 退出脚本函数 ===
ExitScript:
; 关闭虚拟监控进程
Process, Close, %TargetExeName%
if (DebugMode)
MsgBox, [操作] 已尝试关闭虚拟监控进程
; 退出脚本自身
ExitApp
return