基于GB28181-2016、部标808、部标1078标准实现的开箱即用的网络视频平台。自带管理页面,支持NAT穿透,支持海康、大华、宇视等品牌的IPC、NVR接入。支持国标级联,支持将普通摄像机/直播流/直播推流转国标共享到国标平台。
This report summarizes scanner evidence for 648540858/wvp-GB28181-pro, a Java project with 7,403 GitHub stars. SynthScan examined 187,812 lines of code across 1197 source files, recording 143 pattern matches distributed across 6 syntactic categories. The legacy adjusted pattern signal is 0.8 (Low pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Payload schema: 1.0.0 · Engine: 2.0.0 · Scoring: heuristic-density-v1 · Scan date: 2026-10-31.
Can maintainers explain intent, assumptions, and trade-offs? 142 finding(s).
Are imports declared and package/API names verified? 1 finding(s).
Are wrappers, guards, and repeated structures necessary? 22 finding(s).
Which changes need focused human review? 143 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 143 distinct pattern matches across 6 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | docker/wvp/wvp/application-docker.yml | 21 | port: ${REDIS_PORT:6379} | COMMENT |
| LOW | docker/wvp/wvp/application-docker.yml | 61 | # 根据国标6.1.2中规定,domain宜采用ID统一编码的前十位编码。国标附录D中定义前8位为中心编码(由省级、市级、区级、基层编号组成,参照GB/T 2260-2007) | COMMENT |
| LOW | web/tests/unit/components/Breadcrumb.spec.js | 81 | // const second = breadcrumbArray.at(1) | COMMENT |
| LOW | web/public/static/js/h265web2/h265web_wasm.js | 1 | var WasmModule = (() => { | COMMENT |
| LOW | web/public/static/js/h265web2/h265web_wasm.js | 221 | // end include: shell.js | COMMENT |
| LOW | web/public/static/js/h265web2/h265web_wasm.js | 241 | COMMENT | |
| LOW | web/public/static/js/h265web2/h265web_wasm.js | 801 | // all RuntimeErrors are from traps; it decides whether a RuntimeError is from | COMMENT |
| LOW | web/public/static/js/h265web2/h265web_wasm.js | 1061 | /** @type{function(number, (number|boolean), ...number)} */ var proxyToMainThread = (funcIndex, emAsmAddr, sync, ...call | COMMENT |
| LOW | web/public/static/js/h265web2/h265web_wasm.js | 1201 | }, | COMMENT |
| LOW | web/public/static/js/h265web2/h265web_wasm.js | 1401 | // them would block forever. | COMMENT |
| LOW | web/public/static/js/h265web2/h265web_wasm.js | 5421 | var summerOffset = summer.getTimezoneOffset(); | COMMENT |
| LOW | web/public/static/js/h265web2/h265web_wasm.js | 5581 | // to next page multiple. | COMMENT |
| LOW | web/public/static/js/h265web2/h265web_wasm.js | 6921 | name = UTF8ToString(name); | COMMENT |
| LOW | web/public/static/js/h265web2/h265web_wasm.js | 7481 | } | COMMENT |
| LOW | web/public/static/js/h265web2/h265web_wasm.js | 8881 | // Compiler settings do not allow exiting the runtime, so flushing | COMMENT |
| LOW | web/src/icons/svgo.yml | 1 | # replace default config | COMMENT |
| LOW | web/src/views/dialog/recordDownload.vue | 121 | // url: `/api/gb_record/download/progress/${this.deviceId}/${this.channelId}/${this.stream}` | COMMENT |
| LOW | web/src/views/dialog/recordDownload.vue | 141 | // } else { | COMMENT |
| LOW | web/src/views/common/MapComponent_bak.vue | 201 | // if (status === 'ON') { | COMMENT |
| LOW | web/src/views/common/MapComponent_bak.vue | 221 | // style: webglStyle | COMMENT |
| LOW | web/src/views/common/MapComponent_bak.vue | 681 | } | COMMENT |
| LOW | web/src/views/common/MapComponent_bak.vue | 701 | // let lng = minLng | COMMENT |
| LOW | web/src/views/common/MapComponent.vue | 201 | // // 'icon-anchor': [0.5, 1], | COMMENT |
| LOW | web/src/views/common/MapComponent.vue | 661 | return toLonLat([diff, diff])[0] | COMMENT |
| LOW | web/src/views/common/MapComponent.vue | 681 | // | COMMENT |
| LOW | src/main/resources/application-docker.yml | 41 | port: ${WVP_PORT:5060} | COMMENT |
| LOW | src/main/resources/application-dev.yml | 41 | # sql: | COMMENT |
| LOW | src/main/resources/配置详情.yml | 41 | poolMaxIdle: 500 | COMMENT |
| LOW | src/main/resources/配置详情.yml | 81 | # 修改分页插件为 postgresql, 数据库类型为mysql不需要 | COMMENT |
| LOW | src/main/resources/配置详情.yml | 101 | # 私钥文件 | COMMENT |
| LOW | src/main/resources/配置详情.yml | 121 | # 3701020049标识山东济南历下区 信息行业接入 | COMMENT |
| LOW | src/main/resources/配置详情.yml | 261 | - http://192.168.1.3:8008 | COMMENT |
| LOW | …oft/iot/vmp/gb28181/transmit/SIPProcessorObserver.java | 141 | // if (clientTransaction != null) { | COMMENT |
| LOW | …l/message/query/cmd/RecordInfoQueryMessageHandler.java | 201 | log.info("[国标级联] 录像查询收到数据, 通道: {},准备转发===", channelId); | COMMENT |
| LOW | …/java/com/genersoft/iot/vmp/gb28181/utils/XmlUtil.java | 221 | COMMENT | |
| LOW | …/java/com/genersoft/iot/vmp/gb28181/utils/XmlUtil.java | 241 | // // 除了ADD和update情况下需要识别全部内容, | COMMENT |
| LOW | …/java/com/genersoft/iot/vmp/gb28181/utils/XmlUtil.java | 261 | // return deviceChannel; | COMMENT |
| LOW | …/java/com/genersoft/iot/vmp/gb28181/utils/XmlUtil.java | 281 | // String civilCode = getText(itemDevice, "CivilCode"); | COMMENT |
| LOW | …/java/com/genersoft/iot/vmp/gb28181/utils/XmlUtil.java | 301 | // } | COMMENT |
| LOW | …/java/com/genersoft/iot/vmp/gb28181/utils/XmlUtil.java | 321 | // try { | COMMENT |
| LOW | …/java/com/genersoft/iot/vmp/gb28181/utils/XmlUtil.java | 341 | // deviceChannel.setCivilCode(civilCode); | COMMENT |
| LOW | …/java/com/genersoft/iot/vmp/gb28181/utils/XmlUtil.java | 361 | // } | COMMENT |
| LOW | …/java/com/genersoft/iot/vmp/gb28181/utils/XmlUtil.java | 381 | // } | COMMENT |
| LOW | …/java/com/genersoft/iot/vmp/gb28181/utils/XmlUtil.java | 401 | // if (!ObjectUtils.isEmpty(parental)) { | COMMENT |
| LOW | …/java/com/genersoft/iot/vmp/gb28181/utils/XmlUtil.java | 421 | // deviceChannel.setParentId(parentID); | COMMENT |
| LOW | …/java/com/genersoft/iot/vmp/gb28181/utils/XmlUtil.java | 441 | // logger.warn("[xml解析] 从通道数据获取registerWay失败: {}", registerWay); | COMMENT |
| LOW | …/java/com/genersoft/iot/vmp/gb28181/utils/XmlUtil.java | 461 | // deviceChannel.setCertNum(certNum); | COMMENT |
| LOW | …/java/com/genersoft/iot/vmp/gb28181/utils/XmlUtil.java | 481 | // } | COMMENT |
| LOW | …/java/com/genersoft/iot/vmp/gb28181/utils/XmlUtil.java | 501 | // deviceChannel.setPort(Integer.parseInt(port)); | COMMENT |
| LOW | …/java/com/genersoft/iot/vmp/gb28181/utils/XmlUtil.java | 521 | // if (status.equalsIgnoreCase("OFF") || status.equalsIgnoreCase("Off") || status.equalsIgnoreCas | COMMENT |
| LOW | …/java/com/genersoft/iot/vmp/gb28181/utils/XmlUtil.java | 541 | // } else { | COMMENT |
| LOW | …/java/com/genersoft/iot/vmp/gb28181/utils/XmlUtil.java | 561 | // try { | COMMENT |
| LOW | …/java/com/genersoft/iot/vmp/gb28181/utils/XmlUtil.java | 581 | // // TODO 摄像机安装位置室外、室内属性。1-室外、2-室内。 | COMMENT |
| LOW | …ersoft/iot/vmp/gb28181/controller/GroupController.java | 101 | // } | COMMENT |
| LOW | …iot/vmp/gb28181/service/impl/GbChannelServiceImpl.java | 861 | } | COMMENT |
| LOW | …a/com/genersoft/iot/vmp/web/gb28181/ApiController.java | 61 | // result.put("APIAuth","false"); | COMMENT |
| LOW | …java/com/genersoft/iot/vmp/utils/redis/RedisUtil2.java | 1 | //package com.genersoft.iot.vmp.utils.redis; | COMMENT |
| LOW | …java/com/genersoft/iot/vmp/utils/redis/RedisUtil2.java | 21 | // static { | COMMENT |
| LOW | …java/com/genersoft/iot/vmp/utils/redis/RedisUtil2.java | 41 | // e.printStackTrace(); | COMMENT |
| LOW | …java/com/genersoft/iot/vmp/utils/redis/RedisUtil2.java | 61 | // */ | COMMENT |
| 55 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | web/public/static/js/ZLMRTCClient.js | 870 | function shimSenderReceiverGetStats(window) { | CODE |
| LOW | web/public/static/js/ZLMRTCClient.js | 978 | function shimAddTrackRemoveTrackWithNative(window) { | CODE |
| LOW | web/public/static/js/ZLMRTCClient.js | 2403 | function isActionAllowedInSignalingState(action, type, signalingState) { | CODE |
| LOW | web/public/static/js/ZLMRTCClient.js | 2453 | function addTrackToStreamAndFireEvent(track, stream) { | CODE |
| LOW | web/public/static/js/ZLMRTCClient.js | 2459 | function removeTrackFromStreamAndFireEvent(track, stream) { | CODE |
| LOW | web/public/static/js/ZLMRTCClient.js | 4881 | function shimTrackEventTransceiver(window) { | CODE |
| LOW | web/public/static/js/ZLMRTCClient.js | 5321 | function shimAddIceCandidateNullOrEmpty(window, browserDetails) { | CODE |
| LOW | web/public/static/js/ZLMRTCClient.js | 5626 | function isVideoConstrainsForScreenCast(constraints) { | CODE |
| LOW | web/public/static/js/ZLMRTCClient.js | 7178 | function throwIfCancellationRequested(config) { | CODE |
| LOW | web/public/static/js/ZLMRTCClient.js | 7494 | this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) { | CODE |
| LOW | web/public/static/js/h265web/missile.js | 599 | function updateGlobalBufferAndViews(buf) { | CODE |
| LOW | web/public/static/js/h265web/missile.js | 911 | function receiveInstantiatedSource(output) { | CODE |
| LOW | web/public/static/js/h265web2/h265web_wasm.js | 366 | function isExportedByForceFilesystem(name) { | CODE |
| LOW | web/public/static/js/h265web2/h265web_wasm.js | 932 | function receiveInstantiationResult(result) { | CODE |
| LOW | web/public/static/js/h265web2/h265web_wasm.js | 5919 | function setCanvasElementSizeMainThread(target, width, height) { | CODE |
| LOW | web/public/static/js/h265web2/extwasm.js | 2 | var Module=typeof Module!=="undefined"?Module:{};var moduleOverrides={};var key;for(key in Module){if(Module.hasOwnPrope | CODE |
| LOW | web/src/api/device.js | 242 | export function updateChannelStreamIdentification(params) { | CODE |
| LOW | web/src/api/device.js | 290 | export function getKeepaliveTimeStatistics({ deviceId, count }) { | CODE |
| LOW | web/src/api/device.js | 300 | export function getRegisterTimeStatistics({ deviceId, count }) { | CODE |
| LOW | web/src/api/commonChannel.js | 29 | export function getNetworkIdentificationList() { | CODE |
| LOW | web/src/api/commonChannel.js | 124 | export function clearUnusualCivilCodeList(params) { | CODE |
| LOW | …ersoft/iot/vmp/gb28181/session/CatalogDataManager.java | 27 | public class CatalogDataManager{ | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | doc/lib/js/docsify@4.js | 1 | !function(){function c(i){var o=Object.create(null);return function(e){var n=f(e)?e:JSON.stringify(e);return o[n]||(o[n] | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | web/public/static/js/ZLMRTCClient.js | 4507 | // This is an ugly hack, but at the same time is way more robust than | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | web/public/static/js/h265web/missile.js | 4222 | function processData(byteArray) { | CODE |
| LOW | web/public/static/js/h265web2/h265web_wasm.js | 2506 | function processData(byteArray) { | CODE |
| LOW | web/public/static/js/h265web2/extwasm.js | 2 | var Module=typeof Module!=="undefined"?Module:{};var moduleOverrides={};var key;for(key in Module){if(Module.hasOwnPrope | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | web/public/static/js/h265web2/h265web_wasm.js | 15 | // We need to check if Module already exists (e.g. case 3 above). | COMMENT |