714 lines
371 KiB
HTML
714 lines
371 KiB
HTML
<!doctype html>
|
||
<html>
|
||
<head>
|
||
<meta charset='UTF-8'><meta name='viewport' content='width=device-width initial-scale=1'>
|
||
|
||
<link href='https://fonts.loli.net/css?family=Open+Sans:400italic,700italic,700,400&subset=latin,latin-ext' rel='stylesheet' type='text/css' /><style type='text/css'>html {overflow-x: initial !important;}:root { --bg-color:#ffffff; --text-color:#333333; --select-text-bg-color:#B5D6FC; --select-text-font-color:auto; --monospace:"Lucida Console",Consolas,"Courier",monospace; --title-bar-height:20px; }
|
||
.mac-os-11 { --title-bar-height:28px; }
|
||
html { font-size: 14px; background-color: var(--bg-color); color: var(--text-color); font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; }
|
||
body { margin: 0px; padding: 0px; height: auto; inset: 0px; font-size: 1rem; line-height: 1.42857; overflow-x: hidden; background: inherit; tab-size: 4; }
|
||
iframe { margin: auto; }
|
||
a.url { word-break: break-all; }
|
||
a:active, a:hover { outline: 0px; }
|
||
.in-text-selection, ::selection { text-shadow: none; background: var(--select-text-bg-color); color: var(--select-text-font-color); }
|
||
#write { margin: 0px auto; height: auto; width: inherit; word-break: normal; overflow-wrap: break-word; position: relative; white-space: normal; overflow-x: visible; padding-top: 36px; }
|
||
#write.first-line-indent p { text-indent: 2em; }
|
||
#write.first-line-indent li p, #write.first-line-indent p * { text-indent: 0px; }
|
||
#write.first-line-indent li { margin-left: 2em; }
|
||
.for-image #write { padding-left: 8px; padding-right: 8px; }
|
||
body.typora-export { padding-left: 30px; padding-right: 30px; }
|
||
.typora-export .footnote-line, .typora-export li, .typora-export p { white-space: pre-wrap; }
|
||
.typora-export .task-list-item input { pointer-events: none; }
|
||
@media screen and (max-width: 500px) {
|
||
body.typora-export { padding-left: 0px; padding-right: 0px; }
|
||
#write { padding-left: 20px; padding-right: 20px; }
|
||
}
|
||
#write li > figure:last-child { margin-bottom: 0.5rem; }
|
||
#write ol, #write ul { position: relative; }
|
||
img { max-width: 100%; vertical-align: middle; image-orientation: from-image; }
|
||
button, input, select, textarea { color: inherit; font: inherit; }
|
||
input[type="checkbox"], input[type="radio"] { line-height: normal; padding: 0px; }
|
||
*, ::after, ::before { box-sizing: border-box; }
|
||
#write h1, #write h2, #write h3, #write h4, #write h5, #write h6, #write p, #write pre { width: inherit; }
|
||
#write h1, #write h2, #write h3, #write h4, #write h5, #write h6, #write p { position: relative; }
|
||
p { line-height: inherit; }
|
||
h1, h2, h3, h4, h5, h6 { break-after: avoid-page; break-inside: avoid; orphans: 4; }
|
||
p { orphans: 4; }
|
||
h1 { font-size: 2rem; }
|
||
h2 { font-size: 1.8rem; }
|
||
h3 { font-size: 1.6rem; }
|
||
h4 { font-size: 1.4rem; }
|
||
h5 { font-size: 1.2rem; }
|
||
h6 { font-size: 1rem; }
|
||
.md-math-block, .md-rawblock, h1, h2, h3, h4, h5, h6, p { margin-top: 1rem; margin-bottom: 1rem; }
|
||
.hidden { display: none; }
|
||
.md-blockmeta { color: rgb(204, 204, 204); font-weight: 700; font-style: italic; }
|
||
a { cursor: pointer; }
|
||
sup.md-footnote { padding: 2px 4px; background-color: rgba(238, 238, 238, 0.7); color: rgb(85, 85, 85); border-radius: 4px; cursor: pointer; }
|
||
sup.md-footnote a, sup.md-footnote a:hover { color: inherit; text-transform: inherit; text-decoration: inherit; }
|
||
#write input[type="checkbox"] { cursor: pointer; width: inherit; height: inherit; }
|
||
figure { overflow-x: auto; margin: 1.2em 0px; max-width: calc(100% + 16px); padding: 0px; }
|
||
figure > table { margin: 0px; }
|
||
thead, tr { break-inside: avoid; break-after: auto; }
|
||
thead { display: table-header-group; }
|
||
table { border-collapse: collapse; border-spacing: 0px; width: 100%; overflow: auto; break-inside: auto; text-align: left; }
|
||
table.md-table td { min-width: 32px; }
|
||
.CodeMirror-gutters { border-right: 0px; background-color: inherit; }
|
||
.CodeMirror-linenumber { user-select: none; }
|
||
.CodeMirror { text-align: left; }
|
||
.CodeMirror-placeholder { opacity: 0.3; }
|
||
.CodeMirror pre { padding: 0px 4px; }
|
||
.CodeMirror-lines { padding: 0px; }
|
||
div.hr:focus { cursor: none; }
|
||
#write pre { white-space: pre-wrap; }
|
||
#write.fences-no-line-wrapping pre { white-space: pre; }
|
||
#write pre.ty-contain-cm { white-space: normal; }
|
||
.CodeMirror-gutters { margin-right: 4px; }
|
||
.md-fences { font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; overflow: visible; white-space: pre; background: inherit; position: relative !important; }
|
||
.md-fences-adv-panel { width: 100%; margin-top: 10px; text-align: center; padding-top: 0px; padding-bottom: 8px; overflow-x: auto; }
|
||
#write .md-fences.mock-cm { white-space: pre-wrap; }
|
||
.md-fences.md-fences-with-lineno { padding-left: 0px; }
|
||
#write.fences-no-line-wrapping .md-fences.mock-cm { white-space: pre; overflow-x: auto; }
|
||
.md-fences.mock-cm.md-fences-with-lineno { padding-left: 8px; }
|
||
.CodeMirror-line, twitterwidget { break-inside: avoid; }
|
||
svg { break-inside: avoid; }
|
||
.footnotes { opacity: 0.8; font-size: 0.9rem; margin-top: 1em; margin-bottom: 1em; }
|
||
.footnotes + .footnotes { margin-top: 0px; }
|
||
.md-reset { margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: top; background: 0px 0px; text-decoration: none; text-shadow: none; float: none; position: static; width: auto; height: auto; white-space: nowrap; cursor: inherit; -webkit-tap-highlight-color: transparent; line-height: normal; font-weight: 400; text-align: left; box-sizing: content-box; direction: ltr; }
|
||
li div { padding-top: 0px; }
|
||
blockquote { margin: 1rem 0px; }
|
||
li .mathjax-block, li p { margin: 0.5rem 0px; }
|
||
li blockquote { margin: 1rem 0px; }
|
||
li { margin: 0px; position: relative; }
|
||
blockquote > :last-child { margin-bottom: 0px; }
|
||
blockquote > :first-child, li > :first-child { margin-top: 0px; }
|
||
.footnotes-area { color: rgb(136, 136, 136); margin-top: 0.714rem; padding-bottom: 0.143rem; white-space: normal; }
|
||
#write .footnote-line { white-space: pre-wrap; }
|
||
@media print {
|
||
body, html { border: 1px solid transparent; height: 99%; break-after: avoid; break-before: avoid; font-variant-ligatures: no-common-ligatures; }
|
||
#write { margin-top: 0px; padding-top: 0px; border-color: transparent !important; padding-bottom: 0px !important; }
|
||
.typora-export * { -webkit-print-color-adjust: exact; }
|
||
.typora-export #write { break-after: avoid; }
|
||
.typora-export #write::after { height: 0px; }
|
||
.is-mac table { break-inside: avoid; }
|
||
.typora-export-show-outline .typora-export-sidebar { display: none; }
|
||
}
|
||
.footnote-line { margin-top: 0.714em; font-size: 0.7em; }
|
||
a img, img a { cursor: pointer; }
|
||
pre.md-meta-block { font-size: 0.8rem; min-height: 0.8rem; white-space: pre-wrap; background: rgb(204, 204, 204); display: block; overflow-x: hidden; }
|
||
p > .md-image:only-child:not(.md-img-error) img, p > img:only-child { display: block; margin: auto; }
|
||
#write.first-line-indent p > .md-image:only-child:not(.md-img-error) img { left: -2em; position: relative; }
|
||
p > .md-image:only-child { display: inline-block; width: 100%; }
|
||
#write .MathJax_Display { margin: 0.8em 0px 0px; }
|
||
.md-math-block { width: 100%; }
|
||
.md-math-block:not(:empty)::after { display: none; }
|
||
.MathJax_ref { fill: currentcolor; }
|
||
[contenteditable="true"]:active, [contenteditable="true"]:focus, [contenteditable="false"]:active, [contenteditable="false"]:focus { outline: 0px; box-shadow: none; }
|
||
.md-task-list-item { position: relative; list-style-type: none; }
|
||
.task-list-item.md-task-list-item { padding-left: 0px; }
|
||
.md-task-list-item > input { position: absolute; top: 0px; left: 0px; margin-left: -1.2em; margin-top: calc(1em - 10px); border: none; }
|
||
.math { font-size: 1rem; }
|
||
.md-toc { min-height: 3.58rem; position: relative; font-size: 0.9rem; border-radius: 10px; }
|
||
.md-toc-content { position: relative; margin-left: 0px; }
|
||
.md-toc-content::after, .md-toc::after { display: none; }
|
||
.md-toc-item { display: block; color: rgb(65, 131, 196); }
|
||
.md-toc-item a { text-decoration: none; }
|
||
.md-toc-inner:hover { text-decoration: underline; }
|
||
.md-toc-inner { display: inline-block; cursor: pointer; }
|
||
.md-toc-h1 .md-toc-inner { margin-left: 0px; font-weight: 700; }
|
||
.md-toc-h2 .md-toc-inner { margin-left: 2em; }
|
||
.md-toc-h3 .md-toc-inner { margin-left: 4em; }
|
||
.md-toc-h4 .md-toc-inner { margin-left: 6em; }
|
||
.md-toc-h5 .md-toc-inner { margin-left: 8em; }
|
||
.md-toc-h6 .md-toc-inner { margin-left: 10em; }
|
||
@media screen and (max-width: 48em) {
|
||
.md-toc-h3 .md-toc-inner { margin-left: 3.5em; }
|
||
.md-toc-h4 .md-toc-inner { margin-left: 5em; }
|
||
.md-toc-h5 .md-toc-inner { margin-left: 6.5em; }
|
||
.md-toc-h6 .md-toc-inner { margin-left: 8em; }
|
||
}
|
||
a.md-toc-inner { font-size: inherit; font-style: inherit; font-weight: inherit; line-height: inherit; }
|
||
.footnote-line a:not(.reversefootnote) { color: inherit; }
|
||
.reversefootnote { font-family: ui-monospace, sans-serif; }
|
||
.md-attr { display: none; }
|
||
.md-fn-count::after { content: "."; }
|
||
code, pre, samp, tt { font-family: var(--monospace); }
|
||
kbd { margin: 0px 0.1em; padding: 0.1em 0.6em; font-size: 0.8em; color: rgb(36, 39, 41); background: rgb(255, 255, 255); border: 1px solid rgb(173, 179, 185); border-radius: 3px; box-shadow: rgba(12, 13, 14, 0.2) 0px 1px 0px, rgb(255, 255, 255) 0px 0px 0px 2px inset; white-space: nowrap; vertical-align: middle; }
|
||
.md-comment { color: rgb(162, 127, 3); opacity: 0.6; font-family: var(--monospace); }
|
||
code { text-align: left; vertical-align: initial; }
|
||
a.md-print-anchor { white-space: pre !important; border-width: initial !important; border-style: none !important; border-color: initial !important; display: inline-block !important; position: absolute !important; width: 1px !important; right: 0px !important; outline: 0px !important; background: 0px 0px !important; text-decoration: initial !important; text-shadow: initial !important; }
|
||
.os-windows.monocolor-emoji .md-emoji { font-family: "Segoe UI Symbol", sans-serif; }
|
||
.md-diagram-panel > svg { max-width: 100%; }
|
||
[lang="flow"] svg, [lang="mermaid"] svg { max-width: 100%; height: auto; }
|
||
[lang="mermaid"] .node text { font-size: 1rem; }
|
||
table tr th { border-bottom: 0px; }
|
||
video { max-width: 100%; display: block; margin: 0px auto; }
|
||
iframe { max-width: 100%; width: 100%; border: none; }
|
||
.highlight td, .highlight tr { border: 0px; }
|
||
mark { background: rgb(255, 255, 0); color: rgb(0, 0, 0); }
|
||
.md-html-inline .md-plain, .md-html-inline strong, mark .md-inline-math, mark strong { color: inherit; }
|
||
.md-expand mark .md-meta { opacity: 0.3 !important; }
|
||
mark .md-meta { color: rgb(0, 0, 0); }
|
||
@media print {
|
||
.typora-export h1, .typora-export h2, .typora-export h3, .typora-export h4, .typora-export h5, .typora-export h6 { break-inside: avoid; }
|
||
}
|
||
.md-diagram-panel .messageText { stroke: none !important; }
|
||
.md-diagram-panel .start-state { fill: var(--node-fill); }
|
||
.md-diagram-panel .edgeLabel rect { opacity: 1 !important; }
|
||
.md-fences.md-fences-math { font-size: 1em; }
|
||
.md-fences-advanced:not(.md-focus) { padding: 0px; white-space: nowrap; border: 0px; }
|
||
.md-fences-advanced:not(.md-focus) { background: inherit; }
|
||
.typora-export-show-outline .typora-export-content { max-width: 1440px; margin: auto; display: flex; flex-direction: row; }
|
||
.typora-export-sidebar { width: 300px; font-size: 0.8rem; margin-top: 80px; margin-right: 18px; }
|
||
.typora-export-show-outline #write { --webkit-flex:2; flex: 2 1 0%; }
|
||
.typora-export-sidebar .outline-content { position: fixed; top: 0px; max-height: 100%; overflow: hidden auto; padding-bottom: 30px; padding-top: 60px; width: 300px; }
|
||
@media screen and (max-width: 1024px) {
|
||
.typora-export-sidebar, .typora-export-sidebar .outline-content { width: 240px; }
|
||
}
|
||
@media screen and (max-width: 800px) {
|
||
.typora-export-sidebar { display: none; }
|
||
}
|
||
.outline-content li, .outline-content ul { margin-left: 0px; margin-right: 0px; padding-left: 0px; padding-right: 0px; list-style: none; }
|
||
.outline-content ul { margin-top: 0px; margin-bottom: 0px; }
|
||
.outline-content strong { font-weight: 400; }
|
||
.outline-expander { width: 1rem; height: 1.42857rem; position: relative; display: table-cell; vertical-align: middle; cursor: pointer; padding-left: 4px; }
|
||
.outline-expander::before { content: ""; position: relative; font-family: Ionicons; display: inline-block; font-size: 8px; vertical-align: middle; }
|
||
.outline-item { padding-top: 3px; padding-bottom: 3px; cursor: pointer; }
|
||
.outline-expander:hover::before { content: ""; }
|
||
.outline-h1 > .outline-item { padding-left: 0px; }
|
||
.outline-h2 > .outline-item { padding-left: 1em; }
|
||
.outline-h3 > .outline-item { padding-left: 2em; }
|
||
.outline-h4 > .outline-item { padding-left: 3em; }
|
||
.outline-h5 > .outline-item { padding-left: 4em; }
|
||
.outline-h6 > .outline-item { padding-left: 5em; }
|
||
.outline-label { cursor: pointer; display: table-cell; vertical-align: middle; text-decoration: none; color: inherit; }
|
||
.outline-label:hover { text-decoration: underline; }
|
||
.outline-item:hover { border-color: rgb(245, 245, 245); background-color: var(--item-hover-bg-color); }
|
||
.outline-item:hover { margin-left: -28px; margin-right: -28px; border-left: 28px solid transparent; border-right: 28px solid transparent; }
|
||
.outline-item-single .outline-expander::before, .outline-item-single .outline-expander:hover::before { display: none; }
|
||
.outline-item-open > .outline-item > .outline-expander::before { content: ""; }
|
||
.outline-children { display: none; }
|
||
.info-panel-tab-wrapper { display: none; }
|
||
.outline-item-open > .outline-children { display: block; }
|
||
.typora-export .outline-item { padding-top: 1px; padding-bottom: 1px; }
|
||
.typora-export .outline-item:hover { margin-right: -8px; border-right: 8px solid transparent; }
|
||
.typora-export .outline-expander::before { content: "+"; font-family: inherit; top: -1px; }
|
||
.typora-export .outline-expander:hover::before, .typora-export .outline-item-open > .outline-item > .outline-expander::before { content: "−"; }
|
||
.typora-export-collapse-outline .outline-children { display: none; }
|
||
.typora-export-collapse-outline .outline-item-open > .outline-children, .typora-export-no-collapse-outline .outline-children { display: block; }
|
||
.typora-export-no-collapse-outline .outline-expander::before { content: "" !important; }
|
||
.typora-export-show-outline .outline-item-active > .outline-item .outline-label { font-weight: 700; }
|
||
.md-inline-math-container mjx-container { zoom: 0.95; }
|
||
|
||
|
||
.CodeMirror { height: auto; }
|
||
.CodeMirror.cm-s-inner { background: inherit; }
|
||
.CodeMirror-scroll { overflow: auto hidden; z-index: 3; }
|
||
.CodeMirror-gutter-filler, .CodeMirror-scrollbar-filler { background-color: rgb(255, 255, 255); }
|
||
.CodeMirror-gutters { border-right: 1px solid rgb(221, 221, 221); background: inherit; white-space: nowrap; }
|
||
.CodeMirror-linenumber { padding: 0px 3px 0px 5px; text-align: right; color: rgb(153, 153, 153); }
|
||
.cm-s-inner .cm-keyword { color: rgb(119, 0, 136); }
|
||
.cm-s-inner .cm-atom, .cm-s-inner.cm-atom { color: rgb(34, 17, 153); }
|
||
.cm-s-inner .cm-number { color: rgb(17, 102, 68); }
|
||
.cm-s-inner .cm-def { color: rgb(0, 0, 255); }
|
||
.cm-s-inner .cm-variable { color: rgb(0, 0, 0); }
|
||
.cm-s-inner .cm-variable-2 { color: rgb(0, 85, 170); }
|
||
.cm-s-inner .cm-variable-3 { color: rgb(0, 136, 85); }
|
||
.cm-s-inner .cm-string { color: rgb(170, 17, 17); }
|
||
.cm-s-inner .cm-property { color: rgb(0, 0, 0); }
|
||
.cm-s-inner .cm-operator { color: rgb(152, 26, 26); }
|
||
.cm-s-inner .cm-comment, .cm-s-inner.cm-comment { color: rgb(170, 85, 0); }
|
||
.cm-s-inner .cm-string-2 { color: rgb(255, 85, 0); }
|
||
.cm-s-inner .cm-meta { color: rgb(85, 85, 85); }
|
||
.cm-s-inner .cm-qualifier { color: rgb(85, 85, 85); }
|
||
.cm-s-inner .cm-builtin { color: rgb(51, 0, 170); }
|
||
.cm-s-inner .cm-bracket { color: rgb(153, 153, 119); }
|
||
.cm-s-inner .cm-tag { color: rgb(17, 119, 0); }
|
||
.cm-s-inner .cm-attribute { color: rgb(0, 0, 204); }
|
||
.cm-s-inner .cm-header, .cm-s-inner.cm-header { color: rgb(0, 0, 255); }
|
||
.cm-s-inner .cm-quote, .cm-s-inner.cm-quote { color: rgb(0, 153, 0); }
|
||
.cm-s-inner .cm-hr, .cm-s-inner.cm-hr { color: rgb(153, 153, 153); }
|
||
.cm-s-inner .cm-link, .cm-s-inner.cm-link { color: rgb(0, 0, 204); }
|
||
.cm-negative { color: rgb(221, 68, 68); }
|
||
.cm-positive { color: rgb(34, 153, 34); }
|
||
.cm-header, .cm-strong { font-weight: 700; }
|
||
.cm-del { text-decoration: line-through; }
|
||
.cm-em { font-style: italic; }
|
||
.cm-link { text-decoration: underline; }
|
||
.cm-error { color: red; }
|
||
.cm-invalidchar { color: red; }
|
||
.cm-constant { color: rgb(38, 139, 210); }
|
||
.cm-defined { color: rgb(181, 137, 0); }
|
||
div.CodeMirror span.CodeMirror-matchingbracket { color: rgb(0, 255, 0); }
|
||
div.CodeMirror span.CodeMirror-nonmatchingbracket { color: rgb(255, 34, 34); }
|
||
.cm-s-inner .CodeMirror-activeline-background { background: inherit; }
|
||
.CodeMirror { position: relative; overflow: hidden; }
|
||
.CodeMirror-scroll { height: 100%; outline: 0px; position: relative; box-sizing: content-box; background: inherit; }
|
||
.CodeMirror-sizer { position: relative; }
|
||
.CodeMirror-gutter-filler, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-vscrollbar { position: absolute; z-index: 6; display: none; outline: 0px; }
|
||
.CodeMirror-vscrollbar { right: 0px; top: 0px; overflow: hidden; }
|
||
.CodeMirror-hscrollbar { bottom: 0px; left: 0px; overflow: auto hidden; }
|
||
.CodeMirror-scrollbar-filler { right: 0px; bottom: 0px; }
|
||
.CodeMirror-gutter-filler { left: 0px; bottom: 0px; }
|
||
.CodeMirror-gutters { position: absolute; left: 0px; top: 0px; padding-bottom: 10px; z-index: 3; overflow-y: hidden; }
|
||
.CodeMirror-gutter { white-space: normal; height: 100%; box-sizing: content-box; padding-bottom: 30px; margin-bottom: -32px; display: inline-block; }
|
||
.CodeMirror-gutter-wrapper { position: absolute; z-index: 4; background: 0px 0px !important; border: none !important; }
|
||
.CodeMirror-gutter-background { position: absolute; top: 0px; bottom: 0px; z-index: 4; }
|
||
.CodeMirror-gutter-elt { position: absolute; cursor: default; z-index: 4; }
|
||
.CodeMirror-lines { cursor: text; }
|
||
.CodeMirror pre { border-radius: 0px; border-width: 0px; background: 0px 0px; font-family: inherit; font-size: inherit; margin: 0px; white-space: pre; overflow-wrap: normal; color: inherit; z-index: 2; position: relative; overflow: visible; }
|
||
.CodeMirror-wrap pre { overflow-wrap: break-word; white-space: pre-wrap; word-break: normal; }
|
||
.CodeMirror-code pre { border-right: 30px solid transparent; width: fit-content; }
|
||
.CodeMirror-wrap .CodeMirror-code pre { border-right: none; width: auto; }
|
||
.CodeMirror-linebackground { position: absolute; inset: 0px; z-index: 0; }
|
||
.CodeMirror-linewidget { position: relative; z-index: 2; overflow: auto; }
|
||
.CodeMirror-wrap .CodeMirror-scroll { overflow-x: hidden; }
|
||
.CodeMirror-measure { position: absolute; width: 100%; height: 0px; overflow: hidden; visibility: hidden; }
|
||
.CodeMirror-measure pre { position: static; }
|
||
.CodeMirror div.CodeMirror-cursor { position: absolute; visibility: hidden; border-right: none; width: 0px; }
|
||
.CodeMirror div.CodeMirror-cursor { visibility: hidden; }
|
||
.CodeMirror-focused div.CodeMirror-cursor { visibility: inherit; }
|
||
.cm-searching { background: rgba(255, 255, 0, 0.4); }
|
||
span.cm-underlined { text-decoration: underline; }
|
||
span.cm-strikethrough { text-decoration: line-through; }
|
||
.cm-tw-syntaxerror { color: rgb(255, 255, 255); background-color: rgb(153, 0, 0); }
|
||
.cm-tw-deleted { text-decoration: line-through; }
|
||
.cm-tw-header5 { font-weight: 700; }
|
||
.cm-tw-listitem:first-child { padding-left: 10px; }
|
||
.cm-tw-box { border-style: solid; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-color: inherit; border-top-width: 0px !important; }
|
||
.cm-tw-underline { text-decoration: underline; }
|
||
@media print {
|
||
.CodeMirror div.CodeMirror-cursor { visibility: hidden; }
|
||
}
|
||
|
||
|
||
:root {
|
||
--side-bar-bg-color: #fafafa;
|
||
--control-text-color: #777;
|
||
}
|
||
|
||
@include-when-export url(https://fonts.loli.net/css?family=Open+Sans:400italic,700italic,700,400&subset=latin,latin-ext);
|
||
|
||
/* open-sans-regular - latin-ext_latin */
|
||
/* open-sans-italic - latin-ext_latin */
|
||
/* open-sans-700 - latin-ext_latin */
|
||
/* open-sans-700italic - latin-ext_latin */
|
||
html {
|
||
font-size: 16px;
|
||
-webkit-font-smoothing: antialiased;
|
||
}
|
||
|
||
body {
|
||
font-family: "Open Sans","Clear Sans", "Helvetica Neue", Helvetica, Arial, 'Segoe UI Emoji', sans-serif;
|
||
color: rgb(51, 51, 51);
|
||
line-height: 1.6;
|
||
}
|
||
|
||
#write {
|
||
max-width: 860px;
|
||
margin: 0 auto;
|
||
padding: 30px;
|
||
padding-bottom: 100px;
|
||
}
|
||
|
||
@media only screen and (min-width: 1400px) {
|
||
#write {
|
||
max-width: 1024px;
|
||
}
|
||
}
|
||
|
||
@media only screen and (min-width: 1800px) {
|
||
#write {
|
||
max-width: 1200px;
|
||
}
|
||
}
|
||
|
||
#write > ul:first-child,
|
||
#write > ol:first-child{
|
||
margin-top: 30px;
|
||
}
|
||
|
||
a {
|
||
color: #4183C4;
|
||
}
|
||
h1,
|
||
h2,
|
||
h3,
|
||
h4,
|
||
h5,
|
||
h6 {
|
||
position: relative;
|
||
margin-top: 1rem;
|
||
margin-bottom: 1rem;
|
||
font-weight: bold;
|
||
line-height: 1.4;
|
||
cursor: text;
|
||
}
|
||
h1:hover a.anchor,
|
||
h2:hover a.anchor,
|
||
h3:hover a.anchor,
|
||
h4:hover a.anchor,
|
||
h5:hover a.anchor,
|
||
h6:hover a.anchor {
|
||
text-decoration: none;
|
||
}
|
||
h1 tt,
|
||
h1 code {
|
||
font-size: inherit;
|
||
}
|
||
h2 tt,
|
||
h2 code {
|
||
font-size: inherit;
|
||
}
|
||
h3 tt,
|
||
h3 code {
|
||
font-size: inherit;
|
||
}
|
||
h4 tt,
|
||
h4 code {
|
||
font-size: inherit;
|
||
}
|
||
h5 tt,
|
||
h5 code {
|
||
font-size: inherit;
|
||
}
|
||
h6 tt,
|
||
h6 code {
|
||
font-size: inherit;
|
||
}
|
||
h1 {
|
||
font-size: 2.25em;
|
||
line-height: 1.2;
|
||
border-bottom: 1px solid #eee;
|
||
}
|
||
h2 {
|
||
font-size: 1.75em;
|
||
line-height: 1.225;
|
||
border-bottom: 1px solid #eee;
|
||
}
|
||
|
||
/*@media print {
|
||
.typora-export h1,
|
||
.typora-export h2 {
|
||
border-bottom: none;
|
||
padding-bottom: initial;
|
||
}
|
||
|
||
.typora-export h1::after,
|
||
.typora-export h2::after {
|
||
content: "";
|
||
display: block;
|
||
height: 100px;
|
||
margin-top: -96px;
|
||
border-top: 1px solid #eee;
|
||
}
|
||
}*/
|
||
|
||
h3 {
|
||
font-size: 1.5em;
|
||
line-height: 1.43;
|
||
}
|
||
h4 {
|
||
font-size: 1.25em;
|
||
}
|
||
h5 {
|
||
font-size: 1em;
|
||
}
|
||
h6 {
|
||
font-size: 1em;
|
||
color: #777;
|
||
}
|
||
p,
|
||
blockquote,
|
||
ul,
|
||
ol,
|
||
dl,
|
||
table{
|
||
margin: 0.8em 0;
|
||
}
|
||
li>ol,
|
||
li>ul {
|
||
margin: 0 0;
|
||
}
|
||
hr {
|
||
height: 2px;
|
||
padding: 0;
|
||
margin: 16px 0;
|
||
background-color: #e7e7e7;
|
||
border: 0 none;
|
||
overflow: hidden;
|
||
box-sizing: content-box;
|
||
}
|
||
|
||
li p.first {
|
||
display: inline-block;
|
||
}
|
||
ul,
|
||
ol {
|
||
padding-left: 30px;
|
||
}
|
||
ul:first-child,
|
||
ol:first-child {
|
||
margin-top: 0;
|
||
}
|
||
ul:last-child,
|
||
ol:last-child {
|
||
margin-bottom: 0;
|
||
}
|
||
blockquote {
|
||
border-left: 4px solid #dfe2e5;
|
||
padding: 0 15px;
|
||
color: #777777;
|
||
}
|
||
blockquote blockquote {
|
||
padding-right: 0;
|
||
}
|
||
table {
|
||
padding: 0;
|
||
word-break: initial;
|
||
}
|
||
table tr {
|
||
border: 1px solid #dfe2e5;
|
||
margin: 0;
|
||
padding: 0;
|
||
}
|
||
table tr:nth-child(2n),
|
||
thead {
|
||
background-color: #f8f8f8;
|
||
}
|
||
table th {
|
||
font-weight: bold;
|
||
border: 1px solid #dfe2e5;
|
||
border-bottom: 0;
|
||
margin: 0;
|
||
padding: 6px 13px;
|
||
}
|
||
table td {
|
||
border: 1px solid #dfe2e5;
|
||
margin: 0;
|
||
padding: 6px 13px;
|
||
}
|
||
table th:first-child,
|
||
table td:first-child {
|
||
margin-top: 0;
|
||
}
|
||
table th:last-child,
|
||
table td:last-child {
|
||
margin-bottom: 0;
|
||
}
|
||
|
||
.CodeMirror-lines {
|
||
padding-left: 4px;
|
||
}
|
||
|
||
.code-tooltip {
|
||
box-shadow: 0 1px 1px 0 rgba(0,28,36,.3);
|
||
border-top: 1px solid #eef2f2;
|
||
}
|
||
|
||
.md-fences,
|
||
code,
|
||
tt {
|
||
border: 1px solid #e7eaed;
|
||
background-color: #f8f8f8;
|
||
border-radius: 3px;
|
||
padding: 0;
|
||
padding: 2px 4px 0px 4px;
|
||
font-size: 0.9em;
|
||
}
|
||
|
||
code {
|
||
background-color: #f3f4f4;
|
||
padding: 0 2px 0 2px;
|
||
}
|
||
|
||
.md-fences {
|
||
margin-bottom: 15px;
|
||
margin-top: 15px;
|
||
padding-top: 8px;
|
||
padding-bottom: 6px;
|
||
}
|
||
|
||
|
||
.md-task-list-item > input {
|
||
margin-left: -1.3em;
|
||
}
|
||
|
||
@media print {
|
||
html {
|
||
font-size: 13px;
|
||
}
|
||
pre {
|
||
page-break-inside: avoid;
|
||
word-wrap: break-word;
|
||
}
|
||
}
|
||
|
||
.md-fences {
|
||
background-color: #f8f8f8;
|
||
}
|
||
#write pre.md-meta-block {
|
||
padding: 1rem;
|
||
font-size: 85%;
|
||
line-height: 1.45;
|
||
background-color: #f7f7f7;
|
||
border: 0;
|
||
border-radius: 3px;
|
||
color: #777777;
|
||
margin-top: 0 !important;
|
||
}
|
||
|
||
.mathjax-block>.code-tooltip {
|
||
bottom: .375rem;
|
||
}
|
||
|
||
.md-mathjax-midline {
|
||
background: #fafafa;
|
||
}
|
||
|
||
#write>h3.md-focus:before{
|
||
left: -1.5625rem;
|
||
top: .375rem;
|
||
}
|
||
#write>h4.md-focus:before{
|
||
left: -1.5625rem;
|
||
top: .285714286rem;
|
||
}
|
||
#write>h5.md-focus:before{
|
||
left: -1.5625rem;
|
||
top: .285714286rem;
|
||
}
|
||
#write>h6.md-focus:before{
|
||
left: -1.5625rem;
|
||
top: .285714286rem;
|
||
}
|
||
.md-image>.md-meta {
|
||
/*border: 1px solid #ddd;*/
|
||
border-radius: 3px;
|
||
padding: 2px 0px 0px 4px;
|
||
font-size: 0.9em;
|
||
color: inherit;
|
||
}
|
||
|
||
.md-tag {
|
||
color: #a7a7a7;
|
||
opacity: 1;
|
||
}
|
||
|
||
.md-toc {
|
||
margin-top:20px;
|
||
padding-bottom:20px;
|
||
}
|
||
|
||
.sidebar-tabs {
|
||
border-bottom: none;
|
||
}
|
||
|
||
#typora-quick-open {
|
||
border: 1px solid #ddd;
|
||
background-color: #f8f8f8;
|
||
}
|
||
|
||
#typora-quick-open-item {
|
||
background-color: #FAFAFA;
|
||
border-color: #FEFEFE #e5e5e5 #e5e5e5 #eee;
|
||
border-style: solid;
|
||
border-width: 1px;
|
||
}
|
||
|
||
/** focus mode */
|
||
.on-focus-mode blockquote {
|
||
border-left-color: rgba(85, 85, 85, 0.12);
|
||
}
|
||
|
||
header, .context-menu, .megamenu-content, footer{
|
||
font-family: "Segoe UI", "Arial", sans-serif;
|
||
}
|
||
|
||
.file-node-content:hover .file-node-icon,
|
||
.file-node-content:hover .file-node-open-state{
|
||
visibility: visible;
|
||
}
|
||
|
||
.mac-seamless-mode #typora-sidebar {
|
||
background-color: #fafafa;
|
||
background-color: var(--side-bar-bg-color);
|
||
}
|
||
|
||
.md-lang {
|
||
color: #b4654d;
|
||
}
|
||
|
||
/*.html-for-mac {
|
||
--item-hover-bg-color: #E6F0FE;
|
||
}*/
|
||
|
||
#md-notification .btn {
|
||
border: 0;
|
||
}
|
||
|
||
.dropdown-menu .divider {
|
||
border-color: #e5e5e5;
|
||
opacity: 0.4;
|
||
}
|
||
|
||
.ty-preferences .window-content {
|
||
background-color: #fafafa;
|
||
}
|
||
|
||
.ty-preferences .nav-group-item.active {
|
||
color: white;
|
||
background: #999;
|
||
}
|
||
|
||
.menu-item-container a.menu-style-btn {
|
||
background-color: #f5f8fa;
|
||
background-image: linear-gradient( 180deg , hsla(0, 0%, 100%, 0.8), hsla(0, 0%, 100%, 0));
|
||
}
|
||
|
||
|
||
|
||
</style><title>视频监控系统开发及使用手册</title>
|
||
</head>
|
||
<body class='typora-export os-windows typora-export-show-outline typora-export-collapse-outline'><div class='typora-export-content'>
|
||
<div class="typora-export-sidebar"><div class="outline-content"><li class="outline-item-wrapper outline-h2"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#0-前言说明">0 前言说明</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h3 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#01-系统说明">0.1 系统说明</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#02-特别说明">0.2 特别说明</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#03-相关站点">0.3 相关站点</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#04-功能特点">0.4 功能特点</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#041-软件模块">0.4.1 软件模块</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#042-基础功能">0.4.2 基础功能</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#043-特色功能">0.4.3 特色功能</a></div><ul class="outline-children"></ul></li></ul></li><li class="outline-item-wrapper outline-h3 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#05-目录说明">0.5 目录说明</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#06-编译说明">0.6 编译说明</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#061-特别提示">0.6.1 特别提示</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#062-注意事项">0.6.2 注意事项</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#063-离线地图">0.6.3 离线地图</a></div><ul class="outline-children"></ul></li></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#07-视频格式">0.7 视频格式</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#071-usb摄像头">0.7.1 USB摄像头</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#072-网络地址">0.7.2 网络地址</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#073-中央卫视">0.7.3 中央卫视</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#074-视频文件">0.7.4 视频文件</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#075-网友提供">0.7.5 网友提供</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#076-监控设备">0.7.6 监控设备</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h5 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#0761-海康">0.7.6.1 海康</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h5 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#0762-大华">0.7.6.2 大华</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h5 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#0763-常规">0.7.6.3 常规</a></div><ul class="outline-children"></ul></li></ul></li></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#08-版本说明">0.8 版本说明</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#081-精益求精">0.8.1 精益求精</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#082-破茧成蝶">0.8.2 破茧成蝶</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#083-快速迭代">0.8.3 快速迭代</a></div><ul class="outline-children"></ul></li></ul></li></ul></li><li class="outline-item-wrapper outline-h2"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#1-用户登录退出">1 用户登录退出</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h3 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#11-用户登录">1.1 用户登录</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#12-用户退出">1.2 用户退出</a></div><ul class="outline-children"></ul></li></ul></li><li class="outline-item-wrapper outline-h2"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#2-主界面操作">2 主界面操作</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h3 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#21-面板显示隐藏">2.1 面板显示隐藏</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#22-面板拖动">2.2 面板拖动</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#23-视频播放">2.3 视频播放</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#24-视频截图">2.4 视频截图</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#25-删除视频">2.5 删除视频</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#26-画面切换">2.6 画面切换</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#27-声音调节">2.7 声音调节</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#28-视频轮询">2.8 视频轮询</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#29-通道交换">2.9 通道交换</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#210-云台控制">2.10 云台控制</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#211-设备控制">2.11 设备控制</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#212-报警订阅">2.12 报警订阅</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#213-悬浮条操作">2.13 悬浮条操作</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#214-标签设置">2.14 标签设置</a></div><ul class="outline-children"></ul></li></ul></li><li class="outline-item-wrapper outline-h2"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#3-视频回放">3 视频回放</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#31-本地回放">3.1 本地回放</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#311-视频查询">3.1.1 视频查询</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#312-存储规则">3.1.2 存储规则</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#313-视频下载">3.1.3 视频下载</a></div><ul class="outline-children"></ul></li></ul></li><li class="outline-item-wrapper outline-h3 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#32-远程回放">3.2 远程回放</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#33-设备播放">3.3 设备播放</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#34-图片回放">3.4 图片回放</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#341-图片查询">3.4.1 图片查询</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#342-存储规则">3.4.2 存储规则</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#343-图片下载">3.4.3 图片下载</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#344-导出报告">3.4.4 导出报告</a></div><ul class="outline-children"></ul></li></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#35-视频上传">3.5 视频上传</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#351-本地设置">3.5.1 本地设置</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#352-远程设置">3.5.2 远程设置</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#353-文件加密">3.5.3 文件加密</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#354-功能特点">3.5.4 功能特点</a></div><ul class="outline-children"></ul></li></ul></li></ul></li><li class="outline-item-wrapper outline-h2"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#4-电子地图">4 电子地图</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h3 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#41-双击预览">4.1 双击预览</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#42-图片地图">4.2 图片地图</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#43-离线地图">4.3 离线地图</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#44-在线地图">4.4 在线地图</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#45-路径规划">4.5 路径规划</a></div><ul class="outline-children"></ul></li></ul></li><li class="outline-item-wrapper outline-h2"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#5-日志查询">5 日志查询</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#51-本地日志">5.1 本地日志</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#511-查询记录">5.1.1 查询记录</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#512-打印记录">5.1.2 打印记录</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#513-导出记录到xls">5.1.3 导出记录到xls</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#514-导出记录到pdf">5.1.4 导出记录到pdf</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#515-删除记录">5.1.5 删除记录</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#516-清空记录">5.1.6 清空记录</a></div><ul class="outline-children"></ul></li></ul></li><li class="outline-item-wrapper outline-h3 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#52-设备日志">5.2 设备日志</a></div><ul class="outline-children"></ul></li></ul></li><li class="outline-item-wrapper outline-h2"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#6-系统设置">6 系统设置</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#61-基本设置">6.1 基本设置</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#611-常规设置">6.1.1 常规设置</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#612-视频参数">6.1.2 视频参数</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#613-数据库设置">6.1.3 数据库设置</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#614-地图配置">6.1.4 地图配置</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#615-功能激活">6.1.5 功能激活</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#616-颜色配置">6.1.6 颜色配置</a></div><ul class="outline-children"></ul></li></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#62-录像机管理">6.2 录像机管理</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#621-录像机添加">6.2.1 录像机添加</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#622-录像机删除">6.2.2 录像机删除</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#623-录像机清空">6.2.3 录像机清空</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#624-录像机信息导入">6.2.4 录像机信息导入</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#625-录像机信息导出">6.2.5 录像机信息导出</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#626-录像机信息打印">6.2.6 录像机信息打印</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#627-导出到excel">6.2.7 导出到Excel</a></div><ul class="outline-children"></ul></li></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#63-摄像机管理">6.3 摄像机管理</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#631-摄像机添加">6.3.1 摄像机添加</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#632-摄像机删除">6.3.2 摄像机删除</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#633-摄像机清空">6.3.3 摄像机清空</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#634-摄像机信息导入">6.3.4 摄像机信息导入</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#635-摄像机信息导出">6.3.5 摄像机信息导出</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#636-摄像机信息打印">6.3.6 摄像机信息打印</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#637-导出到excel">6.3.7 导出到Excel</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#638-设备搜索">6.3.8 设备搜索</a></div><ul class="outline-children"></ul></li></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#64-轮询配置">6.4 轮询配置</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#641-轮询点添加">6.4.1 轮询点添加</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#642-轮询点删除">6.4.2 轮询点删除</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#643-轮询点清空">6.4.3 轮询点清空</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#644-轮询点信息导入">6.4.4 轮询点信息导入</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#645-轮询点信息导出">6.4.5 轮询点信息导出</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#645-轮询点信息打印">6.4.5 轮询点信息打印</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#647-导出到excel">6.4.7 导出到Excel</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#648-参数设置">6.4.8 参数设置</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#649-批量生成">6.4.9 批量生成</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#6410-分组设置">6.4.10 分组设置</a></div><ul class="outline-children"></ul></li></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#65-用户管理">6.5 用户管理</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#651-用户添加">6.5.1 用户添加</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#652-用户删除">6.5.2 用户删除</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#653-用户清空">6.5.3 用户清空</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#654-用户信息导入">6.5.4 用户信息导入</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#655-用户信息导出">6.5.5 用户信息导出</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#656-用户信息打印">6.5.6 用户信息打印</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#657-导出到excel">6.5.7 导出到Excel</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#658-权限验证">6.5.8 权限验证</a></div><ul class="outline-children"></ul></li></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#66-其他设置">6.6 其他设置</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#661-串口配置">6.6.1 串口配置</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#662-网络配置">6.6.2 网络配置</a></div><ul class="outline-children"></ul></li></ul></li></ul></li><li class="outline-item-wrapper outline-h2"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#7-简易使用步骤">7 简易使用步骤</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h3 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#71-添加摄像机">7.1 添加摄像机</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#72-视频播放">7.2 视频播放</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#73-云台控制">7.3 云台控制</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#74-自动校时">7.4 自动校时</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#75-事件订阅">7.5 事件订阅</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#76-图片参数">7.6 图片参数</a></div><ul class="outline-children"></ul></li></ul></li><li class="outline-item-wrapper outline-h2"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#8-内核模块说明">8 内核模块说明</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#81-模块-onvif">8.1 模块-onvif</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#811-效果图">8.1.1 效果图</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#812-功能介绍">8.1.2 功能介绍</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#813-云台说明">8.1.3 云台说明</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#814-主要功能">8.1.4 主要功能</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#815-处理流程">8.1.5 处理流程</a></div><ul class="outline-children"></ul></li></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#82-内核-ffmpeg">8.2 内核-ffmpeg</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#821-效果图">8.2.1 效果图</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#822-功能介绍">8.2.2 功能介绍</a></div><ul class="outline-children"></ul></li></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#83-内核-vlc">8.3 内核-vlc</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#831-效果图">8.3.1 效果图</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#832-功能介绍">8.3.2 功能介绍</a></div><ul class="outline-children"></ul></li></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#84-内核-mpv">8.4 内核-mpv</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#841-效果图">8.4.1 效果图</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#842-功能介绍">8.4.2 功能介绍</a></div><ul class="outline-children"></ul></li></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#85-内核-海康sdk">8.5 内核-海康sdk</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#851-效果图">8.5.1 效果图</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#852-功能介绍">8.5.2 功能介绍</a></div><ul class="outline-children"></ul></li></ul></li><li class="outline-item-wrapper outline-h3 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#86-内核-萤石sdk">8.6 内核-萤石sdk</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#87-内核-大华sdk">8.7 内核-大华sdk</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#88-内核-宇视sdk">8.8 内核-宇视sdk</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#89-内核-easyplayer">8.9 内核-easyplayer</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#810-内核-大牛直播">8.10 内核-大牛直播</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#811-内核-qtav">8.11 内核-qtav</a></div><ul class="outline-children"></ul></li></ul></li><li class="outline-item-wrapper outline-h2"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#9-主界面模块说明">9 主界面模块说明</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#90-主界面">9.0 主界面</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#901-视频监控-普通模式">9.0.1 视频监控-普通模式</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#902-视频监控-全屏模式">9.0.2 视频监控-全屏模式</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#903-机器人监控-普通模式">9.0.3 机器人监控-普通模式</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#904-机器人监控-全屏模式">9.0.4 机器人监控-全屏模式</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#905-无人机监控-普通模式">9.0.5 无人机监控-普通模式</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#906-无人机监控-全屏模式">9.0.6 无人机监控-全屏模式</a></div><ul class="outline-children"></ul></li></ul></li><li class="outline-item-wrapper outline-h3 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#91-设备列表">9.1 设备列表</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#92-窗口信息">9.2 窗口信息</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#93-图文警情">9.3 图文警情</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#94-云台控制">9.4 云台控制</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#95-设备控制">9.5 设备控制</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#96-预置位置">9.6 预置位置</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#97-巡航设置">9.7 巡航设置</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#98-悬浮地图">9.8 悬浮地图</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#99-飞行轨迹">9.9 飞行轨迹</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#910-备用模块">9.10 备用模块</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#911-数据调试">9.11 数据调试</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#912-运动仿真">9.12 运动仿真</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#913-图像增强">9.13 图像增强</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#914-网页浏览">9.14 网页浏览</a></div><ul class="outline-children"></ul></li></ul></li><li class="outline-item-wrapper outline-h2"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#10-各系统运行图">10 各系统运行图</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h3 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#100-样式风格">10.0 样式风格</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#101-windows-mingw">10.1 windows-mingw</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#102-windows-msvc">10.2 windows-msvc</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#103-linux-ubuntu">10.3 linux-ubuntu</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#104-linux-fedora">10.4 linux-fedora</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#105-linux-centos">10.5 linux-centos</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#106-linux-uos">10.6 linux-uos</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#107-linux-kylin">10.7 linux-kylin</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#108-linux-neokylin">10.8 linux-neokylin</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#109-linux-newstart">10.9 linux-newstart</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#1010-unix-mac">10.10 unix-mac</a></div><ul class="outline-children"></ul></li></ul></li><li class="outline-item-wrapper outline-h2"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#11-程序框架说明">11 程序框架说明</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h3 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#111-整体代码结构">11.1 整体代码结构</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#112-主模块说明">11.2 主模块说明</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#113-子模块说明">11.3 子模块说明</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#1131-第三方类库">11.3.1 第三方类库</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#1132-通信及辅助类">11.3.2 通信及辅助类</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h5 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#11321-模块-api">11.3.2.1 模块-api</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h5 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#11322-模块-app">11.3.2.2 模块-app</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h5 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#11323-模块-devicecustom">11.3.2.3 模块-devicecustom</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h5 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#11324-模块-devicevideo">11.3.2.4 模块-devicevideo</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h5 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#11325-模块-usercontrol">11.3.2.5 模块-usercontrol</a></div><ul class="outline-children"></ul></li></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#1133-核心通用类库">11.3.3 核心通用类库</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h5 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#11331-模块-corecommon">11.3.3.1 模块-core_common</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h5 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#11332-模块-corecontrol">11.3.3.2 模块-core_control</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h5 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#11333-模块-coredataout">11.3.3.3 模块-core_dataout</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h5 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#11334-模块-coredb">11.3.3.4 模块-core_db</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h5 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#11335-模块-coreffmpeg">11.3.3.5 模块-core_ffmpeg</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h5 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#11336-模块-coremap">11.3.3.6 模块-core_map</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h5 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#11337-模块-coreonvif">11.3.3.7 模块-core_onvif</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h5 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#11338-模块-coreopengl">11.3.3.8 模块-core_opengl</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h5 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#11339-模块-coreform">11.3.3.9 模块-core_form</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h5 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#113310-模块-corequi">11.3.3.10 模块-core_qui</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h5 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#113311-模块-coretcpfile">11.3.3.11 模块-core_tcpfile</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h5 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#113312-模块-corevideo">11.3.3.12 模块-core_video</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h5 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#113313-模块-corewebview">11.3.3.13 模块-core_webview</a></div><ul class="outline-children"></ul></li></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#1134-界面ui">11.3.4 界面UI</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h5 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#11341-模块-frmconfig">11.3.4.1 模块-frmconfig</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h5 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#11342-模块-frmdata">11.3.4.2 模块-frmdata</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h5 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#11343-模块-frmdemo">11.3.4.3 模块-frmdemo</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h5 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#11344-模块-frmipc">11.3.4.4 模块-frmipc</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h5 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#11345-模块-frmmain">11.3.4.5 模块-frmmain</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h5 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#11346-模块-frmmap">11.3.4.6 模块-frmmap</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h5 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#11347-模块-frmmodule">11.3.4.7 模块-frmmodule</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h5 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#11348-模块-frmrobot">11.3.4.8 模块-frmrobot</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h5 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#11349-模块-frmvideo">11.3.4.9 模块-frmvideo</a></div><ul class="outline-children"></ul></li></ul></li></ul></li></ul></li><li class="outline-item-wrapper outline-h2"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#12-二次开发说明">12 二次开发说明</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h3 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#121-通用开发环境搭建">12.1 通用开发环境搭建</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#122-不同系统注意事项">12.2 不同系统注意事项</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#123-监控系统组件示例">12.3 监控系统组件示例</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#1231-通用辅助">12.3.1 通用辅助</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#1232-视频图片">12.3.2 视频图片</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#1233-视频控件">12.3.3 视频控件</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#1234-视频存储">12.3.4 视频存储</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#1235-视频叠加">12.3.5 视频叠加</a></div><ul class="outline-children"></ul></li></ul></li><li class="outline-item-wrapper outline-h3 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#124-人工智能集成">12.4 人工智能集成</a></div><ul class="outline-children"></ul></li></ul></li><li class="outline-item-wrapper outline-h2"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#13-其他说明">13 其他说明</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h3 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#131-海康onvif设置">13.1 海康onvif设置</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#132-大华onvif设置">13.2 大华onvif设置</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#133-国际onvif工具">13.3 国际onvif工具</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#134-报警输入设置">13.4 报警输入设置</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#135-环境使用qtvs">13.5 环境使用qt+vs</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#136-数据库设置mysql">13.6 数据库设置mysql</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#137-打开usb摄像头">13.7 打开USB摄像头</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#138-项目代码行数">13.8 项目代码行数</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#139-编译ffmpeg">13.9 编译ffmpeg</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#1310-高分屏缩放">13.10 高分屏缩放</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#1311-浏览器内核">13.11 浏览器内核</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3 outline-item-single"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#1312-odbc数据源">13.12 ODBC数据源</a></div><ul class="outline-children"></ul></li></ul></li></div></div><div id='write' class=''><h2 id='0-前言说明'><span>0 前言说明</span></h2><h3 id='01-系统说明'><span>0.1 系统说明</span></h3><ol start='' ><li><span>本视频监控系统做的是通用的系统,主要偏重整体框架和UI交互等。</span></li><li><span>主要功能包括摄像机管理,实时视频显示,视频轮询、视频存储、设备地图显示,各种画面切换,各种悬停子模块、onvif搜索设备和云台控制及预置位,通用的NVR视频流播放(比如海康的NVR支持直接取流回放)等功能。</span></li><li><span>如果是依赖SDK去实现的功能(雨刷、去雾等)都没有做,那个破坏了兼容性,无法通用其他摄像机设备以及其他操作系统。</span></li><li><span>每个厂家SDK和定制的功能都不一样,如果有这方面的需要都是买过去自己加上SDK的功能和自己定制需要的功能。</span></li><li><span>整个项目源代码行数大概30W行(项目代码本身除去第三方库以后约7W行,就是自己写的部分),其中代码13.5W行(占比45%),注释12.7W行(占比42%),空行3.5W行。分层设计注释详细。</span></li><li><span>本程序会一直持续迭代更新,包括项目源码、整体框架、使用说明等,一次购买终生售后。</span></li></ol><h3 id='02-特别说明'><span>0.2 特别说明</span></h3><ol start='' ><li><span>程序本身是个客户端(直接从摄像机取rtsp视频流)并不是服务器程序。</span></li><li><span>摄像机管理没有限制摄像机的数量,理论上10000路肯定没有问题,就是个数据库记录。</span></li><li><span>实时显示具体能支持多少路,和具体的电脑配置有关(亲测1.8G主频8G内存I5子码流64路,总之比海康大华客户端要更优秀)。</span></li><li><span>程序实时显示界面最大可以到64路,每个通道都是打开的时候才会去建立连接取视频流,而不是一开始就建立了连接。</span></li><li><span>系统采用onvif协议+rtsp视频流机制,并不限定支持哪家的摄像机,只要符合这两种协议的都支持,市面上99%的网络摄像机都支持这两种基础协议,包括但不限于海康、大华、宇视、天地伟业、华为等各种安防厂家的摄像机。</span></li><li><span>本系统没有内置人脸识别等任何相关算法,提供的是相关的接口,比如自己的算法识别到人脸区域后,将区域坐标传入视频控件自动绘制。</span></li><li><strong><span>本系统适用于安防行业,所有录制视频也是针对摄像机的视频流,包括摄像机自身的rtsp格式视频流,摄像机重新推流的rtmp或者http的视频流,凡是源头不是摄像机的视频流一概不存储或者存储不成功,因为可能编码格式不一样。比如中央卫视、大雄兔等视频流是不存储的,因为源头不是摄像机。任何监控厂家的视频监控系统都是只存储监控摄像机的视频,其他一概不存储甚至添加都没法添加到系统中因为过滤掉了。</span></strong></li><li><span>系统采用纯QtWidget(非qml)编写,解码采用ffmpeg,搜索采用onvif协议,视频播放采用rtsp协议,所有源码开放,并非有封装的库。</span></li><li><span>同时集成了数据库、多线程、串口通信、网络通信、音视频解码和同步、网页地图、界面美化、UI布局等众多知识点。</span></li><li><span>未经本人许可不可将本项目源码扩散,如有发现本人将追究法律责任,谢谢配合。</span></li></ol><h3 id='03-相关站点'><span>0.3 相关站点</span></h3><ol start='' ><li><span>国内站点:</span><a href='https://gitee.com/feiyangqingyun'><span>https://gitee.com/feiyangqingyun</span></a></li><li><span>国际站点:</span><a href='https://github.com/feiyangqingyun'><span>https://github.com/feiyangqingyun</span></a></li><li><span>个人主页:</span><a href='https://blog.csdn.net/feiyangqingyun'><span>https://blog.csdn.net/feiyangqingyun</span></a></li><li><span>知乎主页:</span><a href='https://www.zhihu.com/people/feiyangqingyun'><span>https://www.zhihu.com/people/feiyangqingyun</span></a></li><li><span>产品主页:</span><a href='https://blog.csdn.net/feiyangqingyun/article/details/97565652'><span>https://blog.csdn.net/feiyangqingyun/article/details/97565652</span></a></li><li><span>在线文档:</span><a href='https://feiyangqingyun.gitee.io/qwidgetdemo/video_system/'><span>https://feiyangqingyun.gitee.io/qwidgetdemo/video_system/</span></a></li><li><span>体验地址:</span><a href='https://pan.baidu.com/s/1d7TH_GEYl5nOecuNlWJJ7g'><span>https://pan.baidu.com/s/1d7TH_GEYl5nOecuNlWJJ7g</span></a><span> 提取码:01jf 文件名:bin_video_system.zip。</span></li><li><span>文章导航:</span><a href='https://qtchina.blog.csdn.net/article/details/121327495'><span>https://qtchina.blog.csdn.net/article/details/121327495</span></a></li></ol><h3 id='04-功能特点'><span>0.4 功能特点</span></h3><h4 id='041-软件模块'><span>0.4.1 软件模块</span></h4><ol start='' ><li><span>视频监控模块,各种停靠小窗体子模块,包括设备列表、图文警情、窗口信息、云台控制、预置位、巡航设置、设备控制、悬浮地图、网页浏览等。</span></li><li><span>视频回放模块,包括本地回放、远程回放、设备播放、图片回放、视频上传等。</span></li><li><span>电子地图模块,包括图片地图、在线地图、离线地图、路径规划等。</span></li><li><span>日志查询模块,包括本地日志、设备日志等。</span></li><li><span>系统设置模块,包括系统设置(基本设置、视频参数、数据库设置、地图配置、串口配置等)、录像机管理、摄像机管理、轮询配置、用户管理等。</span></li></ol><h4 id='042-基础功能'><span>0.4.2 基础功能</span></h4><ol start='' ><li><span>支持各种视频流(rtsp、rtmp、http等)、视频文件(mp4、rmvb、avi等)、本地USB摄像机播放。</span></li><li><span>支持多画面切换,包括1、4、6、8、9、13、16、25、36、64画面切换。</span></li><li><span>支持全屏切换,多种切换方式包括鼠标右键菜单、工具栏按钮、快捷键(alt+enter全屏,esc退出全屏)。</span></li><li><span>支持视频轮询,包括1、4、9、16画面轮询,可设置轮询分组(轮询预案)、轮询间隔、码流类型等。</span></li><li><span>支持onvif协议,包括设备搜索、云台控制、预置位、设备控制(图片参数、校对时间、系统重启,抓拍图片等)。</span></li><li><span>支持权限管理,不同的用户可以对应不同的模块权限,比如删除日志、关闭系统等。</span></li><li><span>数据库支持多种,包括sqlite、mysql、sqlserver、postgresql、oracle、人大金仓等。</span></li><li><span>本地USB摄像机支持设置分辨率、帧率等参数。</span></li><li><span>所有停靠模块都自动生成对应的菜单用来控制显示和隐藏,在标题栏右键可以弹出。</span></li><li><span>支持显示所有模块、隐藏所有模块、复位普通布局、复位全屏布局。</span></li><li><span>双击设备弹出实时预览视频,支持图片地图、在线地图、离线地图等。</span></li><li><span>摄像机节点拖曳到对应窗体播放视频,同时支持拖曳本地文件直接播放。</span></li><li><span>删除视频支持鼠标右键删除、悬浮条关闭删除、拖曳到视频监控面板外删除等多种方式。</span></li><li><span>图片地图上设备按钮可自由拖动,自动保存位置信息。百度地图上可以鼠标单击获取经纬度信息,用来更新设备位置。</span></li><li><span>视频监控面板窗体中任意通道支持拖曳交换,瞬间响应。</span></li><li><span>封装了百度地图,视图切换,运动轨迹,设备点位,鼠标按下获取经纬度等。</span></li><li><span>双击节点、拖曳节点、拖曳窗体交换位置等操作,均自动更新保存最后的播放地址,下次软件打开自动应用。</span></li><li><span>右下角音量条控件,失去焦点自动隐藏,音量条带静音图标。</span></li><li><span>支持视频截图,可指定单个或者对所有通道截图,底部小工具栏也有截图按钮。</span></li><li><span>支持超时自动隐藏鼠标指针、自动全屏机制。</span></li><li><span>支持onvif云台控制,可上下左右移动云台摄像机,包括复位和焦距调整等。</span></li><li><span>支持任意onvif摄像机,包括但不限于海康、大华、宇视、天地伟业、华为等。</span></li><li><span>可保存视频,可选定时存储或者单文件存储,可选存储间隔时间。</span></li><li><span>可设置视频流通信方式tcp+udp,可设置视频解码是速度优先、质量优先、均衡等。</span></li><li><span>可设置软件中文名称、英文名称、LOGO图标等。</span></li><li><span>存储的视频文件支持导出到指定目录,支持批量上传到服务器。</span></li></ol><h4 id='043-特色功能'><span>0.4.3 特色功能</span></h4><ol start='' ><li><span>主界面采用停靠窗体模式,各种组件以小模块的形式加入,可自定义任意模块加入。</span></li><li><span>停靠模块可拖动任意位置嵌入和悬浮,支持最大化全屏,支持多屏幕。</span></li><li><span>双重布局文件存储机制,正常模式、全屏模式都对应不同的布局方案,自动切换和保存,比如全屏模式可以突出几个模块透明显示在指定位置,更具科幻感现代化。</span></li><li><span>原创onvif协议机制,采用底层协议解析(udp广播搜索+http请求执行命令)更轻量易懂易学习拓展,不依赖任何第三方组件比如gsoap。</span></li><li><span>原创数据导入、导出、打印机制,跨平台不依赖任何组件,瞬间导出数据。</span></li><li><span>内置多个原创组件,宇宙超值超级牛逼,包括数据导入导出组件(导出到xls、pdf、打印)、数据库组件(数据库管理线程、自动清理数据线程、万能分页、数据请求等)、地图组件、视频监控组件、文件多线程收发组件、onvif通信组件、通用浏览器内核组件等。</span></li><li><span>自定义信息框+错误框+询问框+右下角提示框(包含多种格式)等。</span></li><li><span>精美换肤,高达17套皮肤样式随意更换,所有样式全部统一,包括菜单等。</span></li><li><span>视频控件悬浮条可以自行增加多个按钮,监控界面底部小工具栏也可自行增加按钮。</span></li><li><span>双击摄像机节点自动播放视频,双击节点自动依次添加视频,会自动跳到下一个,双击父节点自动添加该节点下的所有视频。可选主码流、子码流。</span></li><li><span>录像机管理、摄像机管理,可添加删除修改导入导出打印信息,立即应用新的设备信息生成树状列表,不需重启。</span></li><li><span>可选多种内核自由切换,ffmpeg、vlc、mpv等,均可在pro中设置。推荐用ffmpeg,跨平台最多,默认提供好了linux和mac平台上编译好的库。</span></li><li><span>支持硬解码,可设置硬解码类型(qsv、dxva2、d3d11va等)。</span></li><li><span>默认采用opengl绘制视频,超低的CPU资源占用,支持yuyv和nv12两种格式绘制,很牛逼。</span></li><li><span>高度可定制化,用户可以很方便的在此基础上衍生自己的功能,比如增加自定义模块,增加运行模式、机器人监控、无人机监控、挖掘机监控等。</span></li><li><span>支持xp、win7、win10、win11、linux、mac、各种国产系统(UOS、中标麒麟、银河麒麟等)、嵌入式linux等系统。</span></li><li><span>注释完整,项目结构清晰,超级详细完整的使用开发手册,精确到每个代码文件的功能说明,不断持续迭代版本。</span></li></ol><h3 id='05-目录说明'><span>0.5 目录说明</span></h3><ol start='' ><li><span>本源码项目文件中对编译生成的临时文件和可执行文件做了重定向,可执行文件并不在build开头的目录下,而是在源码同级目录的bin目录下。</span></li><li><span>config目录放的是软件的配置文件、地图模块需要的图片资源等。</span></li><li><span>db目录一般有三个文件,key.db是秘钥文件、video_system.db是对应sqlite的数据库文件、video_system.sql是对应数据库脚本(可以在系统设置中数据库管理部分执行脚本用来切换到mysql等其他数据库)。</span></li><li><span>logo目录存放的各种左上角软件LOGO图片,可以在系统设置中下拉选择。</span></li><li><span>map目录存放的图片地图模块所用的地图图片文件,可以手动拷贝到此。</span></li><li><span>sound目录存放的本系统所用的声音文件。</span></li><li><span>layout目录存放的不同工作模式不同界面对应的布局方案配置文件。</span></li></ol><h3 id='06-编译说明'><span>0.6 编译说明</span></h3><h4 id='061-特别提示'><span>0.6.1 特别提示</span></h4><ol start='' ><li><span>本系统没有说基于哪个Qt版本,由于系统中电子地图模块用到了浏览器模块,所以理论上要求你电脑的Qt版本也有浏览器模块才行</span></li><li><span>windows上Qt5.6以上的版本需要msvc编译器的版本才有,其余系统都会有。</span></li><li><span>如果没有则电子地图模块不可用,但是其余功能全部可用没有任何影响。</span></li><li><span>本人亲测4.7、4.8、5.5、5.6、5.7、5.9、5.12、5.13、5.14、5.15、6.1等。</span></li><li><span>2021-1-6开始集成了miniblink浏览器内核,意味着mingw版本的qt5.6以上版本也全部支持,这样就所有系统都有浏览器模块不需要担心没有电子地图的问题。</span></li><li><span>部分构建套件可能不支持预编译头,预编译头仅仅是为了加快编译速度,和程序本身无关。比如在win+Qt5.5 5.6就发现不支持,也可能是支持的不够全面,如果编译发生错误可以试着打开pro文件注释掉PRECOMPILED_HEADER = head.h 这行。</span></li><li><span>源码如果在嵌入式linux arm上编译,默认取消了视频监控内核ffmpeg,如果已经交叉编译好了对应arm的ffmpeg库,可以在pro中注释掉这个限制。</span>
|
||
<span>contains(QT_ARCH, arm) {</span>
|
||
<span>DEFINES -= videoffmpeg</span>
|
||
<span>}</span></li><li><span>Qt6.2的mingw版本的multimedia模块不可用,msvc版本的正常。</span></li><li><span>推荐用64位的Qt搭配64位的ffmpeg,目前绝大部分系统都是64位的,能获得最大性能提升,本人亲自对比测试32位和64位,64位无论资源占用和操作响应等体验都更优。</span></li></ol><h4 id='062-注意事项'><span>0.6.2 注意事项</span></h4><ol start='' ><li><span>可执行文件在源码同级目录的bin目录下。</span></li><li><span>编译完成后记得将源码下的file目录下(切记是file目录下而不是file目录)的所有文件复制到可执行文件同一目录。</span></li><li><span>如果开启了视频监控(默认开启),则记得将对应的动态库文件复制到可执行文件同一目录。比如采用ffmpeg内核(默认就是ffmpeg)的话,则将下载到的dll_ffmpeg4下的所有文件复制到可执行文件同一目录。</span></li><li><span>各个操作系统的ffmpeg和vlc编译好的动态库以及miniblink的动态库下载地址。</span>
|
||
<a href='https://pan.baidu.com/s/13LDRu6mXC6gaADtrGprNVA' target='_blank' class='url'>https://pan.baidu.com/s/13LDRu6mXC6gaADtrGprNVA</a><span> 提取码: ujm7。</span></li><li><span>如果是64位的qt则对应的dll时候拷贝dll_ffmpeg4_64目录下的。</span></li><li><span>如果使用的ffmpeg3则对应dll目录就是dll_ffmpeg,在ffmpeg.pri文件中可以看到具体启用的是ffmpeg3(支持XP)还是ffmpeg4(不支持XP),默认是ffmpeg4。</span></li><li><span>如果编译运行提示miniblink文件不存在请先拷贝,则说明你当前用的Qt版本没有浏览器模块,要么没安装,要么不支持,你也不用担心啥,此时自动切换用的miniblink浏览器内核,你还需要将ffmpeg库下载的网盘的地方找到dll_miniblink.zip下载解压到可执行文件同一目录即可。</span></li><li><span>系统中所有的图标,都采用的图形字体,对照表在doc目录下的FontAwesome.png、FontAliBaBa.png,对应图形字体类IconHelper中加载的图形字体,后期如果还有增加的其他图形字体也是放在这里,一个类支持多种图形字体,通过不同的值范围自动设置。</span></li><li><span>如果发现地图打不开或者提示秘钥文件丢失,请先确认file目录下的所有文件有没有拷贝过去。</span></li><li><span>如果是用vs+qt可能报错 error LNK2026,解决办法详细见文档中其他说明。</span></li><li><span>默认用户名admin 密码admin。</span></li><li><span>系统配置参数在加载的时候会对节点值进行过滤判断,如果为空会自动用初始值生成新的配置文件,如果不想要显示版权所有公司,可以填xxx而不是删掉整个值。</span></li><li><span>如果是用vlc推流的rtsp地址,比如 rtsp://:8554/aabb,由于vlc推流默认写死的采用的udp协议,所以监控系统也必须在系统设置中通信方式选择udp才行(默认tcp)。</span></li></ol><h4 id='063-离线地图'><span>0.6.3 离线地图</span></h4><ol start='' ><li><span>离线地图可以用网上的瓦片地图下载器下载百度的离线地图放到对应目录即可。</span></li><li><span>也可以直接下载网盘中已经下载好的上海市的离线地图。</span></li><li><span>下载地址:</span><a href='https://pan.baidu.com/s/1ZxG-oyUKe286LPMPxOrO2A' target='_blank' class='url'>https://pan.baidu.com/s/1ZxG-oyUKe286LPMPxOrO2A</a><span> 提取码:o05q 文件名称:bin_map_tiles.tar.xz</span></li></ol><p><strong><span>使用说明</span></strong></p><ol start='' ><li><span>将压缩包下的两个文件夹复制到对应可执行文件下的config文件夹下,和map.js文件同一级目录。</span></li><li><span>tiles文件夹是街道图,tiles_hybrid文件夹是卫星图,tiles_self是路网图,路网图和卫星图合并就是混合图。</span></li><li><span>默认提供的是上海市徐汇区的瓦片地图,如果自己用万能地图下载器下载的百度地图的瓦片文件,也可以对应替换就行。</span></li><li><span>要注意的是格式,默认是jpg,如果下载的瓦片地图格式是png则需要打开config文件夹下的map_load.js文件,将.jpg改成.png保存即可。</span></li></ol><h3 id='07-视频格式'><span>0.7 视频格式</span></h3><h4 id='071-usb摄像头'><span>0.7.1 USB摄像头</span></h4><ol start='' ><li><span>内核ffmpeg写法:video=USB2.0 PC CAMERA(具体要看设备名)。</span></li><li><span>内核vlc写法:dshow://:dshow-vdev=Default (或者填USB2.0 PC CAMERA)</span></li><li><span>带参数写法:2020-12-12以后增加USB摄像头直接url带分辨率帧率写法,默认分辨率640x480。</span></li></ol><p><strong><span>写法举例</span></strong></p><ol start='' ><li><span>video=USB2.0 PC CAMERA|1920x1080|30(表示1920*1080分辨率30帧)</span></li><li><span>video=USB2.0 PC CAMERA|640x480(表示640*480分辨率)</span></li><li><span>dshow://:dshow-vdev=USB2.0 PC CAMERA(表示打开视频设备USB2.0 PC CAMERA、其他参数全部默认)</span></li><li><span>dshow://:dshow-vdev=USB2.0 PC CAMERA:dshow-adev=麦克风 (USB Audio Device):dshow-size=1920*1080:live-caching=300(表示打开视频设备USB2.0 PC CAMERA、打开音频设备麦克风 (USB Audio Device)、分辨率640x480、缓存时间300毫秒)</span></li></ol><h4 id='072-网络地址'><span>0.7.2 网络地址</span></h4><ol start='' ><li><span>下面的地址有时候会失效,可以自行网上找找其他的地址,网络视频地址建议在晚上测试会更流畅。</span></li><li><span>大雄兔:rtsp://184.72.239.149/vod/mp4://BigBuckBunny_175k.mov</span></li><li><span>大雄兔:</span><a href='http://r.ossrs.net/live/bbb.flv' target='_blank' class='url'>http://r.ossrs.net/live/bbb.flv</a></li><li><span>海康萤石:</span><a href='https://hls01open.ys7.com/openlive/6e0b2be040a943489ef0b9bb344b96b8.hd.m3u8' target='_blank' class='url'>https://hls01open.ys7.com/openlive/6e0b2be040a943489ef0b9bb344b96b8.hd.m3u8</a></li><li><span>在线摄像机:</span><a href='http://vts.simba-cn.com:280/gb28181/21100000001320000002.m3u8' target='_blank' class='url'>http://vts.simba-cn.com:280/gb28181/21100000001320000002.m3u8</a></li><li><span>摄像机格式:</span><a href='https://blog.csdn.net/qq_38880380/article/details/80652697' target='_blank' class='url'>https://blog.csdn.net/qq_38880380/article/details/80652697</a></li></ol><h4 id='073-中央卫视'><span>0.7.3 中央卫视</span></h4><ol start='' ><li><span>中央卫视1:rtmp://58.200.131.2:1935/livetv/cctv1</span></li><li><span>中央卫视2:rtmp://58.200.131.2:1935/livetv/cctv2</span></li><li><span>中央卫视3:rtmp://58.200.131.2:1935/livetv/cctv3</span></li><li><span>中央卫视4:rtmp://58.200.131.2:1935/livetv/cctv4</span></li><li><span>中央卫视5:rtmp://58.200.131.2:1935/livetv/cctv5</span></li><li><span>中央卫视6:rtmp://58.200.131.2:1935/livetv/cctv6</span></li><li><span>中央卫视7:rtmp://58.200.131.2:1935/livetv/cctv7</span></li><li><span>中央卫视8:rtmp://58.200.131.2:1935/livetv/cctv8</span></li><li><span>中央卫视9:rtmp://58.200.131.2:1935/livetv/cctv9</span></li><li><span>中央卫视10:rtmp://58.200.131.2:1935/livetv/cctv10</span></li></ol><h4 id='074-视频文件'><span>0.7.4 视频文件</span></h4><p><span> </span><img src="snap/0-7-4.jpg" referrerpolicy="no-referrer"></p><p><strong><span>万能办法,用谷歌或者谷歌内核的浏览器,打开时光网</span><a href='http://www.mtime.com/' target='_blank' class='url'>http://www.mtime.com/</a><span> ,随便打开个视频,这里一般是预告片,按F12切换到审查元素,顶部切换到网络,选中媒体,刷新网页,按照尺寸排列,最大的那个MP4文件就是,鼠标右键复制地址,这个地址就是完整的网络地址。</span></strong></p><ol start='' ><li><a href='http://vfx.mtime.cn/Video/2019/02/04/mp4/190204084208765161.mp4' target='_blank' class='url'>http://vfx.mtime.cn/Video/2019/02/04/mp4/190204084208765161.mp4</a></li><li><a href='http://vfx.mtime.cn/Video/2019/03/19/mp4/190319212559089721.mp4' target='_blank' class='url'>http://vfx.mtime.cn/Video/2019/03/19/mp4/190319212559089721.mp4</a></li><li><a href='http://vfx.mtime.cn/Video/2019/03/17/mp4/190317150237409904.mp4' target='_blank' class='url'>http://vfx.mtime.cn/Video/2019/03/17/mp4/190317150237409904.mp4</a></li><li><a href='http://vfx.mtime.cn/Video/2019/03/14/mp4/190314223540373995.mp4' target='_blank' class='url'>http://vfx.mtime.cn/Video/2019/03/14/mp4/190314223540373995.mp4</a></li></ol><h4 id='075-网友提供'><span>0.7.5 网友提供</span></h4><ol start='' ><li><span>rtmp://live.yihtc.com:10935/hls/stream_3</span></li><li><span>rtmp://live.yihtc.com:10935/hls/stream_13</span></li><li><span>rtmp://218.3.205.46/live/ggpd_sd</span></li><li><span>rtmp://hls.hsrtv.cn/hls/hstv2</span></li><li><span>rtmp://hls.hsrtv.cn/hls/hstv1</span></li><li><span>rtmp://222.173.22.119:1935/live/jnyd_sd</span></li><li><span>rtmp://222.173.22.119:1935/live/xwhd_hd</span></li><li><span>rtmp://livetv.dhtv.cn:1935/live/peoples</span></li><li><span>rtmp://livetv.dhtv.cn:1935/live/citylife</span></li><li><span>rtmp://livetv.dhtv.cn:1935/live/financial</span></li><li><span>rtmp://livetv.dhtv.cn:1935/live/news</span></li></ol><h4 id='076-监控设备'><span>0.7.6 监控设备</span></h4><p><strong><span>下面列出的是一些常用厂家的格式,不同厂家格式不一样,具体什么格式请咨询厂家索要对应的视频流格式,或者设备支持onvif的话,通过onvif工具搜索可以拿到视频流格式。</span></strong></p><h5 id='0761-海康'><span>0.7.6.1 海康</span></h5><ul><li><span>实时预览格式:rtsp://admin:12345@192.168.1.128:554/Streaming/Channels/101?transportmode=unicast</span></li><li><span>视频回放格式:rtsp://admin:12345@192.168.1.128:554/Streaming/tracks/101?starttime=20120802t063812z&endtime=20120802t064816z</span></li><li><span>流媒体视频流:rtsp://172.6.24.15:554/Devicehc8://172.6.22.106:8000:0:0?username=admin&password=12345</span></li><li><span>日期时间格式:ISO 8601 表示Zulu(GMT) 时间 YYYYMMDD”T”HHmmSS.fraction”Z”,</span></li><li><span>单播多播说明:unicast表示单播,multicast表示多播,默认单播,可以省略。</span></li><li><span>通道码流说明:101,1是通道号,01是通道的码流编号,也可以是02、03,第2通道主码流=201,第16通道子码流=1602,依次类推。</span></li></ul><h5 id='0762-大华'><span>0.7.6.2 大华</span></h5><ul><li><span>实时预览格式:rtsp://192.168.1.128:554/cam/realmonitor?channel=1&subtype=0&unicast=true&proto=Onvif</span></li><li><span>视频回放格式:rtsp://admin:12345@192.168.1.128:554/cam/playback?channel=1&subtype=0&starttime=2021_03_18_11_36_01&endtime=2021_03_18_12_05_01</span></li><li><span>格式内容说明:channel表示通道,subtype表示码流编号,日期时间字符串非常明确。</span></li></ul><h5 id='0763-常规'><span>0.7.6.3 常规</span></h5><ul><li><span>实时预览格式:rtsp://admin:12345@192.168.1.128:554/live?channel=1&stream=1</span></li><li><span>视频回放格式:rtsp://admin:12345@192.168.1.128:554/file?channel=1&start=1494485280&stop=1494485480</span></li><li><span>其他通用格式:rtsp://admin:12345@192.168.1.128:554/0 0-主码流 1-子码流</span></li><li><span>日期时间说明:先转换时间戳,1970年到该时间经过的秒数。</span></li></ul><h3 id='08-版本说明'><span>0.8 版本说明</span></h3><h4 id='081-精益求精'><span>0.8.1 精益求精</span></h4><h4 id='082-破茧成蝶'><span>0.8.2 破茧成蝶</span></h4><ul><li><span>考虑增加mediaplayer内核,限定Qt5.有些嵌入式板子支持mediaplay硬解码。</span></li><li><span>考虑提取抽象视频控件类,可以将vlc、ffmpeg、mpv、海康等视频类移除大量重复代码。</span></li></ul><p><strong><span>V20220625</span></strong></p><ol start='' ><li><span>在之前支持NVR所有通道批量添加基础上,增加自动添加NVR信息到表,这样每个NVR都会自动添加,如果有手动添加好的则取添加好的,以IP地址为准。</span></li><li><span>修复设备在线状态处理,在同一个NVR下IP地址相同的不同通道视频,不会处理在线状态的BUG。</span></li><li><span>修复在postgresql数据库和oracle数据库下,QSqlTableModel对应setTable设置表名严格区分大小写的BUG。</span></li><li><span>测试发现有些很老的设备支持的是onvif1.0,云台地址需要用getCapabilities才能拿到,改进这个处理,兼容任意版本。</span></li></ol><p><strong><span>V20220612</span></strong></p><ol start='' ><li><span>修复qss中分组框QGroupBox标题位移的BUG,在linux系统表现不统一。</span></li><li><span>改进同样的内容导出到pdf和打印显示效果不一致的情况,统一设置分辨率为96。</span></li><li><span>摄像机管理增加多选删除,删除的时候除了删除摄像机表中对应记录,也同时删除轮询信息表中的记录。</span></li><li><span>初始化数据库按钮增加弹框确认,由于这个操作安全级别非常高,增加弹框确认很有必要。</span></li><li><span>所有QTableView+QSqlTableModel对应的保存按钮代码增加主动设置焦点,避免mac系统中当单元格处于编辑状态,再去单击保存按钮,数据依然是之前的数据的BUG。</span></li><li><span>样式表全局颜色增加悬停背景颜色QUIConfig::HoverBgColor和选中背景颜色QUIConfig::SelectBgColor用于自定义委托。</span></li><li><span>对于加深的样式,重新设置单元格等item选中和悬停颜色 默认悬停-DarkColorEnd 选中-NormalColorEnd,加深颜色设置为相反。</span></li><li><span>增加全局参数控制是悬停颜色覆盖选中颜色还是选中颜色优先,默认选中颜色优先,这样选中的item鼠标移上去不会改变掉颜色。</span></li><li><span>增加过滤同名的NVR,之前会重复加载,现在限定同名的只加载一个,要求整个系统中NVR的名字必须唯一。</span></li><li><span>轮询管理中增加摄像机表的过滤条件,启用了的才显示在表格中。</span></li><li><span>增加播放记录开关,用于软件启动后,是否从播放记录url.txt读取历史记录进行播放。</span></li><li><span>增加播放记录url.txt过滤机制,只有摄像机表中存在且启用过的才可以播放。也可以改成只对rtsp开头的进行过滤。</span></li><li><span>增加选择列表通道的时候自动选中视频通道,高亮显示,这样很明确知道选择的哪个,同理,选中视频通道也高亮选中列表通道。相当于通道选中和列表选中联动。</span></li><li><span>增加设备列表在线离线不同图标显示,目前只对rtsp地址开头的进行实时监测上线离线状态,其他全部永远当做在线。离线图标颜色取系统设置中的报警图标颜色。</span></li><li><span>增加设备在线状态字段列表,实时监测设备状态期间先判断状态是否发生变化,只有发生变化了才需要去调用对应函数处理,大大减少无效的多余的处理。</span></li><li><span>修复设备列表双击空白处崩溃的BUG,需要过滤空节点item。</span></li><li><span>增加表格策略,单选按下编辑、多选双击编辑,有些用户需要多选摄像机列表删除。</span></li></ol><p><strong><span>V20220515</span></strong></p><ol start='' ><li><span>将用户退出中的退出系统权限验证去掉,理论上对退出系统这个限制没啥意义,还可以通过任务管理器强制关闭进程。</span></li><li><span>将退出系统的权限名称改成调整布局,没有调整布局权限则不能调整拖动停靠窗体位置等。</span></li><li><span>视频面板窗体对象指针放到了全局静态变量,这样很多地方可以直接使用,比如声音控制、布局调整、视频轮询等。这样就不用繁琐的信号槽切换,可以省略很多不必要的代码,性能更高。</span></li><li><span>修复静音状态下调整音量可能不正确的BUG,静音状态下只改变音量值变量而不是正常改变音量。</span></li><li><span>实现右下角音量面板静音切换、音量值调整,全局视频控件应用。</span></li><li><span>改进默认地图算法,取第一个有背景地图的设备的图片作为默认图片,可能默认图片不存在则取图片列表中的第一张。</span></li><li><span>修复ffmpeg内核回调模式自动重连崩溃的BUG,此时图片不存在应该置为空。</span></li><li><span>增加识别秘钥有限制后限定标题栏带试用字样。</span></li><li><span>重写通用的视频地址类videourl,将通道改成0开始,分隔符改成英文逗号,视频地址集合通过指定枚举值选择不同类型添加。</span></li><li><span>增加自动插入临时消息到数据库用户操作记录,增加参数控制是否需要显示临时消息的时候插入。</span></li></ol><p><strong><span>V20220413</span></strong></p><ol start='' ><li><span>修复视频控件设置自定义背景颜色的时候,没有考虑边框的范围问题。</span></li><li><span>选项卡样式去掉悬停样式,经过观察对比Qt自带的样式都是没有悬停样式,直接是选中样式。</span></li><li><span>修复自定义委托复选框不居中的问题,之前计算不准确会有细微偏差。</span></li><li><span>自定义委托增加悬停颜色。</span></li><li><span>重写自定义委托禁用列,支持文字颜色、背景颜色、字体等特性。</span></li><li><span>修复用户登录、用户退出界面标题栏字体被放大的BUG,因为样式冲突了。</span></li><li><span>将NvrInfo和IpcInfo中的地址字段改名为mark备注字段,涵盖内容更广。</span></li><li><span>地图模块默认卫星图增加了叠加层,更符合实际需求,对应地图综合应用示例做了极大升级改善,比如下载离线地图改成了最新的地址,可以下载到和在线地图一样的瓦片图片文件,离线地图下载改成了多线程,速度提升10倍以上。</span></li><li><span>自定义委托增加quistyle标记,有该标记则自动代码内部引用换肤全局颜色变量,这样删除了大量的设置自定义委托背景颜色的代码。</span></li><li><span>修复Qt6中msvc编译器下,强制指定miniblink浏览器内核的时候编译通不过的BUG,其实这个操作有点吃饱了撑着,因为msvc下有webengine浏览器内核。但是就是因为有极个别人有这个需求,客户就是上帝。</span></li><li><span>增加用户管理权限。</span></li><li><span>将用户权限和用户信息相关类合并到通用的类userhelper中,做成通用的权限组件。</span></li><li><span>修复Qt6中自定义复选框委托,在设置了全局样式的情况下,会不断切换选中的BUG。</span></li><li><span>效果图重新截图,用最新的运行界面。</span></li><li><span>组件示例增加4通道视频同时播放,进度条控制。</span></li></ol><p><strong><span>V20220106</span></strong></p><ol start='' ><li><span>彻底修复全屏模式+webengine同时存在的情况下鼠标右键菜单无法弹出以及视频可能黑屏的BUG,这是Qt的BUG。</span></li><li><span>同时测试多屏幕下正常状态和全屏状态的情况,多屏幕不同分辨率。</span></li><li><span>增加其他设置界面,将串口设置、网络设置等移动到其他设置。随着功能越来越多,也很有必要单独拆分设置。</span></li><li><span>修复打印预览看不到文字的BUG,原来是设置了QGraphicsView的前景色导致的,把前景色和背景色设置成一样的了,其实是有文字的,鬼想得到QPrintPreviewDialog里面的预览原来用的是QGraphicsView绘制的。</span></li><li><span>修复qchart图表控件鼠标按下松开后会跟随窗体移动的BUG,因为qchart鼠标按下是UngrabMouse事件而不是MouseButtonRelease。</span></li><li><span>修复表格行按下后自定义委托颜色在部分样式方案下设置不正确的BUG。</span></li><li><span>增加视频弹窗按钮,封装的统一的视频弹窗静态函数,直接传入url地址即可。</span></li><li><span>修复鼠标按下视频预览底部工具栏也能拖曳视频的BUG。</span></li><li><span>海康内核解析增加对通道的解析,比如可能是一个摄像机有多个通道,或者NVR多个通道。同时完善主码流子码流的解析,可以解析多个码流,之前只能解析主码流子码流两个。</span></li><li><span>海康内核句柄模式下增加等比例缩放自适应。</span></li><li><span>onvif模块修复部分厂家摄像机比如天地伟业,搜索返回的媒体地址等一系列请求地址,没有加onvif节点的BUG。</span></li></ol><p><strong><span>V20211220</span></strong></p><ol start='' ><li><span>重新梳理整个onvif模块,调整对应的结构,删除多余的变量和设置等,对应云台控制等操作需要指定profile,通过参数传入。</span></li><li><span>对应图片参数操作需要指定videosource,通过参数传入。</span></li><li><span>去除数据库字段mediaurl、ptzurl,因为这两个数据每次都是更新重新获取的,通过getServices获取,这两个字段改成了videosource、profiletoken,用来从数据库读取出来,每次使用的时候自动下发。</span></li><li><span>预置位表格中的按钮样式调整,去掉圆角,增加边距,效果更完美。</span></li><li><span>新增nvr多个通道onvif支持,改动onvif模块代码和数据库结构。</span></li></ol><ul><li><span>搜索设备后判断是否多个videosource,多个表示有多个视频源,一般是NVR,也有部分IPC自带多个视频源。</span></li><li><span>有多个则根据不同厂家不同规则,找出对应的每个通道的videosource、profiletoken、rtspmain、rtspsub用分隔符 | 插入到临时表格中。</span></li><li><span>摄像机管理界面接收到添加设备的时候,在addDevice槽函数中,判断发过来的数据,带了 | 要分别取出来作为通道添加到数据库中。</span></li></ul><ol start='6' ><li><span>重新定义搜索的摄像机设备命名规则,按照摄像机#ip地址末尾数字的方式。</span></li><li><span>如果是NVR过来的摄像机,增加自动查找NVR的名称插入数据库。</span></li><li><span>获取预置位增加立即清空所有行,之前是先清空内容再根据读取到的预置位个数设置行数。</span></li><li><span>增加双击打开NVR(也叫分组)对应策略 0-最后空白通道 1-从头清空通道。</span></li><li><span>增加双击打开IPC(也叫设备)对应策略 0-最后空白通道 1-最后按下通道。</span></li><li><span>改进在分辨率不同缩放比例保持一致的UI体验,不受缩放比例的影响。</span></li><li><span>修正异或加密,增加对@String开头的密文进行过滤,防止高版本产生的配置文件到低版本的Qt程序不能正确解析的BUG。</span></li><li><span>如果打开视频流出错提示 Server returned 5XX Server Error reply 表示摄像机的码流满了,可能多个地方在拉取码流导致摄像机输出的视频流被占满,已经没有更多资源。</span></li></ol><p><strong><span>V20211205</span></strong></p><ol start='' ><li><span>地图内核增加了海量点接口。</span></li><li><span>路径规划模块彻底重写,支持重新绘制、沿线移动等模式,数据表格显示。</span></li><li><span>设备轨迹模块改成从gps点集合文本文件加载进行循环动态模拟移动,默认飞机图标,以便转动角度。</span></li><li><span>设备播放增加保存视频开关配置参数,可以直接在界面上开启,开启后,通过rtsp从nvr取流比如回放视频,可以将回放的视频保存MP4文件到本地。</span></li><li><span>修正Qt6通过属性设置标签labtip不能居中对齐的BUG。</span></li><li><span>封装通用的设置一堆按钮比如添加、删除、保存、导入、导出等按钮图形字体的函数,直接传入父面板即可,自动查找对应的objname设置图标,省去一堆重复代码。</span></li><li><span>新增飞行轨迹模块frmDeviceGps2,之前的frmDeviceGps作为通过外部函数调用移动。</span></li><li><span>样式统一整理规范,分类6大类:normal、black、light、dark、flat、other。</span></li></ol><pre class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" spellcheck="false" lang="cpp" style="break-inside: unset;"><div class="CodeMirror cm-s-inner cm-s-null-scroll CodeMirror-wrap" lang="cpp"><div style="overflow: hidden; position: relative; width: 3px; height: 0px; top: 9.51471px; left: 42.9832px;"><textarea autocorrect="off" autocapitalize="off" spellcheck="false" tabindex="0" style="position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;"></textarea></div><div class="CodeMirror-scrollbar-filler" cm-not-content="true"></div><div class="CodeMirror-gutter-filler" cm-not-content="true"></div><div class="CodeMirror-scroll" tabindex="-1"><div class="CodeMirror-sizer" style="margin-left: 35px; margin-bottom: 0px; border-right-width: 0px; padding-right: 0px; padding-bottom: 0px;"><div style="position: relative; top: 0px;"><div class="CodeMirror-lines" role="presentation"><div role="presentation" style="position: relative; outline: none;"><div class="CodeMirror-measure"><span><span></span>x</span></div><div class="CodeMirror-measure"></div><div style="position: relative; z-index: 1;"></div><div class="CodeMirror-code" role="presentation" style=""><div class="CodeMirror-activeline" style="position: relative;"><div class="CodeMirror-activeline-background CodeMirror-linebackground"></div><div class="CodeMirror-gutter-background CodeMirror-activeline-gutter" style="left: -34.9916px; width: 35px;"></div><div class="CodeMirror-gutter-wrapper CodeMirror-activeline-gutter" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt CodeMirror-linenumber-show" style="left: 0px; width: 27px;">1</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-variable-3">void</span> <span class="cm-def">QUIStyle::getStyle</span>(<span class="cm-variable">QStringList</span> <span class="cm-operator">&</span><span class="cm-variable">styleNames</span>, <span class="cm-variable">QStringList</span> <span class="cm-operator">&</span><span class="cm-variable">styleFiles</span>)</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">2</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;">{</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">3</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-keyword">static</span> <span class="cm-variable">QStringList</span> <span class="cm-variable">names</span>;</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">4</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-keyword">if</span> (<span class="cm-variable">names</span>.<span class="cm-variable">count</span>() <span class="cm-operator">==</span> <span class="cm-number">0</span>) {</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">5</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">names</span> <span class="cm-operator"><<</span> <span class="cm-string">"黑蓝色"</span> <span class="cm-operator"><<</span> <span class="cm-string">"软件黑"</span> <span class="cm-operator"><<</span> <span class="cm-string">"视频黑"</span>;</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">6</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">names</span> <span class="cm-operator"><<</span> <span class="cm-string">"深黑色"</span> <span class="cm-operator"><<</span> <span class="cm-string">"深蓝色"</span> <span class="cm-operator"><<</span> <span class="cm-string">"深灰色"</span>;</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">7</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">names</span> <span class="cm-operator"><<</span> <span class="cm-string">"扁平黑"</span> <span class="cm-operator"><<</span> <span class="cm-string">"扁平蓝"</span> <span class="cm-operator"><<</span> <span class="cm-string">"扁平灰"</span>;</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">8</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">names</span> <span class="cm-operator"><<</span> <span class="cm-string">"浅黑色"</span> <span class="cm-operator"><<</span> <span class="cm-string">"浅蓝色"</span> <span class="cm-operator"><<</span> <span class="cm-string">"浅灰色"</span>;</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">9</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">names</span> <span class="cm-operator"><<</span> <span class="cm-string">"普通黑"</span> <span class="cm-operator"><<</span> <span class="cm-string">"普通蓝"</span> <span class="cm-operator"><<</span> <span class="cm-string">"普通灰"</span>;</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt CodeMirror-linenumber-show" style="left: 0px; width: 27px;">10</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">names</span> <span class="cm-operator"><<</span> <span class="cm-string">"大蓝色"</span> <span class="cm-operator"><<</span> <span class="cm-string">"大紫色"</span> <span class="cm-operator"><<</span> <span class="cm-string">"大银色"</span>;</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">11</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> }</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">12</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
|
||
</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">13</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-comment">//中文皮肤名称对应样式表文件</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">14</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-keyword">static</span> <span class="cm-variable">QStringList</span> <span class="cm-variable">files</span>;</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">15</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-keyword">if</span> (<span class="cm-variable">files</span>.<span class="cm-variable">count</span>() <span class="cm-operator">==</span> <span class="cm-number">0</span>) {</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">16</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">files</span> <span class="cm-operator"><<</span> <span class="cm-string">":/qss/blackblue.css"</span> <span class="cm-operator"><<</span> <span class="cm-string">":/qss/blacksoft.css"</span> <span class="cm-operator"><<</span> <span class="cm-string">":/qss/blackvideo.css"</span>;</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">17</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">files</span> <span class="cm-operator"><<</span> <span class="cm-string">":/qss/darkblack.css"</span> <span class="cm-operator"><<</span> <span class="cm-string">":/qss/darkblue.css"</span> <span class="cm-operator"><<</span> <span class="cm-string">":/qss/darkgray.css"</span>;</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">18</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">files</span> <span class="cm-operator"><<</span> <span class="cm-string">":/qss/flatblack.css"</span> <span class="cm-operator"><<</span> <span class="cm-string">":/qss/flatblue.css"</span> <span class="cm-operator"><<</span> <span class="cm-string">":/qss/flatgray.css"</span>;</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">19</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">files</span> <span class="cm-operator"><<</span> <span class="cm-string">":/qss/lightblack.css"</span> <span class="cm-operator"><<</span> <span class="cm-string">":/qss/lightblue.css"</span> <span class="cm-operator"><<</span> <span class="cm-string">":/qss/lightgray.css"</span>;</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt CodeMirror-linenumber-show" style="left: 0px; width: 27px;">20</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">files</span> <span class="cm-operator"><<</span> <span class="cm-string">":/qss/normalblack.css"</span> <span class="cm-operator"><<</span> <span class="cm-string">":/qss/normalblue.css"</span> <span class="cm-operator"><<</span> <span class="cm-string">":/qss/normalgray.css"</span>;</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">21</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">files</span> <span class="cm-operator"><<</span> <span class="cm-string">":/qss/otherblue.css"</span> <span class="cm-operator"><<</span> <span class="cm-string">":/qss/otherpurple.css"</span> <span class="cm-operator"><<</span> <span class="cm-string">":/qss/othersilvery.css"</span>;</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">22</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> }</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">23</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
|
||
</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">24</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">styleNames</span> <span class="cm-operator">=</span> <span class="cm-variable">names</span>;</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">25</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">styleFiles</span> <span class="cm-operator">=</span> <span class="cm-variable">files</span>;</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt CodeMirror-linenumber-show" style="left: 0px; width: 27px;">26</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;">}</span></pre></div></div></div></div></div></div><div style="position: absolute; height: 0px; width: 1px; border-bottom: 0px solid transparent; top: 599px;"></div><div class="CodeMirror-gutters" style="height: 599px;"><div class="CodeMirror-gutter CodeMirror-linenumbers" style="width: 34px;"></div></div></div></div></pre><p><strong><span>V20211111</span></strong></p><ol start='' ><li><span>ONVIF组件增加图片参数范围获取,之前默认0-255,有些设备是0-100 0-128之类的,获取后设置到滑动条范围。</span></li><li><span>ONVIF组件增加网络参数设置,比如IP地址,子网掩码、网关地址、DNS设置等。</span></li><li><span>ONVIF组件将结构体定义统一移到一个头文件onvifstruct.h,方便后期拓展管理。</span></li><li><span>预置位模块,调用、添加(调用)、删除三种功能,改成了以三个按钮的形式加到每个预置位信息的后面直接单击使用。之前是先选中预置位所在行,然后单击下面的按钮。</span></li><li><span>通道轮询全部移动单独的悬停的模块。</span></li><li><span>视频面板窗体指针改成了全局变量,多处需要引用。</span></li><li><span>修复1通道轮询后,再次启动程序无法正确加载通道面板布局的BUG。</span></li><li><span>修复底部通道切换,部分样式效果悬停时候颜色不正确的BUG。改成了取报警图标颜色和已处理颜色。</span></li><li><span>路径规划模块增加模拟轨迹设备自动旋转角度移动。</span></li><li><span>路径规划模块模拟轨迹增加移动间隔下拉框选择。</span></li><li><span>修复Qt4对应webkit模块不支持返回数组的问题,改成字符串拼接用 ; 符隔开。</span></li><li><span>修复Qt4对应webkit模块不支持路径规划的BUG,因为开启了实时路况属性。</span></li><li><span>路径规划增加绘制实时轨迹线条,不同颜色显示。</span></li></ol><p><strong><span>V20211101</span></strong></p><ol start='' ><li><span>修正开启轮询后关闭所有视频通道不弹出提示信息。</span></li><li><span>所有信息框增加阴影边框区分突出显示,并跟随系统换肤自动更新边框阴影。</span></li><li><span>修正视频轮询分隔符,将|改成;因为如果是竖杠遇到带有参数的url则会出错。</span></li><li><span>将设备图片统一存放到config/device目录,之前在config目录下,随着越来越多非常凌乱。</span></li><li><span>修复之前通过信号执行通道切换,对应文字显示反了的BUG(通道1交换到通道2,新的通道2应该显示之前通道1的文本)。</span></li><li><span>将鼠标按下两个通道交换的处理代码,复用信号槽切换通道的函数。</span></li><li><span>将视频监控布局切换部分单独提取类VideoBox,专门负责管理各种通道布局切换,复用代码并且方便后期拓展,这部分代码和具体的处理无关,一直以来就想要单独提取出来进行管理,后期可以方便的增加其他异形布局以及255通道布局等,很多项目都用到了这个切换逻辑。</span></li><li><span>同时增加了布局切换子菜单比如13画面子菜单切换到52_64通道。</span></li><li><span>修复Qt6中视频控件悬浮条无法显示的BUG,因为Qt6将void enterEvent(QEvent *);改成了void enterEvent(QEnterEvent *);也不打个招呼。这种改变编译也不会提示的。</span></li><li><span>数据库组件修正sqlserver数据库必须设置数据源的不足,改成了dsn字符串形式,不需要新建数据源也能直接通信。</span></li><li><span>数据库组件修正mysql数据库必须存在默认数据库mysql的不足,改成了不需要默认数据库也能正常通信。</span></li><li><span>数据库组件修正没有默认数据库也能在建立连接后新建数据库操作。</span></li><li><span>数据库脚本执行将DROP DATABASE IF EXIST改成了DROP DATABASE ,这样无论什么时候都能先删除原来的数据库然后再新建数据库CREATE DATABASE。有些数据库不支持IF EXIST。</span></li></ol><p><strong><span>V20211005</span></strong></p><ol start='' ><li><span>修正ffmpeg内核,在播放地址不存在的情况下,打开容易卡主引起崩溃的BUG,在打开回调函数中增加对线程停止标志位的判断,一旦在打开的回调中识别到需要停止线程则立即返回结束。</span></li><li><span>增加临时信息中间弹出框提示信息,比如一次性关闭所有通道的时候,界面会卡主的期间提示。</span></li><li><span>增加忙碌鼠标图标切换显示,忙完以后自动恢复鼠标样式。</span></li><li><span>修正ffmpeg内核,开始时间记录可能出现问题的BUG,会导致部分特殊MP4文件打不开。</span></li><li><span>应用程序关闭,增加全局退出信号关联到视频通道管理类,先关闭所有视频通道再彻底退出应用程序。不这样处理的话,发现vlc内核在开启了视频存储的时候,会关不掉程序。</span></li><li><span>修复在没有声音播放的情况下主动调用停止播放造成崩溃的BUG。</span></li><li><span>修复在linux系统上QUIWidget弹出的无边框窗体带系统标题栏的BUG。</span></li><li><span>修复ffmpeg内核关闭视频后opengl窗体来不及隐藏的BUG。</span></li><li><span>修复重复立即刷新打开所有通道,前一次还没执行后一次又来了的BUG,改成了定时器处理,在立即执行前将上一次还没来得及执行的先停止。</span></li><li><span>增加about关于对话框窗体,显示版本号、版权所有、网址、电话等信息。</span></li><li><span>所有弹出窗体都跟随软件主窗体默认居中,这个特性非常棒。</span></li><li><span>所有皮肤增加右键菜单选中图标样式、右键菜单二级子菜单右侧小三角箭头图标样式,单选框、复选框、禁用状态图标全部更新,从图形字体绘制,极其统一舒服。</span></li><li><span>着重对日志类savelog增加了最大行数、最大文件大小等参数设置,可以设置按照行数或者大小来自动分割日志文件。</span></li><li><span>日志类增加了可过滤不同的消息类型,不同消息类型增加消息头。</span></li><li><span>经过大量对比测试发现,使用miniblink浏览器内核,容易卡,说不定什么时候就失效了,问题集中在32位,64位的目前没有发现这个现象,webengine暂时没有这个现象,但是加载打开摄像机的网页配置,还是miniblink更优秀。</span></li><li><span>中文标题栏支持换行,既可以副标题写在英文标题上,也可以同等大小字体写在中文标题上。</span></li></ol><p><strong><span>V20210922</span></strong></p><ol start='' ><li><span>视频控件边框增加0像素选项,这样看起来没有边框,有些场景需要无缝拼接。</span></li><li><span>修复当采用NVR通道作为摄像机视频流显示的时候,ONVIF处理索引越界崩溃的情况,因为一台NVR同一个IP地址对应多个摄像机。</span></li><li><span>所有样式17套皮肤更新边框颜色。</span></li><li><span>系统信息增加对应的编译器名字、位数、版本等。</span></li><li><span>演示demo增加视频叠加演示功能,比如在主视频的左上角、右上角、左下角、右下角在增加一个视频缩略图显示。</span></li><li><span>新增天气预报模块,可设置城市、采集间隔、展示样式等。</span></li><li><span>增加了vlc内核下USB摄像头格式自动纠正,如果采用ffmpeg的格式video=USB2.0 PC CAMERA|1920x1080自动纠正。</span></li><li><span>纠正vlc内核下USB摄像头不自动拉伸的BUG。</span></li><li><span>修正vlc内核动态保存视频文件,文件命名不符合规范,重新按照设定的重命名。</span></li><li><span>修复vlc内核中USB摄像头会当做rtsp视频流的BUG。</span></li><li><span>天气预报模块新增城市显示,新增双击弹出天气预报设置,含打印信息。</span></li><li><span>系统信息,增加秘钥文件的内容,比如允许的设备数量、到期日期等。</span></li><li><span>修复配置文件一旦新增加节点,之前节点全部初始值运行的BUG,应该是存在的节点则读取节点值,不存在的节点以初始值运行。</span></li></ol><p><strong><span>V20210705</span></strong></p><ol start='' ><li><span>改进窗体居中显示算法,可设置参照窗体,默认基于当前屏幕中心,可设置参照主窗体则基于参照窗体,在大分辨率屏幕效果非常好,不然主窗体很小,弹个窗找不到还在很远的地方,还以为没有弹呢。</span></li><li><span>将登陆窗体、登出窗体、用户管理等公用界面,做成了通用库core_form。</span></li><li><span>修复MAC系统上无边框窗体无法最小化的BUG。</span></li><li><span>增加超级管理员密码A具有所有权限的机制,避免管理员误将系统设置权限取消后无法再次进去系统设置的问题。</span></li><li><span>图片参数增加锐度,图片参数设置滑块调节松开立即设置。</span></li><li><span>修复当没有启用图片地图的时候对应界面隐藏的时候保存设备坐标位置报错BUG,因为没有启用的情况下没有设置对应的对象指针。</span></li></ol><p><strong><span>V20210603</span></strong></p><ol start='' ><li><span>将onvif搜索的用户密码,设备播放界面的设备密码等配置参数全部改成了密文存储。</span></li><li><span>大量修改代码,全部支持Qt4-Qt6所有版本。</span></li><li><span>调整onvif代码执行机制,改成了异步执行。</span></li><li><span>云台协议增加了连续移动。</span></li><li><span>增加了预置位相关处理,包括获取预置位、调用预置位、添加预置位、删除预置位。</span></li><li><span>自动巡航按照预置位集合进行,采用定时器去调用预置位队列。</span></li><li><span>增加图文警情行数、窗口信息行数配置,0行表示自动处理。</span></li><li><span>做了大量的代码改进,比如onvif内核换成了QDom对象处理,之前是采用的QXmlQuery查询,由于XmlPatterns这个模块逐渐废弃了,而且在Qt6中不再有,所以彻底移除了XmlPatterns相关的代码,改用其他处理方式实现。</span></li><li><span>增加了预置位和自动巡航处理,其中包括获取预置位集合、调用预置位、添加预置位、删除预置位、设置起始位、调用起始位等。</span></li><li><span>ONVIF内核几乎全部重写,将数据改成了结构体,比如设备信息、预置位信息、事件信息等,可以存储更多的数据,拓展也非常灵活。</span></li><li><span>onvif处理部分增加了对非onvif设备的过滤,通过判断是否存在onvif地址。这样可以大大加快处理速度,打开视频的时候去实例化onvif通信,关闭视频的时候删除对应的onvif类,这样可以动态响应。</span></li><li><span>所有onvif指令改成了线程处理,处理完成一个立马处理下一个,排队处理。</span></li></ol><p><strong><span>V20210425</span></strong></p><ol start='' ><li><span>配置文件密码改成密文存储。</span></li><li><span>增加了无敌的牛逼的万能的完美入微级自动分页导航控件。</span></li><li><span>日志记录表增加索引,速度提升100倍以上。</span></li><li><span>新增多个设备轨迹 不同颜色+传入经纬度 单独示例。</span></li><li><span>对地图核心类所有覆盖物都增加颜色+粗细+透明度的参数,可动态传入对应值。</span></li><li><span>系统设置增加用户管理模块,可分别设置对应的权限。</span></li><li><span>万能权限管理算法,通过设置不同需要授权的模块名称,对应切换的按钮自动计算。</span></li><li><span>增加了appkey秘钥类,用于校验秘钥是否正确,运行时间等。</span></li></ol><p><strong><span>V20210403</span></strong></p><ol start='' ><li><span>增加全局变量AppData::LastLiveTime,记住程序最后的活动时间-包括键盘+鼠标活动,用于两个判断,一个是超过多久没有操作全屏下隐藏鼠标光标,一个是超过多久没有操作如果没有全屏则自动全屏。</span></li><li><span>增加App::TimeAutoFull配置参数用来判断比较超时自动全屏。</span></li><li><span>重命名为TimeHideCursor表示程序多久未操作自动隐藏光标,TimeAutoFull程序多久未操作自动全屏界面,下拉框选项值增加0,表示不启用此功能。</span></li><li><span>增加信息列表模块frmMsgList,用于图文列表显示信息,对应兄弟类frmMsgTable用于表格显示消息。</span></li><li><span>大改版,将中间部分全部改成了QMainWindow,子模块全部采用停靠窗体,可以悬浮半透明,自动记忆每个模块的最后的位置,启动后自动应用。</span></li><li><span>移除大改版后的所有不需要用的变量和配置参数,重新调整配置参数。</span></li><li><span>增加透明度参数用于停靠窗体独立出来后的透明度。</span></li><li><span>将摄像机控制部分比如云台+控制+预置位+巡航,单独分类到ipc模块,方便管理。</span></li><li><span>限定操作员不能移动停靠窗体等,需要管理员设计好。</span></li><li><span>修复系统设置中工作模式等切换造成的自动重启会弹出退出和登录两个窗体的BUG。</span></li><li><span>修复自动登录用户计算不正确的BUG,要以最后登录的用户为准。</span></li></ol><p><strong><span>V20210322</span></strong></p><ol start='' ><li><span>USB摄像头增加参数帧率,第二个参数是分辨率,第三个参数为帧率,不设置则采用默认的帧率,video=USB2.0 PC CAMERA|1920x1080|25。</span></li><li><span>增加独立的demo模块,专门用于测试监控系统中用到的组件和控件,演示如何使用,比如视频图片界面演示从文件夹读取图片绘制到窗体,视频窗体演示系统的核心组件视频控件的设置参数如何使用等。</span></li><li><span>增加了对其他数据库的支持,比如posgres、oracle、odbc、kingbase等数据库,理论上只要支持odbc数据源方式的都支持。</span></li><li><span>增加IndexStart启动窗体索引配置参数,0-主程序 1-演示示例。</span></li></ol><p><strong><span>V20210305</span></strong></p><ol start='' ><li><span>修复数据库有时候没加载到的BUG。</span></li><li><span>新增配置参数控制画面切换的菜单和快捷图标是否显示。</span></li><li><span>ffmpeg内核增加了可动态保存机制,点击开始保存按钮启动保存,单击结束则生成视频文件,如此往复。</span></li><li><span>海康内核判断主码流子码流改成了 /101? 和 /main/ 同时判断。</span></li><li><span>新增多屏幕的支持,自动在对应屏幕最大化全屏,对话框位置,右下角提示框等。</span></li><li><span>再次分类存放代码文件,分成core ui class三大类。</span></li><li><span>系统配置更改视频控件参数,统一一个函数设置,initCommonVideoWidget函数中做了过滤,必须关闭状态的视频控件设置才起作用。</span></li><li><span>设备播放模块增加大华NVR的远程回放地址,其他地址计算算法调整。</span></li><li><span>新增界面模块功能启用配置参数。</span></li><li><span>新增主界面顶部导航模块中间界面,用于不同的运行模式加载不同的模块。</span></li></ol><h4 id='083-快速迭代'><span>0.8.3 快速迭代</span></h4><p><strong><span>V20201212</span></strong></p><ol start='' ><li><span>增加USB摄像机分辨率设置,直接url带掉。</span></li><li><span>所有地图内核公用一个,复用代码。</span></li><li><span>增加地图默认级别和中心点坐标设置参数。</span></li><li><span>主界面四个模块独立出来,做成了可配置,这样后期可以任意位置放置自定义模块。</span></li><li><span>四个模块标题栏自定义。</span></li><li><span>vlc内核和mpv内核的离线判断,当句柄模式下,统一为getLastTime,当调用该函数的时候自动查询播放状态,如果正在播放则自动更新时间为当前时间。</span></li><li><span>将各种在代码中define定义不同内核的代码全部优化,统一为一个类,很大减少代码量,统一为CommonVideoWidget和CommonVideoManage类。</span></li></ol><p><strong><span>V20201108</span></strong></p><ol start='' ><li><span>轮询点模块增加批量生成功能。</span></li><li><span>录像机、摄像机、轮询点,增加导入导出功能。</span></li><li><span>ffmpeg内核增加读取帧回调,超时识别,可以快速识别掉线。</span></li></ol><p><strong><span>20200828</span></strong></p><ol start='' ><li><span>增加了云台控制过滤,没有打开的视频禁用云台。</span></li><li><span>linux上全屏BUG修复,采用showfullscreen。</span></li><li><span>增加轮询点管理模块。</span></li><li><span>修正轮询的可能崩溃的BUG。</span></li></ol><p><strong><span>V20200730</span></strong></p><ol start='' ><li><span>系统设置增加了视频上传模块,用来将本地的视频文件传输到服务器,多线程并发。</span></li><li><span>视频监控内核新增MPV内核,修正了其他内核的部分函数和处理。</span></li><li><span>海康内核进行大改动,同时支持视频流和本地MP4文件播放,自动分析切换。</span></li><li><span>海康内核增加回调处理,可以拿到每一张图片。</span></li><li><span>海康内核进行了linux上的实验,可以正常播放。</span></li><li><span>ffmpeg内核增加保存到MP4。</span></li><li><span>本地文件回放vlc部分增加进度切换等。</span></li><li><span>悬浮条关闭按钮增加实际处理,之前只是打印消息。</span></li><li><span>改进了vlc和mpv的事件回调机制,使其同时支持qt4+qt5。</span></li></ol><p><strong><span>V20200620</span></strong></p><ol start='' ><li><span>增加了opengl显示实时视频,CPU占用极低。</span></li><li><span>增加了地图上设备点位置的调整。</span></li><li><span>设备点双击弹出实时视频预览。</span></li><li><span>增加GPS运动轨迹显示。</span></li><li><span>ffmpeg解码类增加了音频播放,采用的QAudioOutput。</span></li></ol><p><strong><span>V20191105</span></strong></p><ol start='' ><li><span>增加云台控制功能,可以上下左右等八个方位控制云台,默认采用相对移动,云台中间按下表示复位。</span></li><li><span>系统设置增加码流类型选择,默认子码流,切换完自动应用。</span></li><li><span>云台控制增加速度功能,值越大,速度越快。</span></li><li><span>增加焦距控制,可放大缩小,速度也可控制。</span></li></ol><h2 id='1-用户登录退出'><span>1 用户登录退出</span></h2><h3 id='11-用户登录'><span>1.1 用户登录</span></h3><p><span> </span><img src="snap/1-1-1.jpg" referrerpolicy="no-referrer">
|
||
<span> </span><img src="snap/1-1-2.jpg" referrerpolicy="no-referrer"></p><p><span>系统启动后,首先会弹出用户登录界面,从用户姓名的下拉框选择用户名,然后输入密码(默认用户名密码都是admin),单击登录按钮,密码正确则会进入到系统主界面,错误会弹出提示,错误超过三次自动关闭,需要重新打开软件。</span></p><p><span>在登录界面可以勾选是否记住密码,是否自动登录,如果勾选了记住密码,则下次启用软件会自动填入最后用户的密码,勾选了自动登录(以最后的用户信息作为当前登录用户)则启动后直接进入主界面。如果开启了自动登录,不会弹出登录界面,可以在系统设置中关闭自动登录和记住密码。</span></p><h3 id='12-用户退出'><span>1.2 用户退出</span></h3><p><span> </span><img src="snap/1-2-1.jpg" referrerpolicy="no-referrer"></p><p><span>在主界面单击右上角的关闭按钮,会弹出用户退出界面,需要输入密码验证防止误关闭,会自动填入登录的用户名,密码输入正确才会退出软件。用户登录和退出都内置了超级密码a防止管理员忘记密码。</span></p><h2 id='2-主界面操作'><span>2 主界面操作</span></h2><p><span> </span><img src="snap/2-0-1.jpg" referrerpolicy="no-referrer">
|
||
<span> </span><img src="snap/2-0-2.jpg" referrerpolicy="no-referrer"></p><p><span>主界面由顶部主菜单导航、左侧右侧停靠窗体(设备列表、窗口信息、图文警情、悬浮地图、云台控制、设备控制、预置巡航、视频轮询等)、中间视频监控主画面组成,其中左右两侧的停靠窗体可以拉伸宽度,上下停靠窗体之间也可以拉伸高度,每个停靠窗体都可以关闭和悬浮。自动保存布局文件,下次启动自动应用。</span></p><p><strong><span>新增说明</span></strong></p><ul><li><span>2021-5-8,主界面改成了停靠窗体模式。</span></li><li><span>拓展性更强,可以任意组合多种子模块。</span></li><li><span>模块可停靠悬浮。</span></li><li><span>在普通模式和全屏模式都有独立的布局文件。</span></li><li><span>不同的工作模式都可对应不同的布局文件。</span></li></ul><h3 id='21-面板显示隐藏'><span>2.1 面板显示隐藏</span></h3><p><span> </span><img src="snap/2-1-1.jpg" referrerpolicy="no-referrer">
|
||
<span> </span><img src="snap/2-1-2.jpg" referrerpolicy="no-referrer"></p><p><span>左侧和右侧的面板,可以通过单击面板右上角的关闭按钮来隐藏,当隐藏一个面板以后,剩余的面板会自动填充布局,如果需要重新显示面板,则在标题栏鼠标右键就可以对小面板进行显示和隐藏,右上角的时间和CPU显示面板可以在系统设置中控制显示隐藏。系统会自动记住最后的布局比如显示的面板和宽高占比,下次启动后自动应用。</span></p><p><strong><span>特别说明</span></strong></p><ol start='' ><li><span>在停靠窗体的标题栏鼠标右键也会弹出子窗体的开启菜单,复选框勾选表示显示,悬浮的窗体没有这个特性,一定要是嵌入在主界面中的子窗体标题栏才有。</span></li><li><span>如果是全屏模式,由于没有了标题栏,想要关闭模块的话,需要将其拖动到边缘嵌入主窗体,然后在标题栏鼠标右键菜单中关闭即可。</span></li></ol><h3 id='22-面板拖动'><span>2.2 面板拖动</span></h3><p><span> </span><img src="snap/2-2-1.jpg" referrerpolicy="no-referrer"></p><p><span>面板和面板之间有个分隔条,鼠标移到对应分隔条的地方,会变成可拉动的鼠标指针,此时可以上下左右拉动调整宽高,调整好以后会自动保存宽高比例,下次启动后自动应用最后的配置来显示。</span></p><h3 id='23-视频播放'><span>2.3 视频播放</span></h3><p><span> </span><img src="snap/2-3-1.jpg" referrerpolicy="no-referrer"></p><p><span>视频播放同时支持多种方式:</span></p><ol start='' ><li><span>双击子节点播放单个摄像机,在当前选中通道处播放。</span></li><li><span>双击父节点播放整个录像机的摄像机,依次排列。</span></li><li><span>按住子节点拖曳到对应通道,播放摄像机。</span></li><li><span>本地文件直接拖曳到通道,自动播放本地文件。</span></li><li><span>启动后自动播放最后通道的视频信息。</span></li><li><span>代码接口提供指定通道播放url。</span></li><li><span>代码接口提供指定两个通道交换,比如报警的时候将某个通道移到最前面显示。</span></li></ol><h3 id='24-视频截图'><span>2.4 视频截图</span></h3><p><span> </span><img src="snap/2-4-1.jpg" referrerpolicy="no-referrer"></p><p><span>在视频监控主界面,通道鼠标右键,会弹出右键菜单,选择截图当前视频或者截图所有视频,截图默认保存在可执行文件所在目录下的snap目录。视频面板底部工具栏也有截图按钮触发这个动作。</span>
|
||
<span>文件名格式:Ch1_2020-07-30-13-41-24.png。</span></p><h3 id='25-删除视频'><span>2.5 删除视频</span></h3><p><span> </span><img src="snap/2-5-1.jpg" referrerpolicy="no-referrer">
|
||
<span> </span><img src="snap/2-5-2.jpg" referrerpolicy="no-referrer"></p><p><span>有多种方法可以删除视频:</span></p><ol start='' ><li><span>鼠标右键删除当前视频。</span></li><li><span>鼠标右键删除所有视频。</span></li><li><span>按住通道画面移出视频监控画面。</span></li><li><span>悬浮条关闭按钮。</span></li></ol><h3 id='26-画面切换'><span>2.6 画面切换</span></h3><p><span> </span><img src="snap/2-6-1.jpg" referrerpolicy="no-referrer"></p><p><span>系统支持多画面切换,全屏切换等,包括1+4+6+8+9+13+16+25+36+64画面切换,如果还需要增加更多的画面比如81+100等,可以直接在源码中稍微修改即可。</span></p><ol start='' ><li><span>鼠标右键画面切换。</span></li><li><span>底部左侧画面切换缩略图。</span></li><li><span>快捷键alt+enter全屏。</span></li><li><span>快捷键esc退出全屏。</span></li></ol><p><span>64画面效果图</span>
|
||
<span> </span><img src="snap/2-6-2.jpg" referrerpolicy="no-referrer"></p><h3 id='27-声音调节'><span>2.7 声音调节</span></h3><p><span> </span><img src="snap/2-7-1.jpg" referrerpolicy="no-referrer"></p><p><span>在主界面画面栏右下角,按下声音图标自动弹出声音调节面板,失去焦点自动隐藏,拉动声音滚动条来调节声音大小,还有静音图标,声音调节目前做的是一个界面效果,并没有功能,具体功能自己实现,vlc内核和mpv内核已经封装了声音控制的接口函数。</span></p><h3 id='28-视频轮询'><span>2.8 视频轮询</span></h3><p><span> </span><img src="snap/2-8-1.jpg" referrerpolicy="no-referrer"></p><p><strong><span>功能说明</span></strong></p><ol start='' ><li><span>开启是否一运行自动轮询。</span></li><li><span>可设置轮询间隔,比如5s、10s、30s、60s等。</span></li><li><span>可设置轮询画面类型,比如1画面、4画面、9画面、16画面。</span></li><li><span>可选择切换不同的轮询方案。</span></li><li><span>开始轮询和停止轮询。</span></li><li><span>暂停轮询和继续轮询。</span></li></ol><h3 id='29-通道交换'><span>2.9 通道交换</span></h3><p><span> </span><img src="snap/2-9-1.jpg" referrerpolicy="no-referrer"></p><p><span>通道交换功能很常用,一般用户喜欢调整自己想要的通道显示到前面或者占据画面的更大部分,比如6画面8画面的时候,左侧有一个画面占据很大的位置,一般这个用来显示重要性最高的实时视频,如果需要通道交换,则按住通道拖动到另外一个通道上面松开鼠标即可,会立即应用,瞬间切换,这里切记不要移出视频画面外,移出去表示删除。</span></p><p><span>本系统也封装了代码中动态控制切换和动态交换,具体代码在DeviceThreadUI类中,具体全局函数在AppEvent类中。</span></p><pre class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" spellcheck="false" lang="cpp"><div class="CodeMirror cm-s-inner cm-s-null-scroll CodeMirror-wrap" lang="cpp"><div style="overflow: hidden; position: relative; width: 3px; height: 0px; top: 9.51471px; left: 35.9874px;"><textarea autocorrect="off" autocapitalize="off" spellcheck="false" tabindex="0" style="position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;"></textarea></div><div class="CodeMirror-scrollbar-filler" cm-not-content="true"></div><div class="CodeMirror-gutter-filler" cm-not-content="true"></div><div class="CodeMirror-scroll" tabindex="-1"><div class="CodeMirror-sizer" style="margin-left: 28px; margin-bottom: 0px; border-right-width: 0px; padding-right: 0px; padding-bottom: 0px;"><div style="position: relative; top: 0px;"><div class="CodeMirror-lines" role="presentation"><div role="presentation" style="position: relative; outline: none;"><div class="CodeMirror-measure"><pre><span>xxxxxxxxxx</span></pre><div class="CodeMirror-linenumber CodeMirror-gutter-elt"><div>5</div></div></div><div class="CodeMirror-measure"></div><div style="position: relative; z-index: 1;"></div><div class="CodeMirror-code" role="presentation" style=""><div class="CodeMirror-activeline" style="position: relative;"><div class="CodeMirror-activeline-background CodeMirror-linebackground"></div><div class="CodeMirror-gutter-background CodeMirror-activeline-gutter" style="left: -27.9958px; width: 28px;"></div><div class="CodeMirror-gutter-wrapper CodeMirror-activeline-gutter" style="left: -27.9958px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt CodeMirror-linenumber-show" style="left: 0px; width: 19px;">1</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-comment">//指定通道显示视频 id从0开始</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -27.9958px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 19px;">2</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-variable-3">void</span> <span class="cm-def">slot_loadVideo</span>(<span class="cm-variable-3">int</span> <span class="cm-variable">channel</span>, <span class="cm-variable-3">int</span> <span class="cm-variable">ipcID</span>);</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -27.9958px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 19px;">3</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-variable-3">void</span> <span class="cm-def">slot_loadVideo</span>(<span class="cm-variable-3">int</span> <span class="cm-variable">channel</span>, <span class="cm-keyword">const</span> <span class="cm-variable">QString</span> <span class="cm-operator">&</span><span class="cm-variable">url</span>);</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -27.9958px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 19px;">4</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-comment">//通道交换</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -27.9958px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt CodeMirror-linenumber-show" style="left: 0px; width: 19px;">5</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-variable-3">void</span> <span class="cm-def">slot_changeVideo</span>(<span class="cm-variable-3">int</span> <span class="cm-variable">channel1</span>, <span class="cm-variable-3">int</span> <span class="cm-variable">channel2</span>);</span></pre></div></div></div></div></div></div><div style="position: absolute; height: 0px; width: 1px; border-bottom: 0px solid transparent; top: 115px;"></div><div class="CodeMirror-gutters" style="height: 115px;"><div class="CodeMirror-gutter CodeMirror-linenumbers" style="width: 27px;"></div></div></div></div></pre><h3 id='210-云台控制'><span>2.10 云台控制</span></h3><p><span> </span><img src="snap/2-10-1.jpg" referrerpolicy="no-referrer"></p><p><span>如果需要控制云台移动,先要选择对应的通道,边缘会高亮,进行云台控制的前提是该摄像机要是支持云台的摄像机,很多人以为啥摄像机都可以移动,这是错误的,如果摄像机不支持云台,这个功能就别玩了,玩不起,经常遇到一些人说怎么云台不能用了,一检查尼玛原来摄像机根本没有云台。</span></p><p><span>本系统云台控制走的是onvif协议,没有使用私有协议,上百家厂家的摄像机,走私有协议会玩死人的,所以统一采用onvif通用协议,需要提前在系统设置中的摄像机管理,搜索摄像机,输入正确的onvif用户信息后一键获取到云台地址。</span></p><h3 id='211-设备控制'><span>2.11 设备控制</span></h3><p><span> </span><img src="snap/2-11-1.jpg" referrerpolicy="no-referrer"></p><p><span>设备控制部分,目前可以获取和设置图片参数、手动校时、重启设备等,上面那一堆复选框对应功能需要用厂家sdk去实现,后期可能会增加一些onvif能够处理的功能。和云台控制操作一样,操作前也是需要选中某个通道,然后才是对选中的通道进行设备控制,比如图片参数中的明亮度、对比度、饱和度。</span></p><h3 id='212-报警订阅'><span>2.12 报警订阅</span></h3><p><span> </span><img src="snap/2-12-1.jpg" referrerpolicy="no-referrer"></p><p><span>本系统默认支持海康摄像机的报警事件订阅,默认已经订阅,如果摄像机已经开启了报警事件的话,默认一般是关闭的,比如摄像机后面的开关量输入报警接口,需要web页面进去设置开启。报警订阅走的是onvif协议,默认测试过海康的摄像机,其余摄像机有些没有测试成功,后期会详细查下原因并改进,会持续更新完善。</span></p><h3 id='213-悬浮条操作'><span>2.13 悬浮条操作</span></h3><p><span> </span><img src="snap/2-13-1.jpg" referrerpolicy="no-referrer"></p><p><span>本系统中将视频显示这块都封装成了一个控件,每个视频控件都有自己独立的悬浮条,悬浮条的位置可以自行修改两三行代码调整,默认悬浮条在顶部,自动拉伸填充显示,你也可以改成左侧右侧等位置显示,高度可调。悬浮条是一排按钮组成,具体按钮什么名称标识符和功能,可以自定义,控件的封装只是默认放了一排按钮,除了关闭按钮实现了功能外,其余都是信号的形式发出去的,具体操作由程序员本身根据不同的厂家来定义不同的功能。</span></p><h3 id='214-标签设置'><span>2.14 标签设置</span></h3><p><span>视频控件已经将OSD标签封装好了,默认提供两路OSD设置,每个OSD都可以设置是否启用、位置、文字内容、文字颜色、图片、文字大小等,这些设置都提供了友好的接口设置。</span></p><p><span>在devicevideosmart.cpp文件中有设置示例,默认注释的,参数含义如下:</span></p><ol start='' ><li><span>设置标签可见:setOSD1Visible</span></li><li><span>设置文字大小:setOSD1FontSize</span></li><li><span>设置文本文字:setOSD1Text</span></li><li><span>设置文字颜色:setOSD1Color</span></li><li><span>设置标签格式:setOSD1Format</span></li><li><span>设置标签位置:setOSD1Position</span></li></ol><pre class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" spellcheck="false" lang="cpp" style="break-inside: unset;"><div class="CodeMirror cm-s-inner cm-s-null-scroll CodeMirror-wrap" lang="cpp"><div style="overflow: hidden; position: relative; width: 3px; height: 0px; top: 9.51471px; left: 42.9832px;"><textarea autocorrect="off" autocapitalize="off" spellcheck="false" tabindex="0" style="position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;"></textarea></div><div class="CodeMirror-scrollbar-filler" cm-not-content="true"></div><div class="CodeMirror-gutter-filler" cm-not-content="true"></div><div class="CodeMirror-scroll" tabindex="-1"><div class="CodeMirror-sizer" style="margin-left: 35px; margin-bottom: 0px; border-right-width: 0px; padding-right: 0px; padding-bottom: 0px;"><div style="position: relative; top: 0px;"><div class="CodeMirror-lines" role="presentation"><div role="presentation" style="position: relative; outline: none;"><div class="CodeMirror-measure"><pre><span>xxxxxxxxxx</span></pre><div class="CodeMirror-linenumber CodeMirror-gutter-elt"><div>21</div></div></div><div class="CodeMirror-measure"></div><div style="position: relative; z-index: 1;"></div><div class="CodeMirror-code" role="presentation" style=""><div class="CodeMirror-activeline" style="position: relative;"><div class="CodeMirror-activeline-background CodeMirror-linebackground"></div><div class="CodeMirror-gutter-background CodeMirror-activeline-gutter" style="left: -34.9916px; width: 35px;"></div><div class="CodeMirror-gutter-wrapper CodeMirror-activeline-gutter" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt CodeMirror-linenumber-show" style="left: 0px; width: 27px;">1</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-variable">widget</span><span class="cm-operator">-></span><span class="cm-variable">setOSD1Visible</span>(<span class="cm-atom">true</span>);</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">2</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-variable">widget</span><span class="cm-operator">-></span><span class="cm-variable">setOSD1FontSize</span>(<span class="cm-number">20</span>);</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">3</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-variable">widget</span><span class="cm-operator">-></span><span class="cm-variable">setOSD1Text</span>(<span class="cm-variable">QString</span>(<span class="cm-string">"当前人数: %1"</span>).<span class="cm-variable">arg</span>(<span class="cm-number">10</span>));</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">4</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-variable">widget</span><span class="cm-operator">-></span><span class="cm-variable">setOSD1Color</span>(<span class="cm-variable">QColor</span>(<span class="cm-string">"#D64D54"</span>));</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">5</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-variable">widget</span><span class="cm-operator">-></span><span class="cm-variable">setOSD1Format</span>(<span class="cm-number">0</span>);</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">6</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-variable">widget</span><span class="cm-operator">-></span><span class="cm-variable">setOSD1Position</span>(<span class="cm-number">1</span>);</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">7</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> </span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">8</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-keyword">enum</span> <span class="cm-def">OSDFormat</span> {</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">9</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">OSDFormat_Text</span> <span class="cm-operator">=</span> <span class="cm-number">0</span>, <span class="cm-comment">//文本</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt CodeMirror-linenumber-show" style="left: 0px; width: 27px;">10</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">OSDFormat_Date</span> <span class="cm-operator">=</span> <span class="cm-number">1</span>, <span class="cm-comment">//日期</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">11</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">OSDFormat_Time</span> <span class="cm-operator">=</span> <span class="cm-number">2</span>, <span class="cm-comment">//时间</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">12</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">OSDFormat_DateTime</span> <span class="cm-operator">=</span> <span class="cm-number">3</span>, <span class="cm-comment">//日期时间</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">13</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">OSDFormat_Image</span> <span class="cm-operator">=</span> <span class="cm-number">4</span> <span class="cm-comment">//图片</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">14</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;">};</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">15</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
|
||
</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">16</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-keyword">enum</span> <span class="cm-def">OSDPosition</span> {</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">17</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">OSDPosition_Left_Top</span> <span class="cm-operator">=</span> <span class="cm-number">0</span>, <span class="cm-comment">//左上角</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">18</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">OSDPosition_Left_Bottom</span> <span class="cm-operator">=</span> <span class="cm-number">1</span>, <span class="cm-comment">//左下角</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">19</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">OSDPosition_Right_Top</span> <span class="cm-operator">=</span> <span class="cm-number">2</span>, <span class="cm-comment">//右上角</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt CodeMirror-linenumber-show" style="left: 0px; width: 27px;">20</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">OSDPosition_Right_Bottom</span> <span class="cm-operator">=</span> <span class="cm-number">3</span> <span class="cm-comment">//右下角</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt CodeMirror-linenumber-show" style="left: 0px; width: 27px;">21</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;">};</span></pre></div></div></div></div></div></div><div style="position: absolute; height: 0px; width: 1px; border-bottom: 0px solid transparent; top: 484px;"></div><div class="CodeMirror-gutters" style="height: 484px;"><div class="CodeMirror-gutter CodeMirror-linenumbers" style="width: 34px;"></div></div></div></div></pre><h2 id='3-视频回放'><span>3 视频回放</span></h2><p><span>视频回放中有多个子模块,分别是不同的含义:</span></p><ol start='' ><li><span>本地回放:回放存储在本地电脑的视频文件。</span></li><li><span>远程回放:通过sdk方式回放NVR上的存储录像(暂未实现,每个厂家不一样)。</span></li><li><span>设备播放:通用的rtsp取流形式的播放实时视频和回放录像文件。</span></li><li><span>图片回放:查找对应文件夹下的所有通道图片,按照设定的间隔回复,类似视频效果,一般用在存储一堆图片序列的应用场景中。</span></li><li><span>视频上传:将查询的本地存储的视频文件上传到云端服务器。类似于将视频文件存储到服务器上,需要手动填写服务器地址和端口。</span></li></ol><h3 id='31-本地回放'><span>3.1 本地回放</span></h3><h4 id='311-视频查询'><span>3.1.1 视频查询</span></h4><p><span> </span><img src="snap/3-1-1.jpg" referrerpolicy="no-referrer"></p><p><span>本地回放模块主要用来回放存储在本地电脑上的视频,先从右侧选择要回放的通道,默认是所有通道,然后选择类型:存储视频还是报警视频,默认选择存储视频(目前也只有存储的视频,没有报警视频,报警视频的规则还没定好,一般都是买过去自己定义),然后选择要查询的开始时间和结束时间,单击查询按钮,会自动列出来,双击对应的视频文件名称就会播放,除了查询按钮,其余按钮均没有实现具体功能。</span></p><h4 id='312-存储规则'><span>3.1.2 存储规则</span></h4><p><span> </span><img src="snap/3-1-2.jpg" referrerpolicy="no-referrer"></p><ol start='' ><li><span>默认存储主目录 video_normal。</span></li><li><span>主目录下按照日期目录存放 比如 2021-04-07 2021-04-08。</span></li><li><span>日期目录下是单个的视频文件 比如 Ch1_2021-04-07-14-08-11.mp4。</span></li><li><span>拓展功能可以存储对应的数据文件比如经纬度数据和视频文件一个目录 名称一样 拓展名可以是 txt。</span></li></ol><h4 id='313-视频下载'><span>3.1.3 视频下载</span></h4><p><span> </span><img src="snap/3-1-3.jpg" referrerpolicy="no-referrer"></p><p><span>视频下载是将查询出来的视频文件,按照勾选了的文件保存到选择的目录中。</span></p><h3 id='32-远程回放'><span>3.2 远程回放</span></h3><p><span> </span><img src="snap/3-2-1.jpg" referrerpolicy="no-referrer"></p><p><span>远程回放模块是用来通过sdk的形式回放远程NVR设备上的录像文件,这个暂未实现,本系统主要是为了兼容性和通用性,通过具体sdk形式调用的处理都没有做,破坏了移植性,到了其他平台就没法使用了,本系统sdk使用这块默认用的海康sdk作为示例。</span></p><h3 id='33-设备播放'><span>3.3 设备播放</span></h3><p><span> </span><img src="snap/3-3-1.jpg" referrerpolicy="no-referrer"></p><p><span>设备播放模块主要是通过rtsp视频流的形式来拉取实时视频和回放视频,现在越来越多的NVR支持直接通过取流的形式来拉取实时视频流和回放视频,这样使用起来很方便,当然在拉取视频流的时候要传入用户信息,防止非法获取,现在越来越多的应用场景需要通过NVR来调取回放视频,传统的SDK的方式非常累厂家太多,而国标的形式太繁琐复杂,于是rtsp形式的最简单的方式应运而生,目前支持的厂家也越来越多,每个厂家格式的规则不一样,可以自行咨询厂家的规则,本程序默认实现了海康、大华和深广的规则。</span></p><h3 id='34-图片回放'><span>3.4 图片回放</span></h3><h4 id='341-图片查询'><span>3.4.1 图片查询</span></h4><p><span> </span><img src="snap/3-4-1.jpg" referrerpolicy="no-referrer"></p><p><span>选择设备通道和时间范围,单击查询按钮,会将查询到的图片序列按照日期的形式作为一行添加到列表结果中,双击可以自动播放,可以调节播放速度。</span></p><h4 id='342-存储规则'><span>3.4.2 存储规则</span></h4><p><span> </span><img src="snap/3-4-2.jpg" referrerpolicy="no-referrer"></p><ol start='' ><li><span>默认存储主目录 image_normal。</span></li><li><span>主目录下按照日期目录存放 比如 2021-04-07 2021-04-08。</span></li><li><span>日期目录下是单个的图片文件 比如 Ch1_2021-04-07-14-08-11-222.jpg。</span></li><li><span>拓展功能可以存储对应的数据文件比如警情文字和图片文件一个目录 名称一样 拓展名可以是 txt。</span></li></ol><h4 id='343-图片下载'><span>3.4.3 图片下载</span></h4><p><span> </span><img src="snap/3-4-3.jpg" referrerpolicy="no-referrer"></p><p><span>将勾选的图片序列文件,导出到选择的目录。</span></p><h4 id='344-导出报告'><span>3.4.4 导出报告</span></h4><p><span> </span><img src="snap/3-4-4.jpg" referrerpolicy="no-referrer"></p><p><span>图文混排,可以自定义信息,封装好的类,传入图片队列,图片自适应等比例缩放显示,超过自动分页。</span></p><h3 id='35-视频上传'><span>3.5 视频上传</span></h3><p><span> </span><img src="snap/3-5-1.jpg" referrerpolicy="no-referrer"></p><p><span>视频上传功能主要用来将本地存储的视频文件(也可以是其他文件),通过网络传输(默认TCP)上传到其他地方比如服务器,服务器上要运行接收文件的程序,这样就相当于远程备份视频文件的功能,视频文件可以勾选需要上传哪一些。</span></p><h4 id='351-本地设置'><span>3.5.1 本地设置</span></h4><p><span>本地只需要在视频监控系统客户端上切换到视频上传页面,然后选择要查询的日期范围,单击查询,会将视频文件查询出来显示在左边的表格中,可以勾选要上传的视频文件,右侧填写好服务器的IP和端口(默认6000),单击上传按钮,会多线程的形式上传文件。</span></p><h4 id='352-远程设置'><span>3.5.2 远程设置</span></h4><p><span>远程需要放置文件传输工具,该工具完整源码如果购买了视频监控系统,可以赠送,该工具同时具备了发送端和接收端的功能,配套视频监控系统使用的是接收端,视频监控系统作为发送端,填好监听端口后,单击监听按钮,一旦有连接文件上传,会自动显示对应的接收进度,文件名称以上传的文件名为准。</span></p><h4 id='353-文件加密'><span>3.5.3 文件加密</span></h4><p><span>默认文件传输过程采用了加密机制,意味着传输的数据是加密后的数据,接收到以后根据设置的秘钥进行解密重新生成文件,防止文件传输过程中被拦截,可自定义加密规则。</span></p><h4 id='354-功能特点'><span>3.5.4 功能特点</span></h4><ol start='' ><li><span>多线程收发文件,支持加密传输。</span></li><li><span>接收端支持监听端口接收文件和主动连接服务器接收文件两种方式。</span></li><li><span>按照 文件开始符+文件大小+文件内容+文件结束符 逐个分包接收。</span></li><li><span>可对接收的加密过的文件包进行解密输出。</span></li><li><span>如果采用连接服务器方式接收文件可指定请求文件。</span></li><li><span>接收端请求文件的形式可以作为通用的程序升级方案。</span></li><li><span>进度条实时更新收发文件的进度。</span></li><li><span>发送端可设置每个包最很大小即切片分包数量。</span></li><li><span>发送端可对文件的每个包进行加密传输。</span></li><li><span>发送端支持对包进行合并发送。</span></li><li><span>可指定目录对客户端发来的请求文件进行搜索。</span></li><li><span>每个功能独立的一个类,接口清晰友好,使用方便。</span></li><li><span>支持任意Qt版本、任意系统、任意编译器。</span></li></ol><h2 id='4-电子地图'><span>4 电子地图</span></h2><p><span>电子地图有多个子模块,分别不同的功能,在每个模块上,双击对应的摄像机,都可以弹出实时视频预览画面,支持多个画面同时打开,每个摄像机都一个画面窗体。</span></p><ol start='' ><li><span>图片地图:摄像机分布在平面图上。</span></li><li><span>离线地图:默认采用百度离线瓦片地图,本地使用。</span></li><li><span>在线地图:默认采用百度地图,需要联网使用。</span></li><li><span>路径规划:指定起始点和终点经纬度坐标,查询最优路径并绘制路线,提取路线坐标集合,动态模拟轨迹,比如机器人和飞机轨迹。</span></li></ol><h3 id='41-双击预览'><span>4.1 双击预览</span></h3><p><span> </span><img src="snap/4-1-1.jpg" referrerpolicy="no-referrer"></p><h3 id='42-图片地图'><span>4.2 图片地图</span></h3><p><span> </span><img src="snap/4-2-1.jpg" referrerpolicy="no-referrer"></p><ol start='' ><li><span>图片地图的功能是为了方便直接提供图片文件,然后摄像机点位可直接拖动,更精确定位的场景,图片可以提供鸟瞰图这种,看起来更直观大气,有3D的感觉。</span></li><li><span>图片文件存放在可执行文件下的map文件夹下,如果需要增加或者删除,可以直接文件操作即可,比如复制新的图片文件到这个目录下即可。</span></li><li><span>具体摄像机对应哪张图片,可以在摄像机管理中设置,对应字段为地图,直接下拉选择对应的地图即可,默认选择无,就是该摄像机不属于任何地图。</span></li></ol><h3 id='43-离线地图'><span>4.3 离线地图</span></h3><p><span> </span><img src="snap/4-3-1.jpg" referrerpolicy="no-referrer"></p><p><span>功能和在线地图完全一致,唯一区别就是地图是离线的,不需要联网。离线的地图需要自己准备好,可以网上通过瓦片地图下载器来下载需要的地方的离线地图,一般离线地图比较大,他是一张张图片,所以建议离线地图只下载自己需要的即可,比如某个县的地图,而不是所有的,所有的起码有几十GB。</span></p><p><strong><span>使用说明</span></strong></p><ol start='' ><li><span>默认系统提供的是上海市的地图。</span></li><li><span>下载地址在下面文章中,会自动更新地址。</span>
|
||
<a href='https://blog.csdn.net/feiyangqingyun/article/details/104005917' target='_blank' class='url'>https://blog.csdn.net/feiyangqingyun/article/details/104005917</a></li><li><span>请下载同目录下的bin_map_tiles.zip压缩包,解压到config目录下,最后config文件夹下会多出来tiles tiles_hybrid两个文件夹。</span></li></ol><h3 id='44-在线地图'><span>4.4 在线地图</span></h3><p><span> </span><img src="snap/4-4-1.jpg" referrerpolicy="no-referrer"></p><p><span>在摄像机管理的界面,可以添加经纬度信息,这样就可以在地图上显示对应的摄像机点位信息,如果发现位置不对,可以在右侧先选择摄像机设备,然后鼠标单击新的位置,右侧目标经度、目标纬度信息会自动更新,然后再单击更新经纬度值则会更新当前下拉选择的设备的经纬度信息,也可以在摄像机管理界面手动填入进行修改。</span></p><p><span>在右侧还有模拟运动轨迹、开始显示轨迹两个按钮,有可能后期还会增加其他功能,是为了演示如何在地图上实现地图的相关功能,开始显示轨迹采用的定时器来生成轨迹点数据,动态模拟运动轨迹,可以单击显示设备位置按钮还原最初的设备点位图。</span></p><p><strong><span>功能特点</span></strong></p><ol start='' ><li><span>同时支持在线地图和离线地图两种模式。</span></li><li><span>同时支持webkit内核、webengine内核、IE内核。</span></li><li><span>支持设置多个标注点,信息包括名称、地址、经纬度。</span></li><li><span>可设置地图是否可单击、拖动、鼠标滚轮缩放。</span></li><li><span>可设置协议版本、秘钥、主题样式、中心坐标、中心城市、地理编码位置等。</span></li><li><span>可设置地图缩放比例和级别,缩略图、比例尺、路况信息等控件的可见。</span></li><li><span>支持地图交互,比如鼠标按下获取对应位置的经纬度。</span></li><li><span>支持查询路线,可设置起点位置、终点位置、路线模式、路线方式、路线方案(最少时间、最少换乘、最少步行、不乘地铁、最短距离、避开高速)。</span></li><li><span>可显示点线面工具,可直接在地图上划线、点、矩形、圆形等。</span></li><li><span>可设置行政区划,指定某个城市区域绘制图层,在线地图自动输出行政区划边界点集合到js文件给离线地图使用。</span></li><li><span>可静态或者动态添加多个覆盖物。支持点、折线、多边形、矩形、圆形、弧线、点聚合等。</span></li><li><span>函数接口友好和统一,使用简单方便,就一个类。</span></li><li><span>支持js动态交互添加点、删除点、清空点、重置点,不需要刷新页面。</span></li><li><span>支持任意Qt版本、任意系统、任意编译器。</span></li></ol><h3 id='45-路径规划'><span>4.5 路径规划</span></h3><p><span> </span><img src="snap/4-5-1.jpg" referrerpolicy="no-referrer"></p><p><strong><span>基本步骤</span></strong></p><ol start='' ><li><span>输入起点坐标和终点坐标,也可以勾选地图选点,开启后直接在左侧的地图界面鼠标按下自动识别对应的经纬度坐标填入,单选框勾选的起点则填入起点坐标输入框中,勾选的终点就填入终点坐标输入框中。</span></li><li><span>选择路线方式,可选公交、驾车、步行、骑行等方式,默认选择步行。</span></li><li><span>选择路线方案,可选最少时间、最短距离、避开高速等。</span></li><li><span>输入关键点数,一般查询返回的路径的经纬度坐标点数非常密集,可能非常多,我们需要根据输入的关键点数来过滤,比如输入30,表示从所有经纬度数据中平均提取出来30个数据就行。点数合计,查询路线后自动返回所有经纬度坐标的数据个数。</span></li><li><span>单击查询路线,自动返回对应路径的所有经纬度坐标。</span></li><li><span>单击帅选数据,按照填入的关键点数进行数据帅选,在下方可以看到原始数据和最终数据,选中某个数据,自动在左侧生成点预览对应的位置。</span></li><li><span>单击模拟轨迹,会启动定时器,从第一个数据点开始,自动移动设备比如机器人、飞行器等,查看整个轨迹点路径是否正确。</span></li></ol><h2 id='5-日志查询'><span>5 日志查询</span></h2><h3 id='51-本地日志'><span>5.1 本地日志</span></h3><p><span> </span><img src="snap/5-1-1.jpg" referrerpolicy="no-referrer"></p><p><span>本地日志存放的是本系统的操作日志,比如用户登录退出、记录删除、设备报警等操作,都会有对应的记录存放的数据库,可以在这里选择时间段和日志类型进行查询。查询后的日志记录可以翻页查看,还可以直接支持指定页码跳转,(此翻页组件超级牛逼,外观和功能分离,自动计算页码切换导航,具体可参见对应类的头文件功能描述),每页显示多少条记录在系统设置中可以设置。</span></p><h4 id='511-查询记录'><span>5.1.1 查询记录</span></h4><ul><li><span>可以按照多条件进行查询记录。</span></li><li><span>可以选择设备通道。</span></li><li><span>可以选择日志的类型:用户操作、运行日志、设备日志、报警日志。</span></li><li><span>可以选择时间范围。</span></li><li><span>在查询记录的时候,如果勾选了前面的复选框则表示启用该选择条件进行查询。</span></li><li><span>没有勾选,就算后面选择了类型等,也是按照where 1=1 条件查询的。</span></li><li><span>查询后的记录会自动分页显示,而不是一次性显示。</span></li><li><span>可以单击底部的翻页按钮进行翻页查看记录。</span></li><li><span>可以快速切换到第一页、末一页、上一页、下一页、显示的页码切换、指定的页码切换。</span></li></ul><h4 id='512-打印记录'><span>5.1.2 打印记录</span></h4><p><span> </span><img src="snap/5-1-2.jpg" referrerpolicy="no-referrer"></p><p><span>单击打印按钮,会将当前查询的记录打印出来,自动分页。打印前会弹出打印预览对话框,可以最后在这里调整边距、纸张等设置参数。</span></p><h4 id='513-导出记录到xls'><span>5.1.3 导出记录到xls</span></h4><p><span> </span><img src="snap/5-1-3.jpg" referrerpolicy="no-referrer"></p><p><span>单击XLS按钮可以将表格中的内容导出到excel表格,独创的excel导出数据算法,极速导出,支持任意系统,无依赖。</span></p><h4 id='514-导出记录到pdf'><span>5.1.4 导出记录到pdf</span></h4><p><span> </span><img src="snap/5-1-4.jpg" referrerpolicy="no-referrer"></p><h4 id='515-删除记录'><span>5.1.5 删除记录</span></h4><p><span> </span><img src="snap/5-1-5.jpg" referrerpolicy="no-referrer"></p><p><span>单击删除按钮,会弹出时间范围选择对话框,选择要删除的记录的开始时间和结束时间,单击确定,会将该时间段内的记录全部删除,结束时间必须大于开始时间。</span></p><h4 id='516-清空记录'><span>5.1.6 清空记录</span></h4><p><span>单击清空按钮会先弹出询问框提示是否需要清空数据,单击确定则自动清空所有的记录,清空后不能恢复。</span></p><h3 id='52-设备日志'><span>5.2 设备日志</span></h3><p><span> </span><img src="snap/5-2-1.jpg" referrerpolicy="no-referrer"></p><p><span>设备日志是指直接通过sdk协议,远程从NVR设备上拉取日志记录到本地显示,其余功能和本地日志一致,此功能未实现。</span></p><h2 id='6-系统设置'><span>6 系统设置</span></h2><h3 id='61-基本设置'><span>6.1 基本设置</span></h3><p><span> </span><img src="snap/6-1-0.jpg" referrerpolicy="no-referrer"></p><h4 id='611-常规设置'><span>6.1.1 常规设置</span></h4><p><span> </span><img src="snap/6-1-1.jpg" referrerpolicy="no-referrer"></p><p><span>基本设置中有部分参数的切换会自动重启应用。</span></p><p><strong><span>参数说明</span></strong></p><ol start='' ><li><span>开机运行:开启以后自动随着系统启动运行,默认开启。</span></li><li><span>自动登录:开启以后会自动以最后登录的用户信息登录到系统,默认关闭。</span></li><li><span>记住密码:开启以后会自动填入最后登录的用户信息到登录窗体,默认关闭。</span></li><li><span>中文标题:软件左上角标题栏的中文标题,改动立即应用。</span></li><li><span>英文标题:软件左上角标题栏的英文标题,改动立即应用。</span></li><li><span>版权所有:当前软件版权所有的公司,目前没有显示在哪里,备用。</span></li><li><span>调试日志:开启后会将打印日志输出到日志文件,默认关闭,日志文件存放在可执行文件夹下的log目录下。</span></li><li><span>运行时间:开启后会实时记录系统的运行时间,记录当前软件启动后运行了多久,运行时间文件存放在可执行文件夹下的log目录下。</span></li><li><span>工作模式:默认视频监控,可选机器人监控、无人机监控等。</span></li><li><span>导航样式:用于选择顶部导航栏和左侧导航栏的样式,上侧+左侧表示顶部导航栏上侧样式(图标在上面,文字在下面),左侧导航栏左侧样式(图标在左侧,文字在右侧)。</span></li><li><span>界面样式:系统自带17套皮肤,可以在这里自动换肤,默认视频黑。</span></li><li><span>软件图标:自动从logo文件夹读取,可以自行选择对应的logo文件。</span></li><li><span>全屏模式:开启以后,最大化显示自动全屏显示而不是最大化显示,默认关闭。</span></li><li><span>弹框时间:右下角弹出提示信息自动关闭时间,0秒表示常驻不关闭。</span></li><li><span>报警声音:0表示不启用,其余表示报警后播放的声音次数。</span></li><li><span>鼠标隐藏:主界面多久鼠标没有操作过会自动隐藏鼠标指针,一般在全屏轮询的时候需要设置,效果会更好。</span></li><li><span>自动全屏:经过多久以后鼠标没有操作过自动全屏,0表示不启用。</span></li><li><span>备用开关:后面做其他功能使用。</span></li><li><span>图文警情:图文警情模块消息行数,0表示自动计算填满,不产生滚动条。</span></li><li><span>窗口消息:窗口消息模块消息行数,0表示自动计算填满,不产生滚动条。</span></li><li><span>透明度值:停靠窗体的透明度值,可调节,动态应用。</span></li></ol><h4 id='612-视频参数'><span>6.1.2 视频参数</span></h4><p><span> </span><img src="snap/6-1-2.jpg" referrerpolicy="no-referrer"></p><p><strong><span>参数说明</span></strong></p><ol start='' ><li><span>保存视频:开启以后打开视频自动存储录像文件,目录在可执行文件video_normal。</span></li><li><span>存储间隔:录像文件按照什么规则存储视频,0分钟表示只存储到单个文件。</span></li><li><span>视频边框:视频控件的边框的宽度,值越大边框越粗。</span></li><li><span>报警视频:开启以后保存报警视频到可执行文件video_alarm,暂未启用。</span></li><li><span>硬件加速:当前视频内核采用何种硬件加速方式,默认none表示不启用硬件加速(常用的所有qsv、dxva2、d3d11va,建议用dxva2或者d3d11va,具体根据电脑是否支持定)。</span></li><li><span>通信方式:视频流采用何种通信方式,默认TCP(可靠连接,不会丢包,缺点就是慢),可选UDP(不可靠连接,容易丢包,但是速度快)。</span></li><li><span>视频回调:是否采用回调的形式来解码显示视频,比如vlc内核和海康内核都支持回调。</span></li><li><span>码流类型:双击摄像机以什么码流地址加载实时视频,默认子码流。</span></li><li><span>解码方式:ffmpeg内核有用,可选速度优先、质量优先、均衡处理。</span></li><li><span>播放音频:开启以后可以播放声音,有时候不需要声音的时候可以关闭,节省资源。</span></li><li><span>图片拉伸:默认开启,通道画面按照填充拉伸显示,不开启的话则按照等比例缩放。</span></li><li><span>打开间隔:软件启动后挨个加载打开视频的间隔,默认1秒钟。</span></li><li><span>重连间隔:软件多久检测一次摄像机是否掉线,默认10秒钟。</span></li><li><span>事件订阅:开启以后会用onvif的机制订阅报警事件。</span></li><li><span>自动校时:开启后摄像机上线立即同步本地时间到摄像机。</span></li></ol><h4 id='613-数据库设置'><span>6.1.3 数据库设置</span></h4><p><span> </span><img src="snap/6-1-3.jpg" referrerpolicy="no-referrer"></p><p><strong><span>参数说明</span></strong></p><ol start='' ><li><span>远程同步:开启后将会启用云端数据同步功能,将本地数据实时同步到远程数据库中。</span></li><li><span>主机类型:和本地数据库设置一样,可选多种。</span></li><li><span>数据库名:对应数据库的数据库名称,一个数据库系统中可以有多个数据库实例。</span></li><li><span>主机地址:数据库所在的网络地址,可以是IP地址或者网址。</span></li><li><span>通信端口:数据库开放通信的端口,不同数据库默认端口不同,比如mysql是3306,postgres是5432,sqlserver是1433。</span></li><li><span>用户名称:登录到网络数据库对应的用户名称,所有的网络型数据库都需要用户认证。sqlite是文件型数据库一般不需要认证。</span></li><li><span>用户密码:登录到网络数据库对应的用户密码,所有的网络型数据库都需要用户认证。sqlite是文件型数据库一般不需要认证。</span></li><li><span>连接测试:单击后主动连接一次当前填入的数据库信息,连接成功与失败都会弹框提示。</span></li><li><span>初始数据:单击后会执行sql脚本文件,重置数据库,会将原来的数据一并清空。务必记得只有需要的时候才执行。</span></li></ol><p><strong><span>其他说明</span></strong></p><ol start='' ><li><span>默认提供了数据库脚本文件(拓展名sql结尾的文件)。</span></li><li><span>单击初始化数据按钮可以对整个数据库进行新建和重置,相当于恢复出厂。</span></li><li><span>系统支持多种数据库,默认sqlite(Qt内置的数据库,无需安装),可选mysql、postgresql、oracle、人大金仓等。</span></li><li><span>具体还需要对应Qt版本有数据库插件支持,没有插件支持可以自行编译对应缺失的插件比如mysql,也可选直接通过万能的ODBC来连接。</span></li><li><span>除了sqlite数据库外,其余数据库都需要输入数据库名称、主机地址、通信端口、用户名称、用户密码信息,输入好以后可以单击连接测试按钮测试下是否正常。</span></li><li><span>默认提供的是mysql的动态库libmysql.dll,需要放到可执行文件同一目录,严格区分32位和64位的动态库。</span></li></ol><pre class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" spellcheck="false" lang="cpp" style="break-inside: unset;"><div class="CodeMirror cm-s-inner cm-s-null-scroll CodeMirror-wrap" lang="cpp"><div style="overflow: hidden; position: relative; width: 3px; height: 0px; top: 9.51471px; left: 42.9832px;"><textarea autocorrect="off" autocapitalize="off" spellcheck="false" tabindex="0" style="position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;"></textarea></div><div class="CodeMirror-scrollbar-filler" cm-not-content="true"></div><div class="CodeMirror-gutter-filler" cm-not-content="true"></div><div class="CodeMirror-scroll" tabindex="-1"><div class="CodeMirror-sizer" style="margin-left: 35px; margin-bottom: 0px; border-right-width: 0px; padding-right: 0px; padding-bottom: 0px;"><div style="position: relative; top: 0px;"><div class="CodeMirror-lines" role="presentation"><div role="presentation" style="position: relative; outline: none;"><div class="CodeMirror-measure"><pre><span>xxxxxxxxxx</span></pre><div class="CodeMirror-linenumber CodeMirror-gutter-elt"><div>38</div></div></div><div class="CodeMirror-measure"></div><div style="position: relative; z-index: 1;"></div><div class="CodeMirror-code" role="presentation" style=""><div class="CodeMirror-activeline" style="position: relative;"><div class="CodeMirror-activeline-background CodeMirror-linebackground"></div><div class="CodeMirror-gutter-background CodeMirror-activeline-gutter" style="left: -34.9916px; width: 35px;"></div><div class="CodeMirror-gutter-wrapper CodeMirror-activeline-gutter" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt CodeMirror-linenumber-show" style="left: 0px; width: 27px;">1</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-comment">//数据库类型枚举</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">2</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-keyword">enum</span> <span class="cm-def">DbType</span> {</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">3</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">DbType_ODBC</span> <span class="cm-operator">=</span> <span class="cm-number">0</span>, <span class="cm-comment">//odbc数据源</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">4</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">DbType_Sqlite</span> <span class="cm-operator">=</span> <span class="cm-number">1</span>, <span class="cm-comment">//sqlite数据库</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">5</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">DbType_MySql</span> <span class="cm-operator">=</span> <span class="cm-number">2</span>, <span class="cm-comment">//mysql数据库</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">6</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">DbType_PostgreSQL</span> <span class="cm-operator">=</span> <span class="cm-number">3</span>, <span class="cm-comment">//postgresql数据库</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">7</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">DbType_SqlServer</span> <span class="cm-operator">=</span> <span class="cm-number">4</span>, <span class="cm-comment">//sqlserver数据库</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">8</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">DbType_Oracle</span> <span class="cm-operator">=</span> <span class="cm-number">5</span>, <span class="cm-comment">//oracle数据库</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">9</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">DbType_KingBase</span> <span class="cm-operator">=</span> <span class="cm-number">6</span>, <span class="cm-comment">//人大金仓数据库</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt CodeMirror-linenumber-show" style="left: 0px; width: 27px;">10</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">DbType_Other</span> <span class="cm-operator">=</span> <span class="cm-number">255</span> <span class="cm-comment">//其他数据库</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">11</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;">};</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">12</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
|
||
</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">13</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-comment">//自动切换默认数据库端口</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">14</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-variable-3">void</span> <span class="cm-def">DbHelper::getDbDefaultInfo</span>(<span class="cm-keyword">const</span> <span class="cm-variable">QString</span> <span class="cm-operator">&</span><span class="cm-variable">dbType</span>, <span class="cm-variable">QString</span> <span class="cm-operator">&</span><span class="cm-variable">hostPort</span>,</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">15</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">QString</span> <span class="cm-operator">&</span><span class="cm-variable">userName</span>, <span class="cm-variable">QString</span> <span class="cm-operator">&</span><span class="cm-variable">userPwd</span>)</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">16</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;">{</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">17</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-keyword">if</span> (<span class="cm-variable">dbType</span> <span class="cm-operator">==</span> <span class="cm-string">"MYSQL"</span>) {</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">18</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">hostPort</span> <span class="cm-operator">=</span> <span class="cm-string">"3306"</span>;</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">19</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">userName</span> <span class="cm-operator">=</span> <span class="cm-string">"root"</span>;</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt CodeMirror-linenumber-show" style="left: 0px; width: 27px;">20</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">userPwd</span> <span class="cm-operator">=</span> <span class="cm-string">"root"</span>;</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">21</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> } <span class="cm-keyword">else</span> <span class="cm-keyword">if</span> (<span class="cm-variable">dbType</span> <span class="cm-operator">==</span> <span class="cm-string">"SQLSERVER"</span>) {</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">22</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">hostPort</span> <span class="cm-operator">=</span> <span class="cm-string">"1433"</span>;</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">23</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">userName</span> <span class="cm-operator">=</span> <span class="cm-string">"sa"</span>;</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">24</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">userPwd</span> <span class="cm-operator">=</span> <span class="cm-string">"123456"</span>;</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">25</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> } <span class="cm-keyword">else</span> <span class="cm-keyword">if</span> (<span class="cm-variable">dbType</span> <span class="cm-operator">==</span> <span class="cm-string">"POSTGRESQL"</span>) {</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">26</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">hostPort</span> <span class="cm-operator">=</span> <span class="cm-string">"5432"</span>;</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">27</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">userName</span> <span class="cm-operator">=</span> <span class="cm-string">"postgres"</span>;</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">28</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">userPwd</span> <span class="cm-operator">=</span> <span class="cm-string">"123456"</span>;</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">29</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> } <span class="cm-keyword">else</span> <span class="cm-keyword">if</span> (<span class="cm-variable">dbType</span> <span class="cm-operator">==</span> <span class="cm-string">"ORACLE"</span>) {</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt CodeMirror-linenumber-show" style="left: 0px; width: 27px;">30</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">hostPort</span> <span class="cm-operator">=</span> <span class="cm-string">"1521"</span>;</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">31</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">userName</span> <span class="cm-operator">=</span> <span class="cm-string">"system"</span>;</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">32</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">userPwd</span> <span class="cm-operator">=</span> <span class="cm-string">"123456"</span>;</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">33</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> } <span class="cm-keyword">else</span> <span class="cm-keyword">if</span> (<span class="cm-variable">dbType</span> <span class="cm-operator">==</span> <span class="cm-string">"KINGBASE"</span>) {</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">34</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">hostPort</span> <span class="cm-operator">=</span> <span class="cm-string">"54321"</span>;</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">35</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">userName</span> <span class="cm-operator">=</span> <span class="cm-string">"SYSTEM"</span>;</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">36</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">userPwd</span> <span class="cm-operator">=</span> <span class="cm-string">"123456"</span>;</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">37</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> }</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt CodeMirror-linenumber-show" style="left: 0px; width: 27px;">38</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;">}</span></pre></div></div></div></div></div></div><div style="position: absolute; height: 0px; width: 1px; border-bottom: 0px solid transparent; top: 875px;"></div><div class="CodeMirror-gutters" style="height: 875px;"><div class="CodeMirror-gutter CodeMirror-linenumbers" style="width: 34px;"></div></div></div></div></pre><h4 id='614-地图配置'><span>6.1.4 地图配置</span></h4><p><span> </span><img src="snap/6-1-4.jpg" referrerpolicy="no-referrer"></p><p><strong><span>参数说明</span></strong></p><ol start='' ><li><span>地图秘钥:对应百度地图的秘钥,默认内置的作者的秘钥,很多软件系统都用的这个秘钥,用户数较多,可能有并发限制,为了不影响体验,强烈建议改成自己的,可以自行去官网申请,免费。</span></li><li><span>地图中心:默认地图的中心点坐标。</span></li><li><span>地图级别:默认地图打开以后的缩放级别。</span></li></ol><h4 id='615-功能激活'><span>6.1.5 功能激活</span></h4><p><span> </span><img src="snap/6-1-5.jpg" referrerpolicy="no-referrer"></p><p><strong><span>参数说明</span></strong></p><ul><li><span>勾选则表示启用。</span></li><li><span>可以对各种分屏进行功能激活。</span></li><li><span>需要重启应用。</span></li><li><span>没有勾选的,不会显示对应的菜单切换和分屏快捷按钮。</span></li><li><span>多个子界面模块也可以选择显示或者隐藏,以便将不需要的模块隐藏掉,碍眼。</span></li></ul><h4 id='616-颜色配置'><span>6.1.6 颜色配置</span></h4><p><span> </span><img src="snap/6-1-6.jpg" referrerpolicy="no-referrer"></p><p><span>可以设置不同的场景不同的颜色,比如正常的系统消息显示白色,异常消息红色。</span></p><h3 id='62-录像机管理'><span>6.2 录像机管理</span></h3><p><span> </span><img src="snap/6-2-1.jpg" referrerpolicy="no-referrer"></p><p><span>本系统所用的录像机信息,并没有实际的作用,也就是不一定要填写实际的录像机信息,留作备用后期使用,目前仅仅是作为生成设备的树状列表使用(类似于区域),如果一个录像机都没有填写,则会自动生成一个默认的录像机信息。</span></p><p><strong><span>字段说明</span></strong></p><ol start='' ><li><span>设备编号:录像机的编号,唯一字段。</span></li><li><span>设备名称:录像机的别名,建议不要重复。</span></li><li><span>设备类型:录像机的厂家类型,可选海康、大华、宇视、其他等。</span></li><li><span>设备地址:录像机的IP地址。</span></li><li><span>用户姓名:录像机的登录用户名称。</span></li><li><span>用户密码:录像机的登录用户密码。</span></li><li><span>启用状态:录像机设备是否启用。</span></li><li><span>安装位置:录像机的安装位置。</span></li></ol><h4 id='621-录像机添加'><span>6.2.1 录像机添加</span></h4><p><span>单击添加按钮,会自动规则生成默认的信息,直接表格中修改即可,修改好以后单击保存按钮保存所有的信息。</span></p><h4 id='622-录像机删除'><span>6.2.2 录像机删除</span></h4><p><span>如果要删除某个录像机信息,需要先选中该行,然后单击删除按钮,删除后会自动保存。</span></p><h4 id='623-录像机清空'><span>6.2.3 录像机清空</span></h4><p><span>单击清空按钮会对整个表进行清空操作,清空后数据不能恢复,慎用。</span></p><h4 id='624-录像机信息导入'><span>6.2.4 录像机信息导入</span></h4><p><span>单击导入按钮,可以选择之前导出的csv格式的文件导入数据。</span></p><h4 id='625-录像机信息导出'><span>6.2.5 录像机信息导出</span></h4><p><span>单击导出按钮,将表格数据导出到csv格式的文件,用户可以打开文件编辑,然后再次导入,这样可以作为简易的备份机制使用,也可将繁琐的基础数据录入交给小姑娘去做。 </span></p><h4 id='626-录像机信息打印'><span>6.2.6 录像机信息打印</span></h4><p><span> </span><img src="snap/6-2-6.jpg" referrerpolicy="no-referrer"></p><p><span>单击打印按钮可以将表格中的内容打印出来,打印前会弹出打印预览界面,可以自行做边距的调整等,可以查看等待打印的内容,翻页切换。</span></p><h4 id='627-导出到excel'><span>6.2.7 导出到Excel</span></h4><p><span> </span><img src="snap/6-2-7.jpg" referrerpolicy="no-referrer"></p><p><span>单击导出按钮可以将表格中的内容导出到excel表格,独创的excel导出数据算法,极速导出,支持任意系统,无依赖。</span></p><h3 id='63-摄像机管理'><span>6.3 摄像机管理</span></h3><p><span> </span><img src="snap/6-3-1.jpg" referrerpolicy="no-referrer"></p><p><span>摄像机表信息,是整个系统中最核心的表,这里管理的所有的摄像机信息,并不是所有的字段都显示出来了,比如onvif地址、云台地址等都是隐藏的,因为无需添加更改,需要搜索自动添加的。</span></p><p><strong><span>字段说明</span></strong></p><ol start='' ><li><span>设备编号:摄像机的唯一编号。</span></li><li><span>设备名称:摄像机的别名,建议不要重复。</span></li><li><span>录 像 机:该摄像机对应所属的录像机,随便选择一个就行。</span></li><li><span>设备厂家:摄像机的厂家类型,通过onvif搜索会自动有厂家信息,没有的就选择其他。</span></li><li><span>主码流地址:摄像机的主码流地址。</span></li><li><span>子码流地址:摄像机的子码流地址。</span></li><li><span>经 纬 度:摄像机的经纬度信息,用来地图上显示位置,中间用 | 隔开。</span></li><li><span>背景地图:摄像机对应的平面地图,下拉选择。</span></li><li><span>用户姓名:摄像机登录的用户名称。</span></li><li><span>用户密码:摄像机登录的用户密码。</span></li><li><span>启用状态:摄像机是否启用。</span></li><li><span>安装位置:摄像机的安装位置。</span></li></ol><h4 id='631-摄像机添加'><span>6.3.1 摄像机添加</span></h4><p><span>单击添加按钮,会自动规则生成默认的信息,直接表格中修改即可,修改好以后单击保存按钮保存所有的信息。</span></p><h4 id='632-摄像机删除'><span>6.3.2 摄像机删除</span></h4><p><span>如果要删除某个摄像机信息,需要先选中该行,然后单击删除按钮,删除后会自动保存。</span></p><h4 id='633-摄像机清空'><span>6.3.3 摄像机清空</span></h4><p><span>单击清空按钮会对整个表进行清空操作,清空后数据不能恢复,慎用。</span></p><h4 id='634-摄像机信息导入'><span>6.3.4 摄像机信息导入</span></h4><p><span>单击导入按钮,可以选择之前导出的csv格式的文件导入数据。</span></p><h4 id='635-摄像机信息导出'><span>6.3.5 摄像机信息导出</span></h4><p><span>单击导出按钮,将表格数据导出到csv格式的文件,用户可以打开文件编辑,然后再次导入,这样可以作为简易的备份机制使用,也可将繁琐的基础数据录入交给小姑娘去做。</span></p><h4 id='636-摄像机信息打印'><span>6.3.6 摄像机信息打印</span></h4><p><span> </span><img src="snap/6-3-6.jpg" referrerpolicy="no-referrer"></p><p><span>单击打印按钮可以将表格中的内容打印出来,打印前会弹出打印预览界面,可以自行做边距的调整等,可以查看等待打印的内容,翻页切换。</span></p><h4 id='637-导出到excel'><span>6.3.7 导出到Excel</span></h4><p><span> </span><img src="snap/6-3-7.jpg" referrerpolicy="no-referrer"></p><p><span>单击导出按钮可以将表格中的内容导出到excel表格,独创的excel导出数据算法,极速导出,支持任意系统,无依赖。</span></p><h4 id='638-设备搜索'><span>6.3.8 设备搜索</span></h4><p><span> </span><img src="snap/6-3-8.jpg" referrerpolicy="no-referrer"></p><p><span>如果摄像机已经添加过,则搜索出来的摄像机对应行禁用不可选中。</span></p><p><strong><span>基本步骤</span></strong></p><ul><li><span>第一步:单击广播搜索按钮,搜索到的设备会显示在左侧表格中。</span></li><li><span>第二步:输入onvif用户名和密码,注意是onvif的用户信息,一个摄像机可能有多种用户,比如登录用户,远程用户,onvif用户,务必记得要用onvif用户信息,可参阅说明书的末尾海康大华的onvif设置。</span></li><li><span>第三步:单击获取所有,会自动以填写的onvif用户信息,去拉取具体摄像机的码流地址、云台地址等信息,可以拉动底部的横向滚动条查看具体是否获取到信息。</span></li><li><span>第四步:单击添加选中按钮将所有勾选了复选框的设备添加到摄像机信息表中。</span></li></ul><p><strong><span>特别说明</span></strong></p><ol start='' ><li><span>如果没有码流地址,是添加不了的,必须有码流地址才能添加。</span></li><li><span>一般一个项目上的摄像机都是同一个品牌的,onvif用户信息也都一样,所以单击获取所有可以把所有摄像机的信息获取到。</span></li><li><span>可以填入不同的onvif用户信息,单击获取当前按钮来指定摄像机获取onvif信息。</span></li><li><span>如果有些设备不支持广播,只支持单播(比如不是同一网段的设备,但是路由器设置过,是通的),则指定设备右侧填写好IP地址或者onvif地址,再单击单播搜索即可。</span></li><li><span>一台电脑可能多个网卡和IP网段,可以选择不同的网卡进行搜索。</span></li><li><span>录像机信息和摄像机信息的更改,是自动应用的,无需重启。</span></li><li><span>搜索后的设备信息自动添加到表格中,按照IP地址升序排序,支持跨网段排序,自动将IP地址转为quint32整型进行排序,而不是取IP地址末尾。</span></li></ol><p><strong><span>参数说明</span></strong></p><ol start='' ><li><span>用户姓名:onvif用户的名称,默认admin。</span></li><li><span>用户密码:onvif用户的密码,默认admin。</span></li><li><span>选择网卡:选择对应电脑的网卡IP,可能有多个网段,onvif只能同一个网段。</span></li><li><span>指定设备:对指定的IP地址或者onvif地址进行onvif搜索。</span></li><li><span>过滤设备:对返回的onvif地址进行过滤,一种厂家的类别的设备地址格式一样。</span></li><li><span>搜索间隔:默认onvif搜索指令有好几种,会重发几次,指定发送的间隔。</span></li><li><span>搜索策略:默认自动清空,每次都重新添加搜索到的设备,如果选择设备累加则多次搜索后只会将新增加的设备加到设备列表,这个非常有用,在很多设备现场建议用设备累加策略而不是自动清空,因为onvif协议是udp协议,在大量数据的情况下会导致丢包,需要多次搜索,取最终的设备集合。</span></li><li><span>广播搜索:广播搜索指定网卡的所有onvif设备。</span></li><li><span>单播搜索:对指定设备进行单个搜索。</span></li><li><span>获取所有:按照当前填入的用户姓名和密码,填充到onvif请求鉴权中对所有搜索的设备进行媒体地址的获取、云台控制地址的获取、视频流地址的获取等。</span></li><li><span>获取当前:很多时候并不是所有的设备onvif用户信息一样,对于不一样的,可以先选中设备所在行,然后输入不同的用户信息,单击获取当前即可,会对当前选中的设备重新获取onvif信息。</span></li><li><span>添加选中:搜索到的设备前面都有个复选框,单击添加选中以后会对所有打钩的设备批量添加到摄像机信息表中,会自动过滤已经添加过的设备以及没有视频流地址的设备。</span></li><li><span>添加当前:对应获取当前,一般来说单个添加用户信息不一样的设备,因为批量添加不了,他的信息需要单独获取。</span></li></ol><h3 id='64-轮询配置'><span>6.4 轮询配置</span></h3><p><span> </span><img src="snap/6-4-1.jpg" referrerpolicy="no-referrer"></p><p><span>轮询点管理界面,上侧是轮询点信息表,可以直接添加、删除、修改、清空轮询点信息,下侧是摄像机信息表,会自动加载,当摄像机信息变动后,这里会自动加载最新的数据。右下角是批量生成轮询点和轮询分组管理。</span></p><h4 id='641-轮询点添加'><span>6.4.1 轮询点添加</span></h4><p><span>轮询点的添加有三种方式:手动添加、单个添加、批量添加。允许重复添加,没有过滤机制。</span></p><p><strong><span>添加方式</span></strong></p><ol start='' ><li><span>手动添加:单击添加按钮,在右侧轮询信息表格中自动生成默认轮询点信息,手动输入和修改信息然后单击保存按钮即可。</span></li><li><span>单个添加:左侧摄像机信息表中选中一行,单击添加当前按钮,会将选中的摄像机信息添加到右侧轮询点信息中,自动保存。</span></li><li><span>批量添加:单击添加所有按钮,会将所有摄像机信息添加到右侧轮询点信息中,自动保存。</span></li></ol><h4 id='642-轮询点删除'><span>6.4.2 轮询点删除</span></h4><p><span>如果要删除某个轮询点信息,需要先选中该行,然后单击删除按钮,删除后会自动保存。</span></p><h4 id='643-轮询点清空'><span>6.4.3 轮询点清空</span></h4><p><span>单击清空按钮会对整个表进行清空操作,清空后数据不能恢复,慎用。</span></p><h4 id='644-轮询点信息导入'><span>6.4.4 轮询点信息导入</span></h4><p><span>单击导入按钮,可以选择之前导出的csv格式的文件导入数据。</span></p><h4 id='645-轮询点信息导出'><span>6.4.5 轮询点信息导出</span></h4><p><span>单击导出按钮,将表格数据导出到csv格式的文件,用户可以打开文件编辑,然后再次导入,这样可以作为简易的备份机制使用,也可将繁琐的基础数据录入交给小姑娘去做。</span></p><h4 id='645-轮询点信息打印'><span>6.4.5 轮询点信息打印</span></h4><p><span>单击打印按钮可以将表格中的内容打印出来,打印前会弹出打印预览界面,可以自行做边距的调整等,可以查看等待打印的内容,翻页切换。</span></p><h4 id='647-导出到excel'><span>6.4.7 导出到Excel</span></h4><p><span>单击导出按钮可以将表格中的内容导出到excel表格,独创的excel导出数据算法,极速导出,支持任意系统,无依赖。</span></p><h4 id='648-参数设置'><span>6.4.8 参数设置</span></h4><p><span> </span><img src="snap/6-4-8.jpg" referrerpolicy="no-referrer"></p><p><strong><span>参数说明</span></strong></p><ol start='' ><li><span>自动轮询:开启以后,启动软件后自动轮询。</span></li><li><span>轮询间隔:画面切换的间隔,单位秒,建议时间长一点。</span></li><li><span>轮询画面:轮询的画面数,可选1画面、4画面、9画面、16画面。</span></li><li><span>码流类型:默认子码流,超过4画面建议子码流。</span></li></ol><h4 id='649-批量生成'><span>6.4.9 批量生成</span></h4><p><span> </span><img src="snap/6-4-9.jpg" referrerpolicy="no-referrer"></p><p><span>轮询表信息可以通过已添加的摄像机信息表选中添加,也可以自定义规则批量生成视频流地址添加,这种应用场景非常多,比如现场是某一种品牌的摄像机,视频流格式固定,只需要设置好主码流子码流的视频流格式,便可批量生成。</span></p><p><strong><span>参数说明</span></strong></p><ol start='' ><li><span>生成数量: 需要批量生成多少个。</span></li><li><span>起始地址:如果选择的是文件,则填写对应的数字,其他则填写IP地址。</span></li><li><span>地址格式:可选各种厂家类型,还可选择文件,这个用于测试软件非常有用。</span></li></ol><h4 id='6410-分组设置'><span>6.4.10 分组设置</span></h4><p><span> </span><img src="snap/6-4-10.jpg" referrerpolicy="no-referrer"></p><p><span>可添加、删除、修改、清空轮询分组名称,相当于轮询预案。</span></p><h3 id='65-用户管理'><span>6.5 用户管理</span></h3><p><span> </span><img src="snap/6-5-1.jpg" referrerpolicy="no-referrer"></p><p><span>用户管理是后面增加的一个模块,用于设置不同的用户不同的类型+权限,可以细分到每个模块的权限,勾选表示具有该权限,内置了7种权限选择,后期还可以在此基础上增加其他权限等。</span></p><h4 id='651-用户添加'><span>6.5.1 用户添加</span></h4><p><span>单击添加按钮,会自动规则生成默认的信息,直接表格中修改即可,修改好以后单击保存按钮保存所有的信息。</span></p><h4 id='652-用户删除'><span>6.5.2 用户删除</span></h4><p><span>如果要删除某个用户信息,需要先选中该行,然后单击删除按钮,删除后会自动保存。不允许删除内置的admin用户。</span></p><h4 id='653-用户清空'><span>6.5.3 用户清空</span></h4><p><span>单击清空按钮会对整个表进行清空操作,清空后数据不能恢复,慎用。</span></p><h4 id='654-用户信息导入'><span>6.5.4 用户信息导入</span></h4><p><span>单击导入按钮,可以选择之前导出的csv格式的文件导入数据。</span></p><h4 id='655-用户信息导出'><span>6.5.5 用户信息导出</span></h4><p><span>单击导出按钮,将表格数据导出到csv格式的文件,用户可以打开文件编辑,然后再次导入,这样可以作为简易的备份机制使用,也可将繁琐的基础数据录入交给小姑娘去做。</span></p><h4 id='656-用户信息打印'><span>6.5.6 用户信息打印</span></h4><p><span> </span><img src="snap/6-5-6.jpg" referrerpolicy="no-referrer">
|
||
<span>单击打印按钮可以将表格中的内容打印出来,打印前会弹出打印预览界面,可以自行做边距的调整等,可以查看等待打印的内容,翻页切换。</span></p><h4 id='657-导出到excel'><span>6.5.7 导出到Excel</span></h4><p><span> </span><img src="snap/6-5-7.jpg" referrerpolicy="no-referrer">
|
||
<span>单击导出按钮可以将表格中的内容导出到excel表格,独创的excel导出数据算法,极速导出,支持任意系统,无依赖。</span></p><h4 id='658-权限验证'><span>6.5.8 权限验证</span></h4><p><span> </span><img src="snap/6-5-8-1.jpg" referrerpolicy="no-referrer">
|
||
<span> </span><img src="snap/6-5-8-2.jpg" referrerpolicy="no-referrer"></p><p><span>假设设置了用户没有退出系统和电子地图的权限,则关闭系统的时候会弹出错误信息提示当前用户没有权限。</span></p><h3 id='66-其他设置'><span>6.6 其他设置</span></h3><p><span> </span><img src="snap/6-6-0.jpg" referrerpolicy="no-referrer"></p><p><span>其他设置里面的内容之前在基本设置中,现在重新开一个窗体,因为后面可能还有各种各样的设置,预留空间。</span></p><h4 id='661-串口配置'><span>6.6.1 串口配置</span></h4><p><span> </span><img src="snap/6-6-1.jpg" referrerpolicy="no-referrer"></p><p><span>系统中可能用到了多个串口通信,可以在这里选择对应的串口号和波特率。</span></p><h4 id='662-网络配置'><span>6.6.2 网络配置</span></h4><p><span> </span><img src="snap/6-6-2.jpg" referrerpolicy="no-referrer"></p><p><span>系统中可能用到多种网络通信,比如软件主动连接服务器,需要填写TCP地址和端口,也可能软件作为服务端,填写TCP或者UDP监听端口。</span></p><h2 id='7-简易使用步骤'><span>7 简易使用步骤</span></h2><h3 id='71-添加摄像机'><span>7.1 添加摄像机</span></h3><ol start='' ><li><span>切换到系统设置-》摄像机管理,单击添加,输入码流地址,单击保存。</span></li><li><span>在不知道主码流和子码流是啥的情况下,两个地方填一样的,其余默认即可。</span></li><li><span>本地文件格式:g:/mp4/1.mp4</span></li><li><span>USB摄像机:默认ffmpeg内核为 video=USB2.0 PC CAMERA(具体要看设备名) 如果是vlc内核则为 dshow://:dshow-vdev='Default'</span></li><li><span>摄像机视频流:直接填入rtsp、rtmp、http的视频流地址,该地址可以先用vlc播放器或者potplay等播放器先试试是否能正常播放,不能的话就别添加了,添加了也没卵用,别费力气了。</span></li></ol><h3 id='72-视频播放'><span>7.2 视频播放</span></h3><p><span>切换到视频监控主界面,左侧设备列表,双击摄像机,自动通道播放,双击录像机则整个录像机下面的摄像机全部加载。</span></p><h3 id='73-云台控制'><span>7.3 云台控制</span></h3><p><span>云台控制的前提是摄像机是通过onvif搜索的形式添加的,不然没有云台地址没法进行云台控制,当然也必须要求摄像机带云台,不带云台的摄像机是不能进行云台控制的。</span>
|
||
<span>先选中要进行云台控制的摄像机通道,边缘高亮,然后再单击右侧的云台控件,可以上下左右等移动,变倍和光圈没有用。</span></p><h3 id='74-自动校时'><span>7.4 自动校时</span></h3><p><span>在系统设置中开启自动校时后,设备自动上线后会自动将本地时间同步到设备。</span></p><h3 id='75-事件订阅'><span>7.5 事件订阅</span></h3><p><span>在系统设置中开启事件订阅后,一旦接收到设备的报警信息会显示到主界面左下角的信息栏,右下角弹出对应的报警信息。</span>
|
||
<span>摄像机要响应事件订阅,具体详细设置说明参见说明书其他说明中的摄像机报警输入设置。</span></p><h3 id='76-图片参数'><span>7.6 图片参数</span></h3><p><span> </span><img src="snap/7-6-1.jpg" referrerpolicy="no-referrer"></p><p><strong><span>操作说明</span></strong></p><ul><li><span>用onvif也可以对摄像机的明亮度、对比度、饱和度进行设置。</span></li><li><span>先选中对应的通道,然后右下角这里找到设置的区域。</span></li><li><span>单击获取参数,会自动将对应摄像机的明亮度、对比度、饱和度值读回来,显示在对应文本框和滑块中。</span></li><li><span>如果需要设置图片参数,先移动滑块到需要的值,然后单击设置参数按钮即可。</span></li><li><span>设置完以后会立即应用,传过来的视频流就能看到效果。</span></li><li><span>下面还有两个按钮可以手动重启设备以及校时。后期可能还会增加一些按钮。</span></li></ul><h2 id='8-内核模块说明'><span>8 内核模块说明</span></h2><p><span>本系统支持多种内核,方便不同的用户选择,适应不同的应用场景,默认提供的是ffmpeg内核和vlc内核,其他内核需要额外购买或者定制,支持定制内核。</span>
|
||
<span>每个内核实现的功能不一定完全一致,可仔细查看后面的每个内核的功能特点说明。</span></p><h3 id='81-模块-onvif'><span>8.1 模块-onvif</span></h3><h4 id='811-效果图'><span>8.1.1 效果图</span></h4><p><span> </span><img src="snap/8-1-1.jpg" referrerpolicy="no-referrer"></p><h4 id='812-功能介绍'><span>8.1.2 功能介绍</span></h4><ol start='' ><li><span>广播搜索设备,支持IPC和NVR,依次返回,可选择不同的网卡IP。</span></li><li><span>依次获取Onvif地址、Media地址、Profile文件、Rtsp地址。</span></li><li><span>可对指定的Profile获取视频流Rtsp地址,比如主码流子码流地址。</span></li><li><span>可对每个设备设置Onvif用户信息,用于认证获取详细信息。</span></li><li><span>可实时预览摄像机图像。</span></li><li><span>支持云台控制,可上下左右调节云台,支持绝对移动和相对移动,可放到和缩小图像远近。</span></li><li><span>支持Qt4和Qt5任意Qt版本,亲测Qt4.7.0到Qt5.12.4。</span></li><li><span>支持任意编译器,亲测mingw、msvc、gcc、clang。</span></li><li><span>支持任意操作系统,亲测xp、win7、win10、linux、嵌入式linux、树莓派全志H3等。</span></li><li><span>支持任意Onvif摄像机和NVR,亲测海康、大华、宇视、华为、海思芯片内核等,可定制开发。</span></li><li><span>支持对指定IP地址进行单播搜索,比如跨网段情况下非常有用。</span></li><li><span>纯Qt编写,超级小巧轻量,总共约2000行代码,不依赖任何第三方的库和组件,跨平台。</span></li><li><span>封装好了通用的数据发送和接收解析的函数,可以非常方便的自行拓展其他Onvif处理比如修改IP等。</span></li><li><span>工具上提供了收发数据文本框,显示收发的数据,方便查看和分析。</span></li><li><span>支持所有Onvif设备,代码工整,接口友好,直接引入pri即可使用。</span></li></ol><h4 id='813-云台说明'><span>8.1.3 云台说明</span></h4><ol start='' ><li><span>x、y、z 范围都在0-1之间。</span></li><li><span>x为负数,表示左转,x为正数,表示右转。</span></li><li><span>y为负数,表示下转,y为正数,表示上转。</span></li><li><span>z为正数,表示拉近,z为负数,表示拉远。</span></li><li><span>通过x和y的组合,来实现云台的控制。</span></li><li><span>通过z的组合,来实现焦距控制。</span></li></ol><h4 id='814-主要功能'><span>8.1.4 主要功能</span></h4><ol start='' ><li><span>搜索设备,获取设备的信息比如厂家、型号等。</span></li><li><span>获取设备的多个配置文件信息profile。</span></li><li><span>获取对应配置文件的视频流地址rtsp,以及分辨率等参数。</span></li><li><span>云台控制,上下左右移动,焦距放大缩小,相对和绝对移动。</span></li><li><span>获取预置位信息,触发预置位。</span></li><li><span>订阅事件,接收设备的各种消息尤其是报警事件比如IO口的报警。</span></li><li><span>抓图,获取设备当前的图片。</span></li><li><span>获取、创建、删除用户信息。</span></li><li><span>获取和设备网络配置信息比如IP地址等。</span></li><li><span>获取和设置NTP时间同步。</span></li><li><span>获取和设置设备时间。</span></li><li><span>重启设备。</span></li></ol><h4 id='815-处理流程'><span>8.1.5 处理流程</span></h4><ol start='' ><li><span>绑定组播IP(239.255.255.250)和端口(3702),发送固定的xml格式的数据搜索设备。</span></li><li><span>接收到的xml格式的数据解析,得到设备的Onvif地址。</span></li><li><span>对Onvif地址发送对应的数据,收到数据取出对应的节点数据。</span></li><li><span>请求Onvif地址获取Media地址和Ptz地址,Media地址用来获取详细的配置文件,Ptz地址用来云台控制。</span></li><li><span>ptz控制是对Ptz地址发送对应的数据即可。</span></li><li><span>设置了用户认证的需要组织用户token信息一块发送,每次都需要作鉴权处理。</span></li><li><span>接收到的数据不是标准的xml数据,没法按照正常的节点解析来处理,只能用QXmlQuery来做。</span></li><li><span>每个厂家设备返回的数据未必完全一致,基本上都不一致,需要进行模糊查找节点值。</span></li><li><span>特意采用底层协议解析,因为soap太臃肿函数名称太另类,特意做的轻量级的。</span></li><li><span>两个必备工具,Onvif Device Manager 和 Onvif Device Test Tool。</span></li></ol><h3 id='82-内核-ffmpeg'><span>8.2 内核-ffmpeg</span></h3><h4 id='821-效果图'><span>8.2.1 效果图</span></h4><p><span> </span><img src="snap/8-2-1.jpg" referrerpolicy="no-referrer"></p><h4 id='822-功能介绍'><span>8.2.2 功能介绍</span></h4><ol start='' ><li><span>多线程实时播放视频流+本地视频+USB摄像头等。</span></li><li><span>支持windows+linux+mac,支持ffmpeg3和ffmpeg4,支持32位和64位。</span></li><li><span>多线程显示图像,不卡主界面。</span></li><li><span>自动重连网络摄像头。</span></li><li><span>可设置边框大小即偏移量和边框颜色。</span></li><li><span>可设置是否绘制OSD标签即标签文本或图片和标签位置。</span></li><li><span>可设置两种OSD位置和风格。</span></li><li><span>可设置是否保存到文件以及文件名。</span></li><li><span>可直接拖曳文件到ffmpegwidget控件播放。</span></li><li><span>支持h265视频流+rtmp等常见视频流。</span></li><li><span>可暂停播放和继续播放。</span></li><li><span>支持存储单个视频文件和定时存储视频文件。</span></li><li><span>自定义顶部悬浮条,发送单击信号通知,可设置是否启用。</span></li><li><span>可设置画面拉伸填充或者等比例填充。</span></li><li><span>可设置解码是速度优先、质量优先、均衡处理。</span></li><li><span>可对视频进行截图(原始图片)和截屏。</span></li><li><span>录像文件存储支持裸流和MP4文件。</span></li><li><span>音视频完美同步,采用外部时钟同步策略。</span></li><li><span>支持seek定位播放位置。</span></li><li><span>支持在线网络音视频文件比如http开头mp4、mp3结尾的。</span></li><li><span>可选句柄模式(GPU绘制)、回调模式(QPainter绘制)。</span></li><li><span>GPU绘制模式同时支持拉伸和等比例绘制。</span></li><li><span>支持qsv、dxva2、d3d11va等硬解码。</span></li><li><span>硬解码和GPU组合,超低CPU占用,支持64路视频。</span></li><li><span>支持安卓和嵌入式linux,交叉编译即可。</span></li></ol><h3 id='83-内核-vlc'><span>8.3 内核-vlc</span></h3><h4 id='831-效果图'><span>8.3.1 效果图</span></h4><p><span> </span><img src="snap/8-3-1.jpg" referrerpolicy="no-referrer"></p><h4 id='832-功能介绍'><span>8.3.2 功能介绍</span></h4><ol start='' ><li><span>多线程实时播放视频流+本地视频+USB摄像头等。</span></li><li><span>支持windows+linux+mac,支持vlc2和vlc3,支持32位和64位。</span></li><li><span>多线程显示图像,不卡主界面。</span></li><li><span>自动重连网络摄像头。</span></li><li><span>可设置边框大小即偏移量和边框颜色。</span></li><li><span>可设置是否绘制OSD标签即标签文本或图片和标签位置。</span></li><li><span>可设置两种OSD位置和风格。</span></li><li><span>可设置是否保存到文件以及文件名。</span></li><li><span>可直接拖曳文件到vlcwidget控件播放。</span></li><li><span>支持h265视频流+rtmp等常见视频流。</span></li><li><span>可暂停播放和继续播放。</span></li><li><span>支持回调模式和句柄两种模式。</span></li><li><span>支持线程读取进度等信息和事件回调两种处理模式。</span></li><li><span>自动将当前播放位置和音量大小是否静音以信号发出去。</span></li><li><span>提供接口设置播放位置和音量及设置静音。</span></li><li><span>支持存储单个视频文件和定时存储视频文件。</span></li><li><span>自定义顶部悬浮条,发送单击信号通知,可设置是否启用。</span></li><li><span>支持auto、any、dxva2、d3d11va等硬解码。</span></li></ol><h3 id='84-内核-mpv'><span>8.4 内核-mpv</span></h3><p><span>不自带,需要额外购买此模块。</span></p><h4 id='841-效果图'><span>8.4.1 效果图</span></h4><p><span> </span><img src="snap/8-4-1.jpg" referrerpolicy="no-referrer"></p><h4 id='842-功能介绍'><span>8.4.2 功能介绍</span></h4><ol start='' ><li><span>多线程实时播放视频流+本地视频等。</span></li><li><span>支持windows+linux+mac。</span></li><li><span>多线程显示图像,不卡主界面。</span></li><li><span>自动重连网络摄像头。</span></li><li><span>可设置是否保存到文件以及文件名。</span></li><li><span>可直接拖曳文件到mpvwidget控件播放。</span></li><li><span>支持h265视频流+rtmp等常见视频流。</span></li><li><span>可暂停播放和继续播放。</span></li><li><span>支持存储单个视频文件和定时存储视频文件。</span></li><li><span>自定义顶部悬浮条,发送单击信号通知,可设置是否启用。</span></li><li><span>可设置画面拉伸填充或者等比例填充。</span></li><li><span>可对视频进行截图(原始图片)和截屏。</span></li><li><span>录像文件存储MP4文件。</span></li><li><span>支持qsv、dxva2、d3d11va等硬解码。</span></li></ol><h3 id='85-内核-海康sdk'><span>8.5 内核-海康sdk</span></h3><p><span>不自带,需要额外购买此模块。</span></p><h4 id='851-效果图'><span>8.5.1 效果图</span></h4><p><span> </span><img src="snap/8-5-1.jpg" referrerpolicy="no-referrer"></p><h4 id='852-功能介绍'><span>8.5.2 功能介绍</span></h4><ol start='' ><li><span>支持播放视频流和本地MP4文件。</span></li><li><span>支持句柄和回调两种模式。</span></li><li><span>多线程显示图像,不卡主界面。</span></li><li><span>自动重连网络摄像头。</span></li><li><span>可设置边框大小即偏移量和边框颜色。</span></li><li><span>可设置是否绘制OSD标签即标签文本或图片和标签位置。</span></li><li><span>可设置两种OSD位置和风格。</span></li><li><span>可设置是否保存到文件以及文件名。</span></li><li><span>可直接拖曳文件到haikangwidget控件播放。</span></li><li><span>支持h264/h265视频流。</span></li><li><span>可暂停播放和继续播放。</span></li><li><span>支持存储单个视频文件和定时存储视频文件。</span></li><li><span>自定义顶部悬浮条,发送单击信号通知,可设置是否启用。</span></li><li><span>可设置画面拉伸填充或者等比例填充。</span></li><li><span>可设置解码是速度优先、质量优先、均衡处理。</span></li><li><span>可对视频进行截图(原始图片)和截屏(视频窗体)。</span></li><li><span>录像文件存储为MP4文件。</span></li><li><span>支持焦距控制、云台控制。</span></li><li><span>可定制功能。</span></li></ol><p><span>下面没有列出功能介绍的是暂时没有实现的内核</span></p><h3 id='86-内核-萤石sdk'><span>8.6 内核-萤石sdk</span></h3><h3 id='87-内核-大华sdk'><span>8.7 内核-大华sdk</span></h3><h3 id='88-内核-宇视sdk'><span>8.8 内核-宇视sdk</span></h3><h3 id='89-内核-easyplayer'><span>8.9 内核-easyplayer</span></h3><h3 id='810-内核-大牛直播'><span>8.10 内核-大牛直播</span></h3><h3 id='811-内核-qtav'><span>8.11 内核-qtav</span></h3><h2 id='9-主界面模块说明'><span>9 主界面模块说明</span></h2><p><span>本系统主界面采用QMainWindow停靠窗体模式设计,这样可以自定义各种各样的子模块停靠悬浮等,不同的工作模式可以对应不同的模块,甚至可以拓展成不同的用户权限对应不同的主界面模块。所有子模块都是new出来的,支持任意多个。</span></p><h3 id='90-主界面'><span>9.0 主界面</span></h3><p><span>视频监控系统支持多种工作模式,不同的工作模式可以有不同的主界面、悬停模块、布局方案。互相不影响。悬停模块可以有透明度,更具科幻感。</span></p><h4 id='901-视频监控-普通模式'><span>9.0.1 视频监控-普通模式</span></h4><p><span> </span><img src="snap/9-0-1.jpg" referrerpolicy="no-referrer"></p><h4 id='902-视频监控-全屏模式'><span>9.0.2 视频监控-全屏模式</span></h4><p><span> </span><img src="snap/9-0-2.jpg" referrerpolicy="no-referrer"></p><h4 id='903-机器人监控-普通模式'><span>9.0.3 机器人监控-普通模式</span></h4><p><span> </span><img src="snap/9-0-3.jpg" referrerpolicy="no-referrer"></p><h4 id='904-机器人监控-全屏模式'><span>9.0.4 机器人监控-全屏模式</span></h4><p><span> </span><img src="snap/9-0-4.jpg" referrerpolicy="no-referrer"></p><h4 id='905-无人机监控-普通模式'><span>9.0.5 无人机监控-普通模式</span></h4><p><span> </span><img src="snap/9-0-5.jpg" referrerpolicy="no-referrer"></p><h4 id='906-无人机监控-全屏模式'><span>9.0.6 无人机监控-全屏模式</span></h4><p><span> </span><img src="snap/9-0-6.jpg" referrerpolicy="no-referrer"></p><h3 id='91-设备列表'><span>9.1 设备列表</span></h3><p><span> </span><img src="snap/9-1-1.jpg" referrerpolicy="no-referrer"></p><p><span>设备列表通过读取录像机信息(生成父节点,相当于区域,录像机信息本身在整个系统中目前就一个作为设备列表的区域信息功能,用户可以自行拓展作为其他用途。)、摄像机信息,自动生成设备列表,每个摄像机都对应一个主码流和子码流,支持各种视频流、本地视频文件、USB摄像机等。</span></p><h3 id='92-窗口信息'><span>9.2 窗口信息</span></h3><p><span> </span><img src="snap/9-2-1.jpg" referrerpolicy="no-referrer"></p><p><span>窗口信息负责显示一些打印信息,比如串口是否打开成功,摄像机是否异常,各种报警日志等,可以在系统设置中设置不同的文字颜色,窗口信息的信息条数自动计算应用,保证最大可能的适应高度。</span></p><h3 id='93-图文警情'><span>9.3 图文警情</span></h3><p><span> </span><img src="snap/9-3-1.jpg" referrerpolicy="no-referrer"></p><p><span>图文警情模块负责以图文的形式显示对应的警情或者提示信息,有时间、内容、图片,双击对应图片可以放大查看具体图片,为了方便演示如何使用,在此模块增加了右键菜单,可以添加消息、删除消息、清空消息。</span></p><h3 id='94-云台控制'><span>9.4 云台控制</span></h3><p><span> </span><img src="snap/9-4-1.jpg" referrerpolicy="no-referrer"></p><p><span>云台控制模块,可以对选中的通道的摄像机(ONVIF协议),进行云台控制,可以控制球机的上下左右等各个方位的移动,还可以调节变倍步长,至于变焦和光圈,目前onvif协议中没看到对应的协议支持,没有实现。</span></p><p><span>云台移动总共有3种策略:绝对移动、相对移动、连续移动,本系统都支持三种策略,默认采用的连续移动,这也是大部分应用场景需要的,按下对应的方位进行移动,松开立即停止移动,非常人性化。</span></p><h3 id='95-设备控制'><span>9.5 设备控制</span></h3><p><span> </span><img src="snap/9-5-1.jpg" referrerpolicy="no-referrer"></p><p><span>设备控制模块,可以对选中的通道的摄像机(ONVIF协议),进行获取参数、设置参数、手动校时、重启设备、抓拍图片、模拟报警等操作,可以对摄像机的明亮度、对比度、饱和度进行设置。后期还可能不断增加新的功能。</span></p><h3 id='96-预置位置'><span>9.6 预置位置</span></h3><p><span> </span><img src="snap/9-6-1.jpg" referrerpolicy="no-referrer"></p><p><span>预置位功能,只对带有预置位的球机才起作用,有云台的球机未必有预置位,要仔细查看清楚,不清楚可以询问厂家或者查阅手册,在本模块中,可以获取预置位、添加预置位、调用预置位、删除预置位、调用起始位、设置起始位、开始巡航、停止巡航等。</span></p><p><span>获取预置位以后,会将获取到的预置位集合(一般有255个甚至更多)显示到列表中,前面是编号token,后面是预置位的别名name,别名可以是中文的,可以通过添加预置位的时候设置中文的名称。在每个预置位信息后面都有三个按钮:调用、添加、删除,直接单击即可执行相应的动作,拉伸子模块窗体对应名称列自动拉伸填充。</span></p><p><span>自动巡航目前采用的策略是通过勾选查询回来的预置位信息,勾选,然后定时器每隔一段时间调用一次对应的预置位来实现,每次正在执行哪个预置位会在列表中自动选中该预置位,后期如果有更好的处理方法会自动更新改进代码。</span></p><h3 id='97-巡航设置'><span>9.7 巡航设置</span></h3><p><span>目前放在预置位中,后期可能会有改动。</span></p><h3 id='98-悬浮地图'><span>9.8 悬浮地图</span></h3><p><span> </span><img src="snap/9-8-1.jpg" referrerpolicy="no-referrer"></p><p><span>悬浮地图子模块,使用的百度地图,支持在线和离线,用于显示对于设备的位置,支持鼠标直接拖动和缩放。具体和飞行轨迹模块类似。</span></p><h3 id='99-飞行轨迹'><span>9.9 飞行轨迹</span></h3><p><span> </span><img src="snap/9-9-1.jpg" referrerpolicy="no-referrer"></p><p><span>专为无人机打造的模块,也可以作为机器人移动模块,通过传入一个经纬度值,实时更新设备的位置和绘制轨迹,模块已经内置了接口进行处理,支持不同设备不同的轨迹颜色(这个功能好)。</span></p><h3 id='910-备用模块'><span>9.10 备用模块</span></h3><p><span>此模块留给用户自行填入内容。</span></p><h3 id='911-数据调试'><span>9.11 数据调试</span></h3><p><span> </span><img src="snap/9-11-1.jpg" referrerpolicy="no-referrer"></p><p><span>数据调试模块,用于显示通信串口的数据,自定义不同颜色显示,可以勾选过滤某个串口进行数据查看,也可以选择所有数据,还可以勾选暂停显示复选框用来暂停打印显示信息。</span></p><h3 id='912-运动仿真'><span>9.12 运动仿真</span></h3><p><span>此模块留给用户自行填入内容。</span></p><h3 id='913-图像增强'><span>9.13 图像增强</span></h3><p><span>此模块留给用户自行填入内容。</span></p><h3 id='914-网页浏览'><span>9.14 网页浏览</span></h3><p><span> </span><img src="snap/9-14-1.jpg" referrerpolicy="no-referrer"></p><p><span>网页浏览模块,用于传入一个网页地址,打开对应的网页进行浏览,可用于网页展示信息,支持多个,可以自行增加,代码中演示了一个。</span></p><h2 id='10-各系统运行图'><span>10 各系统运行图</span></h2><h3 id='100-样式风格'><span>10.0 样式风格</span></h3><p><span> </span><img src="snap/10-0-1.jpg" referrerpolicy="no-referrer">
|
||
<span> </span><img src="snap/10-0-3.jpg" referrerpolicy="no-referrer">
|
||
<span> </span><img src="snap/10-0-5.jpg" referrerpolicy="no-referrer">
|
||
<span> </span><img src="snap/10-0-11.jpg" referrerpolicy="no-referrer">
|
||
<span> </span><img src="snap/10-0-15.jpg" referrerpolicy="no-referrer">
|
||
<span> </span><img src="snap/10-0-17.jpg" referrerpolicy="no-referrer"></p><p><span>本系统内置高达18套皮肤样式供用户选择,可以在系统设置中随意切换立即应用。</span></p><pre class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" spellcheck="false" lang="cpp" style="break-inside: unset;"><div class="CodeMirror cm-s-inner cm-s-null-scroll CodeMirror-wrap" lang="cpp"><div style="overflow: hidden; position: relative; width: 3px; height: 0px; top: 9.51471px; left: 42.9832px;"><textarea autocorrect="off" autocapitalize="off" spellcheck="false" tabindex="0" style="position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;"></textarea></div><div class="CodeMirror-scrollbar-filler" cm-not-content="true"></div><div class="CodeMirror-gutter-filler" cm-not-content="true"></div><div class="CodeMirror-scroll" tabindex="-1"><div class="CodeMirror-sizer" style="margin-left: 35px; margin-bottom: 0px; border-right-width: 0px; padding-right: 0px; padding-bottom: 0px;"><div style="position: relative; top: 0px;"><div class="CodeMirror-lines" role="presentation"><div role="presentation" style="position: relative; outline: none;"><div class="CodeMirror-measure"><pre><span>xxxxxxxxxx</span></pre><div class="CodeMirror-linenumber CodeMirror-gutter-elt"><div>26</div></div></div><div class="CodeMirror-measure"></div><div style="position: relative; z-index: 1;"></div><div class="CodeMirror-code" role="presentation" style=""><div class="CodeMirror-activeline" style="position: relative;"><div class="CodeMirror-activeline-background CodeMirror-linebackground"></div><div class="CodeMirror-gutter-background CodeMirror-activeline-gutter" style="left: -34.9916px; width: 35px;"></div><div class="CodeMirror-gutter-wrapper CodeMirror-activeline-gutter" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt CodeMirror-linenumber-show" style="left: 0px; width: 27px;">1</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-variable-3">void</span> <span class="cm-def">QUIStyle::getStyle</span>(<span class="cm-variable">QStringList</span> <span class="cm-operator">&</span><span class="cm-variable">styleNames</span>, <span class="cm-variable">QStringList</span> <span class="cm-operator">&</span><span class="cm-variable">styleFiles</span>)</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">2</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;">{</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">3</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-keyword">static</span> <span class="cm-variable">QStringList</span> <span class="cm-variable">names</span>;</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">4</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-keyword">if</span> (<span class="cm-variable">names</span>.<span class="cm-variable">count</span>() <span class="cm-operator">==</span> <span class="cm-number">0</span>) {</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">5</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">names</span> <span class="cm-operator"><<</span> <span class="cm-string">"黑蓝色"</span> <span class="cm-operator"><<</span> <span class="cm-string">"软件黑"</span> <span class="cm-operator"><<</span> <span class="cm-string">"视频黑"</span>;</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">6</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">names</span> <span class="cm-operator"><<</span> <span class="cm-string">"深黑色"</span> <span class="cm-operator"><<</span> <span class="cm-string">"深蓝色"</span> <span class="cm-operator"><<</span> <span class="cm-string">"深灰色"</span>;</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">7</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">names</span> <span class="cm-operator"><<</span> <span class="cm-string">"扁平黑"</span> <span class="cm-operator"><<</span> <span class="cm-string">"扁平蓝"</span> <span class="cm-operator"><<</span> <span class="cm-string">"扁平灰"</span>;</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">8</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">names</span> <span class="cm-operator"><<</span> <span class="cm-string">"浅黑色"</span> <span class="cm-operator"><<</span> <span class="cm-string">"浅蓝色"</span> <span class="cm-operator"><<</span> <span class="cm-string">"浅灰色"</span>;</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">9</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">names</span> <span class="cm-operator"><<</span> <span class="cm-string">"普通黑"</span> <span class="cm-operator"><<</span> <span class="cm-string">"普通蓝"</span> <span class="cm-operator"><<</span> <span class="cm-string">"普通灰"</span>;</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt CodeMirror-linenumber-show" style="left: 0px; width: 27px;">10</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">names</span> <span class="cm-operator"><<</span> <span class="cm-string">"大蓝色"</span> <span class="cm-operator"><<</span> <span class="cm-string">"大紫色"</span> <span class="cm-operator"><<</span> <span class="cm-string">"大银色"</span>;</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">11</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> }</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">12</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
|
||
</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">13</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-comment">//中文皮肤名称对应样式表文件</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">14</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-keyword">static</span> <span class="cm-variable">QStringList</span> <span class="cm-variable">files</span>;</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">15</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-keyword">if</span> (<span class="cm-variable">files</span>.<span class="cm-variable">count</span>() <span class="cm-operator">==</span> <span class="cm-number">0</span>) {</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">16</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">files</span> <span class="cm-operator"><<</span> <span class="cm-string">":/qss/blackblue.css"</span> <span class="cm-operator"><<</span> <span class="cm-string">":/qss/blacksoft.css"</span> <span class="cm-operator"><<</span> <span class="cm-string">":/qss/blackvideo.css"</span>;</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">17</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">files</span> <span class="cm-operator"><<</span> <span class="cm-string">":/qss/darkblack.css"</span> <span class="cm-operator"><<</span> <span class="cm-string">":/qss/darkblue.css"</span> <span class="cm-operator"><<</span> <span class="cm-string">":/qss/darkgray.css"</span>;</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">18</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">files</span> <span class="cm-operator"><<</span> <span class="cm-string">":/qss/flatblack.css"</span> <span class="cm-operator"><<</span> <span class="cm-string">":/qss/flatblue.css"</span> <span class="cm-operator"><<</span> <span class="cm-string">":/qss/flatgray.css"</span>;</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">19</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">files</span> <span class="cm-operator"><<</span> <span class="cm-string">":/qss/lightblack.css"</span> <span class="cm-operator"><<</span> <span class="cm-string">":/qss/lightblue.css"</span> <span class="cm-operator"><<</span> <span class="cm-string">":/qss/lightgray.css"</span>;</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt CodeMirror-linenumber-show" style="left: 0px; width: 27px;">20</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">files</span> <span class="cm-operator"><<</span> <span class="cm-string">":/qss/normalblack.css"</span> <span class="cm-operator"><<</span> <span class="cm-string">":/qss/normalblue.css"</span> <span class="cm-operator"><<</span> <span class="cm-string">":/qss/normalgray.css"</span>;</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">21</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">files</span> <span class="cm-operator"><<</span> <span class="cm-string">":/qss/otherblue.css"</span> <span class="cm-operator"><<</span> <span class="cm-string">":/qss/otherpurple.css"</span> <span class="cm-operator"><<</span> <span class="cm-string">":/qss/othersilvery.css"</span>;</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">22</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> }</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">23</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
|
||
</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">24</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">styleNames</span> <span class="cm-operator">=</span> <span class="cm-variable">names</span>;</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">25</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">styleFiles</span> <span class="cm-operator">=</span> <span class="cm-variable">files</span>;</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -34.9916px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt CodeMirror-linenumber-show" style="left: 0px; width: 27px;">26</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;">}</span></pre></div></div></div></div></div></div><div style="position: absolute; height: 0px; width: 1px; border-bottom: 0px solid transparent; top: 599px;"></div><div class="CodeMirror-gutters" style="height: 599px;"><div class="CodeMirror-gutter CodeMirror-linenumbers" style="width: 34px;"></div></div></div></div></pre><h3 id='101-windows-mingw'><span>10.1 windows-mingw</span></h3><p><span> </span><img src="snap/10-1-1.jpg" referrerpolicy="no-referrer"></p><h3 id='102-windows-msvc'><span>10.2 windows-msvc</span></h3><p><span> </span><img src="snap/10-2-1.jpg" referrerpolicy="no-referrer"></p><h3 id='103-linux-ubuntu'><span>10.3 linux-ubuntu</span></h3><p><span> </span><img src="snap/10-3-1.jpg" referrerpolicy="no-referrer"></p><h3 id='104-linux-fedora'><span>10.4 linux-fedora</span></h3><p><span> </span><img src="snap/10-4-1.jpg" referrerpolicy="no-referrer"></p><h3 id='105-linux-centos'><span>10.5 linux-centos</span></h3><p><span> </span><img src="snap/10-5-1.jpg" referrerpolicy="no-referrer"></p><h3 id='106-linux-uos'><span>10.6 linux-uos</span></h3><p><span> </span><img src="snap/10-6-1.jpg" referrerpolicy="no-referrer"></p><h3 id='107-linux-kylin'><span>10.7 linux-kylin</span></h3><p><span> </span><img src="snap/10-7-1.jpg" referrerpolicy="no-referrer"></p><h3 id='108-linux-neokylin'><span>10.8 linux-neokylin</span></h3><p><span> </span><img src="snap/10-8-1.jpg" referrerpolicy="no-referrer"></p><h3 id='109-linux-newstart'><span>10.9 linux-newstart</span></h3><p><span> </span><img src="snap/10-9-1.jpg" referrerpolicy="no-referrer"></p><h3 id='1010-unix-mac'><span>10.10 unix-mac</span></h3><p><span> </span><img src="snap/10-10-1.jpg" referrerpolicy="no-referrer"></p><h2 id='11-程序框架说明'><span>11 程序框架说明</span></h2><p><span>备注:下面的截图和说明未必是最新的,但是大部分是一致的,整体的框架不会改变,可能会有新增加子模块和代码,或者部分类文件有调整或者删除,具体以最新的代码为准。</span></p><h3 id='111-整体代码结构'><span>11.1 整体代码结构</span></h3><p><span> </span><img src="snap/11-1-1.jpg" referrerpolicy="no-referrer"></p><p><span>本系统采用模块化的设备,有用到第三方开源类库比如串口通信qextserialport,全部放在3rd下面,有用到很多自己封装完善的通用类库比如ffmpeg视频监控,全部放在core下面,设备通信和辅助处理全部放在class下面,所有界面全部放在ui下面,相当于一个个小的组件合起来,最终形成了整个监控系统的完整代码。</span></p><h3 id='112-主模块说明'><span>11.2 主模块说明</span></h3><figure><table><thead><tr><th style='text-align:left;' ><span>名称</span></th><th style='text-align:left;' ><span>说明</span></th></tr></thead><tbody><tr><td style='text-align:left;' ><span>3rd</span></td><td style='text-align:left;' ><span>一些第三方开源的类库,比如串口通信qextserialport。</span></td></tr><tr><td style='text-align:left;' ><span>class</span></td><td style='text-align:left;' ><span>存放系统初始化、样式控制、自定义控件、设备通信等。</span></td></tr><tr><td style='text-align:left;' ><span>core</span></td><td style='text-align:left;' ><span>本人一直持续更新完善的通用的类库,比如ffmpeg视频监控。</span></td></tr><tr><td style='text-align:left;' ><span>ui</span></td><td style='text-align:left;' ><span>所有的界面都分门别类放在这里。</span></td></tr></tbody></table></figure><h3 id='113-子模块说明'><span>11.3 子模块说明</span></h3><h4 id='1131-第三方类库'><span>11.3.1 第三方类库</span></h4><p><span> </span><img src="snap/11-3-1.jpg" referrerpolicy="no-referrer"></p><p><span>这里放的全部是第三方开源的轮子,感谢开源、感谢github、gitee等开源社区。</span></p><figure><table><thead><tr><th style='text-align:left;' ><span>名称</span></th><th style='text-align:left;' ><span>说明</span></th></tr></thead><tbody><tr><td style='text-align:left;' ><span>3rd_qextserialport</span></td><td style='text-align:left;' ><span>第三方串口通信qextserialport,这个类比较稳定可靠,经过了几十个项目持续数十年运行的考验,不用Qt自带的串口类。</span></td></tr></tbody></table></figure><p><span>具体代码不做过多说明。</span></p><h4 id='1132-通信及辅助类'><span>11.3.2 通信及辅助类</span></h4><p><span> </span><img src="snap/11-3-2.jpg" referrerpolicy="no-referrer"></p><p><span>这里放的都是一些系统初始化、设备通信相关的类。</span></p><figure><table><thead><tr><th style='text-align:left;' ><span>名称</span></th><th style='text-align:left;' ><span>说明</span></th></tr></thead><tbody><tr><td style='text-align:left;' ><span>api</span></td><td style='text-align:left;' ><span>存放数据库表映射成对应的全局队列数据、通用的辅助函数类。</span></td></tr><tr><td style='text-align:left;' ><span>app</span></td><td style='text-align:left;' ><span>全局配置参数管理类、秘钥管理类、通用函数。</span></td></tr><tr><td style='text-align:left;' ><span>devicecustom</span></td><td style='text-align:left;' ><span>用户自定义设备通信管理,比如机器人通信、无人机通信等。</span></td></tr><tr><td style='text-align:left;' ><span>devicevideo</span></td><td style='text-align:left;' ><span>视频监控相关处理类,包括设备地图、表格消息、线程UI通信、人工智能处理等。</span></td></tr><tr><td style='text-align:left;' ><span>usercontrol</span></td><td style='text-align:left;' ><span>当前系统的自定义控件全部放在这里,其中包括云台仪表盘、天气面板等控件。</span></td></tr></tbody></table></figure><h5 id='11321-模块-api'><span>11.3.2.1 模块-api</span></h5><figure><table><thead><tr><th style='text-align:left;' ><span>名称</span></th><th style='text-align:left;' ><span>说明</span></th></tr></thead><tbody><tr><td style='text-align:left;' ><span>dbdata</span></td><td style='text-align:left;' ><span>将数据库表映射到全局变量数据队列,比如将摄像机表ipcinfo转成QStringList存放一行行数据,这样在程序中运算比较速度极快,直接内存比较,不用每次都去读取数据库。</span></td></tr><tr><td style='text-align:left;' ><span>dbquery</span></td><td style='text-align:left;' ><span>所有的数据库查询插入更新等操作都在这里,比如查询摄像机表、插入日志记录等。</span></td></tr></tbody></table></figure><h5 id='11322-模块-app'><span>11.3.2.2 模块-app</span></h5><figure><table><thead><tr><th style='text-align:left;' ><span>名称</span></th><th style='text-align:left;' ><span>说明</span></th></tr></thead><tbody><tr><td style='text-align:left;' ><span>appconfig</span></td><td style='text-align:left;' ><span>配置参数类,整个系统的配置参数存放在ini文件中,跨平台,所有参数都对应一个变量,读取配置参数的时候将值赋值给变量,写入的时候将变量值写入到配置文件。</span></td></tr><tr><td style='text-align:left;' ><span>appdata</span></td><td style='text-align:left;' ><span>全局变量类,系统中无可避免需要一些全局变量方便处理,都放在此类,比如版本号、录像机类型、摄像机类型、当前用户信息、地图宽度高度、左侧右侧顶部底部宽高等。</span></td></tr><tr><td style='text-align:left;' ><span>appevent</span></td><td style='text-align:left;' ><span>全局事件转发类,系统越复杂信号需要传递的层级越多,所以需要一个全局事件转发类,用来中转这些事件,这样永远只需要两层就可以收到信号进行处理,而且整个系统看起来干净整洁,不会说一个信号传递到了N个地方乱七八糟,建议需要跨层级传递的信号都放在这里中转。比如软件退出信号,可能多个界面需要收到退出信号进行保存和其他处理,如果从关闭界面发出信号传递给需要的界面,那不知道要中间层层传递多少次,有了这个全局事件转发类,你只需要将事件传给appevent,需要接收事件的地方关联这个信号就行,appevent为全局单例类,整个系统唯一。通用的一些信号有软件退出、全局样式改变、主窗体变化(0-最小化 1-最大化 2-恢复 3-关闭 4-移动 5-尺寸变化)等。</span></td></tr><tr><td style='text-align:left;' ><span>appinit</span></td><td style='text-align:left;' ><span>程序初始化类,在main函数中,会先执行这个初始化的类,比如初始化皮肤、字体、数据库、样式等操作,这些都是要优先在窗体加载前执行的,执行完毕以后再打开窗体主界面。</span></td></tr><tr><td style='text-align:left;' ><span>appstyle</span></td><td style='text-align:left;' ><span>全局样式管理类,整个系统的样式全部放在这里,一般加载流程是先读取样式表文件,然后将本系统独特的样式(比如开关按钮、视频监控、云台仪表盘)内容追加到后面,最后统一设置全局样式,在main函数中加载,和appinit类一样放在最前面执行。</span></td></tr><tr><td style='text-align:left;' ><span>appurl</span></td><td style='text-align:left;' ><span>视频监控系统中常用的默认的视频地址集合。</span></td></tr></tbody></table></figure><h5 id='11323-模块-devicecustom'><span>11.3.2.3 模块-devicecustom</span></h5><figure><table><thead><tr><th style='text-align:left;' ><span>名称</span></th><th style='text-align:left;' ><span>说明</span></th></tr></thead><tbody><tr><td style='text-align:left;' ><span>devicerobot</span></td><td style='text-align:left;' ><span>机器人串口通信管理类。</span></td></tr><tr><td style='text-align:left;' ><span>devicerobot2</span></td><td style='text-align:left;' ><span>机器人串口通信管理类2,有串口数据转发功能。</span></td></tr><tr><td style='text-align:left;' ><span>deviceuavsserver</span></td><td style='text-align:left;' ><span>无人机后端服务类,当前为空,用户自己添加。</span></td></tr><tr><td style='text-align:left;' ><span>deviceuavsvideo</span></td><td style='text-align:left;' ><span>无人机视频监控类,将视频控件设置过来,然后就可以将自己人工智能算法处理后的图片传过来进行绘制,类似于实时视频效果。</span></td></tr></tbody></table></figure><h5 id='11324-模块-devicevideo'><span>11.3.2.4 模块-devicevideo</span></h5><figure><table><thead><tr><th style='text-align:left;' ><span>名称</span></th><th style='text-align:left;' ><span>说明</span></th></tr></thead><tbody><tr><td style='text-align:left;' ><span>devicehelper</span></td><td style='text-align:left;' ><span>整个系统设备管理辅助类,比如插入窗口消息、加载设备列表、加载图片地图、加载设备按钮、初始化视频控件等。</span></td></tr><tr><td style='text-align:left;' ><span>devicemap</span></td><td style='text-align:left;' ><span>设备图片地图管理类,相当于一次性加载所有图片到内存,当要切换或者显示的时候,直接从内存取出来设置即可,速度极快,瞬间相应,纯粹是为了加快相应速度以及可能在图片上进行绘制增加的功能,比从文件系统读取图片文件显示快N倍。</span></td></tr><tr><td style='text-align:left;' ><span>deviceonvif</span></td><td style='text-align:left;' ><span>设备onvif通信管理类,比如获取当前选中通道的onvif地址、开启事件订阅、校对时间、重启设备、获取视频参数、设置视频参数、云台控制等,这里是具体的需要和摄像机信息表及视频通道关联的处理,所以不能放到通用的onvif模块中。</span></td></tr><tr><td style='text-align:left;' ><span>devicethreadui</span></td><td style='text-align:left;' ><span>演示线程通知UI更新,包括每隔一段时间插入消息、异步调用添加表格消息和图文警情、设备GPS移动、报警闪烁、指定通道编号设置视频和通道交换等。</span></td></tr><tr><td style='text-align:left;' ><span>devicevideosmart</span></td><td style='text-align:left;' ><span>人工智能处理类,最常见的应用就是设置一个视频控件,然后在视频控件上绘制人脸框、文字信息等,比如设备的实时运行状态。</span></td></tr></tbody></table></figure><h5 id='11325-模块-usercontrol'><span>11.3.2.5 模块-usercontrol</span></h5><figure><table><thead><tr><th style='text-align:left;' ><span>名称</span></th><th style='text-align:left;' ><span>说明</span></th></tr></thead><tbody><tr><td style='text-align:left;' ><span>gaugecloud</span></td><td style='text-align:left;' ><span>云台仪表盘控件。</span></td></tr><tr><td style='text-align:left;' ><span>cityhelper</span></td><td style='text-align:left;' ><span>省市县联动类,通过从json文件读取省市县信息。</span></td></tr><tr><td style='text-align:left;' ><span>weather</span></td><td style='text-align:left;' ><span>城市天气类,最后显示在标题栏上,实时显示设置的城市的最近几天的天气。</span></td></tr><tr><td style='text-align:left;' ><span>widgetsound</span></td><td style='text-align:left;' ><span>声音面板控件,主界面右下角单击弹出音量条。</span></td></tr></tbody></table></figure><h4 id='1133-核心通用类库'><span>11.3.3 核心通用类库</span></h4><p><span> </span><img src="snap/11-3-3.jpg" referrerpolicy="no-referrer"></p><p><span>这里放的全部是个人一直持续更新完善的独创的轮子,所有的项目都公用这些轮子,用到哪个就包含哪个进来,更新只需要更新轮子代码就行。</span></p><p><span>视频监控系统包含的轮子超级丰富给力,物超所值,涵盖了数据导出模块、数据库应用、视频监控、ONVIF通信、TCP文件传输、地图应用、通用浏览器内核等。</span></p><figure><table><thead><tr><th style='text-align:left;' ><span>名称</span></th><th style='text-align:left;' ><span>说明</span></th></tr></thead><tbody><tr><td style='text-align:left;' ><span>core_common</span></td><td style='text-align:left;' ><span>通用函数,包括通用秘钥、通用导航、通用样式、声音播放、日志记录、运行时间记录等。</span></td></tr><tr><td style='text-align:left;' ><span>core_control</span></td><td style='text-align:left;' ><span>通用自定义控件,很多系统经常用到的控件全部放在这里,比如开关按钮、设备容器、设备按钮、颜色下拉框等。</span></td></tr><tr><td style='text-align:left;' ><span>core_dataout</span></td><td style='text-align:left;' ><span>数据导入导出到xls/pdf和打印类库,极速、跨平台、无依赖。</span></td></tr><tr><td style='text-align:left;' ><span>core_db</span></td><td style='text-align:left;' ><span>数据库通用类库比如数据库线程管理、数据清理、数据采集等。</span></td></tr><tr><td style='text-align:left;' ><span>core_ffmpeg</span></td><td style='text-align:left;' ><span>视频监控内核ffmpeg版本,本系统默认采用的内核。</span></td></tr><tr><td style='text-align:left;' ><span>core_vlc</span></td><td style='text-align:left;' ><span>视频监控内核vlc版本,本系统自带该内核。</span></td></tr><tr><td style='text-align:left;' ><span>core_mpv</span></td><td style='text-align:left;' ><span>视频监控内核mpv版本,需要额外购买,不在视频监控系统中。</span></td></tr><tr><td style='text-align:left;' ><span>core_haikang</span></td><td style='text-align:left;' ><span>视频监控内核海康sdk版本,需要额外购买,不在视频监控系统中。</span></td></tr><tr><td style='text-align:left;' ><span>core_map</span></td><td style='text-align:left;' ><span>地图综合应用类库,百度地图(支持在线离线)和echart封装类等。</span></td></tr><tr><td style='text-align:left;' ><span>core_onvif</span></td><td style='text-align:left;' ><span>onvif功能封装类,包括设备搜索、云台控制、设备参数设置等。</span></td></tr><tr><td style='text-align:left;' ><span>core_opengl</span></td><td style='text-align:left;' ><span>opengl封装类,支持打开yuv/nv12文件,绘制yuv/nv12帧数据,一般搭配ffmpeg视频内核视频,直接走GPU绘制。</span></td></tr><tr><td style='text-align:left;' ><span>core_qui</span></td><td style='text-align:left;' ><span>通用的辅助类,包括自定义对话框,全局辅助函数,图形字体等。</span></td></tr><tr><td style='text-align:left;' ><span>core_tcpfile</span></td><td style='text-align:left;' ><span>文件多线程收发类,支持多个并发。</span></td></tr><tr><td style='text-align:left;' ><span>core_video</span></td><td style='text-align:left;' ><span>通用的视频监控管理类,封装了通用的视频控件和多通道统一管理。</span></td></tr><tr><td style='text-align:left;' ><span>core_webview</span></td><td style='text-align:left;' ><span>通用浏览器控件类,同时支持webkit、wenengine、miniblink三种内核,打通了所有的Qt版本。</span></td></tr></tbody></table></figure><h5 id='11331-模块-corecommon'><span>11.3.3.1 模块-core_common</span></h5><figure><table><thead><tr><th style='text-align:left;' ><span>名称</span></th><th style='text-align:left;' ><span>说明</span></th></tr></thead><tbody><tr><td style='text-align:left;' ><span>base64helper</span></td><td style='text-align:left;' ><span>图片及文字和base64编码之间转换的类。</span></td></tr><tr><td style='text-align:left;' ><span>commonkey</span></td><td style='text-align:left;' ><span>通用秘钥管理类,指定校验秘钥文件,可设置运行时间、设备数量等限制,支持根据硬件指纹特征生成机器码文件等。</span></td></tr><tr><td style='text-align:left;' ><span>commonnav</span></td><td style='text-align:left;' ><span>通用菜单导航管理类,用来控制和显示顶部导航栏、左侧导航栏的样式。很多子界面需要用到,所以封装成一个专门管理这个的类。</span></td></tr><tr><td style='text-align:left;' ><span>commonstyle</span></td><td style='text-align:left;' ><span>通用样式管理类,比如Qt自带类窗体样式、自定义控件样式、分页导航样式、导航按钮样式、开关按钮样式等。相当于将多个项目常用的自定义样式封装一起做成通用。</span></td></tr><tr><td style='text-align:left;' ><span>framelesswidget2</span></td><td style='text-align:left;' ><span>无边框窗体拉伸类,边框四周八个方位都可以自由拉伸,可设置是否允许拖动和拉伸。</span></td></tr><tr><td style='text-align:left;' ><span>playwav</span></td><td style='text-align:left;' ><span>声音文件播放类,通用Qt456,自动识别当前Qt版本使用对应的类,Qt4采用QSound,Qt5以上采用QSoundEffect,嵌入式采用对应的命令行aplay、mpv来播放。</span></td></tr><tr><td style='text-align:left;' ><span>savelog</span></td><td style='text-align:left;' ><span>日志钩子类,将系统中所有的打印信息转为日志存储或者输出到网络等,可以开启用来打印输出日志信息。</span></td></tr><tr><td style='text-align:left;' ><span>saveruntime</span></td><td style='text-align:left;' ><span>保存运行时间类,用来存储系统启动后每隔一段时间就输出一条记录用来记录启动后软件运行了多久,方便分析问题。</span></td></tr></tbody></table></figure><h5 id='11332-模块-corecontrol'><span>11.3.3.2 模块-core_control</span></h5><figure><table><thead><tr><th style='text-align:left;' ><span>名称</span></th><th style='text-align:left;' ><span>说明</span></th></tr></thead><tbody><tr><td style='text-align:left;' ><span>bottomwidget</span></td><td style='text-align:left;' ><span>通用底部状态栏控件,可以设置软件名称、版本号、运行时间等。</span></td></tr><tr><td style='text-align:left;' ><span>colorcombobox</span></td><td style='text-align:left;' ><span>颜色下拉框控件,在系统设置中有。</span></td></tr><tr><td style='text-align:left;' ><span>cpumemorylabel</span></td><td style='text-align:left;' ><span>CPU和内存使用情况标签控件,主界面右上角显示。</span></td></tr><tr><td style='text-align:left;' ><span>customtitlebar</span></td><td style='text-align:left;' ><span>停靠窗体自定义标题栏控件。</span></td></tr><tr><td style='text-align:left;' ><span>devicebutton</span></td><td style='text-align:left;' ><span>设备按钮控件,比如图片地图模块中用到,可设置不同的图标样式和状态等,双击发出信号进行相应处理比如弹出对应窗体等。</span></td></tr><tr><td style='text-align:left;' ><span>lcddatetime</span></td><td style='text-align:left;' ><span>软件右上角显示时间的控件。</span></td></tr><tr><td style='text-align:left;' ><span>panelwidget</span></td><td style='text-align:left;' ><span>面板容器控件,主界面子模块表格消息,就用到此控件,用于将一堆widget放到此容器进行管理,自动形成滚动条等。</span></td></tr><tr><td style='text-align:left;' ><span>switchbutton</span></td><td style='text-align:left;' ><span>开关按钮控件,在系统设置中存在大量该控件。</span></td></tr><tr><td style='text-align:left;' ><span>xslider</span></td><td style='text-align:left;' ><span>滑动条控件,在原有滑动条基础上增加了鼠标按下立即定位等。</span></td></tr></tbody></table></figure><h5 id='11333-模块-coredataout'><span>11.3.3.3 模块-core_dataout</span></h5><figure><table><thead><tr><th style='text-align:left;' ><span>名称</span></th><th style='text-align:left;' ><span>说明</span></th></tr></thead><tbody><tr><td style='text-align:left;' ><span>datacreat</span></td><td style='text-align:left;' ><span>通用数据报表内容创建类,比如生成表格格式的html内容,然后赋值给dataprint直接打印,里面举例了图文混排的报告内容,后期会不断增加其他模板,也可以自行增加其他模板数据。</span></td></tr><tr><td style='text-align:left;' ><span>datacsv</span></td><td style='text-align:left;' ><span>导入导出数据,csv格式,可设置分隔符。拓展名。过滤条件等。</span></td></tr><tr><td style='text-align:left;' ><span>datahead</span></td><td style='text-align:left;' ><span>当前组件通用头文件。</span></td></tr><tr><td style='text-align:left;' ><span>datahelper</span></td><td style='text-align:left;' ><span>辅助类,比如校验规则函数,通用数据导出+打印函数。</span></td></tr><tr><td style='text-align:left;' ><span>dataprint</span></td><td style='text-align:left;' ><span>数据打印到pdf及纸张,支持多线程。</span></td></tr><tr><td style='text-align:left;' ><span>dataxls</span></td><td style='text-align:left;' ><span>数据导出到xls类,支持多线程导出。</span></td></tr></tbody></table></figure><h5 id='11334-模块-coredb'><span>11.3.3.4 模块-core_db</span></h5><figure><table><thead><tr><th style='text-align:left;' ><span>名称</span></th><th style='text-align:left;' ><span>说明</span></th></tr></thead><tbody><tr><td style='text-align:left;' ><span>dbcleanthread</span></td><td style='text-align:left;' ><span>自动清理数据线程类。</span></td></tr><tr><td style='text-align:left;' ><span>dbconnthread</span></td><td style='text-align:left;' ><span>数据库通信管理线程类。</span></td></tr><tr><td style='text-align:left;' ><span>dbdelegate</span></td><td style='text-align:left;' ><span>自定义委托全家桶,包括复选框、下拉框、密码框、按钮等。</span></td></tr><tr><td style='text-align:left;' ><span>dbhead</span></td><td style='text-align:left;' ><span>当前组件通用头文件。</span></td></tr><tr><td style='text-align:left;' ><span>dbhelper</span></td><td style='text-align:left;' ><span>各种数据库应用函数封装,比如初始化数据库、执行sql语句等。</span></td></tr><tr><td style='text-align:left;' ><span>dbhttpthread</span></td><td style='text-align:left;' ><span>网络请求数据采集类。</span></td></tr><tr><td style='text-align:left;' ><span>dbpage</span></td><td style='text-align:left;' ><span>数据库通用翻页类。</span></td></tr><tr><td style='text-align:left;' ><span>dbpagemodel</span></td><td style='text-align:left;' ><span>数据库翻页类数据模型。</span></td></tr><tr><td style='text-align:left;' ><span>navpage</span></td><td style='text-align:left;' ><span>分页导航控件。</span></td></tr></tbody></table></figure><h5 id='11335-模块-coreffmpeg'><span>11.3.3.5 模块-core_ffmpeg</span></h5><figure><table><thead><tr><th style='text-align:left;' ><span>名称</span></th><th style='text-align:left;' ><span>说明</span></th></tr></thead><tbody><tr><td style='text-align:left;' ><span>ffmpegconvert</span></td><td style='text-align:left;' ><span>各种转换处理函数封装。</span></td></tr><tr><td style='text-align:left;' ><span>ffmpeghead</span></td><td style='text-align:left;' ><span>当前组件通用头文件。</span></td></tr><tr><td style='text-align:left;' ><span>ffmpeghelper</span></td><td style='text-align:left;' ><span>辅助类,包括版本号,校验url地址、获取流索引等。</span></td></tr><tr><td style='text-align:left;' ><span>ffmpegsync</span></td><td style='text-align:left;' ><span>音视频同步类,包括了同步以及发出当前播放进度信号。</span></td></tr><tr><td style='text-align:left;' ><span>ffmpegthread</span></td><td style='text-align:left;' ><span>核心解码类,主要代码都在这,包括音视频的解码。</span></td></tr><tr><td style='text-align:left;' ><span>ffmpegtool</span></td><td style='text-align:left;' ><span>工具类,用于执行ffmpeg的命令获取结果。</span></td></tr><tr><td style='text-align:left;' ><span>ffmpegwidget</span></td><td style='text-align:left;' ><span>视频显示窗体类,解码后到这里显示,依赖ffmpegthread。</span></td></tr><tr><td style='text-align:left;' ><span>videoffmpeg</span></td><td style='text-align:left;' ><span>多通道管理类。</span></td></tr></tbody></table></figure><h5 id='11336-模块-coremap'><span>11.3.3.6 模块-core_map</span></h5><figure><table><thead><tr><th style='text-align:left;' ><span>名称</span></th><th style='text-align:left;' ><span>说明</span></th></tr></thead><tbody><tr><td style='text-align:left;' ><span>echartjs</span></td><td style='text-align:left;' ><span>echart模块中用到的json文件转js文件,获取js文件中的名字和经纬度等处理。</span></td></tr><tr><td style='text-align:left;' ><span>echarts</span></td><td style='text-align:left;' ><span>echart封装类,可加载仪表盘、闪烁点图、迁徙图、世界地图、区域地图等,每个点可自定义颜色和提示信息等。</span></td></tr><tr><td style='text-align:left;' ><span>mapbaidu</span></td><td style='text-align:left;' ><span>百度地图封装类,支持在线和离线两种模式。</span></td></tr></tbody></table></figure><h5 id='11337-模块-coreonvif'><span>11.3.3.7 模块-core_onvif</span></h5><figure><table><thead><tr><th style='text-align:left;' ><span>名称</span></th><th style='text-align:left;' ><span>说明</span></th></tr></thead><tbody><tr><td style='text-align:left;' ><span>onvifbase</span></td><td style='text-align:left;' ><span>基础类,用于获取设备信息、服务文件地址、能力文件地址、媒体文件地址、视频流地址等。</span></td></tr><tr><td style='text-align:left;' ><span>onvifdevice</span></td><td style='text-align:left;' ><span>设备类,核心处理及管理,包括设置用户信息请求onvif地址、获取设备信息、云台控制、事件订阅、抓拍图片等。</span></td></tr><tr><td style='text-align:left;' ><span>onvifevent</span></td><td style='text-align:left;' ><span>事件订阅具体实现类,可设置请求超时时间等。</span></td></tr><tr><td style='text-align:left;' ><span>onvifhead</span></td><td style='text-align:left;' ><span>当前组件通用头文件。</span></td></tr><tr><td style='text-align:left;' ><span>onvifhelper</span></td><td style='text-align:left;' ><span>辅助类,比如获取UUID用于请求、判断IP合法、获取本机IP地址集合、管理系统中所有onvif设备对象等。</span></td></tr><tr><td style='text-align:left;' ><span>onvifmedia</span></td><td style='text-align:left;' ><span>获取媒体文件具体解析类。</span></td></tr><tr><td style='text-align:left;' ><span>onvifother</span></td><td style='text-align:left;' ><span>其他处理类,比如系统重启、NTP校时、获取和设置网络信息、获取和设备时间、获取和设置图片参数等。</span></td></tr><tr><td style='text-align:left;' ><span>onvifptz</span></td><td style='text-align:left;' ><span>云台控制实现类,包括绝对移动、相对移动等。</span></td></tr><tr><td style='text-align:left;' ><span>onvifquery</span></td><td style='text-align:left;' ><span>数据查询类,用于将接收到的xml数据解析,并赋值字符串比如命名空间、设备地址、媒体地址、事件地址等。</span></td></tr><tr><td style='text-align:left;' ><span>onvifrequest</span></td><td style='text-align:left;' ><span>网络请求类,包括设置用户信息、获取用户token数据、获取xml头部数据等,通用的请求数据返回结果函数。</span></td></tr><tr><td style='text-align:left;' ><span>onvifsearch</span></td><td style='text-align:left;' ><span>设备搜索类,支持广播搜索、指定地址搜索,可获取设备信息集合、获取设备地址集合。</span></td></tr><tr><td style='text-align:left;' ><span>onvifservices</span></td><td style='text-align:left;' ><span>服务类,用于获取媒体地址、云台地址等。</span></td></tr><tr><td style='text-align:left;' ><span>onvifsnap</span></td><td style='text-align:left;' ><span>图片抓拍实现类,包括获取抓图地址、抓拍图片等。</span></td></tr></tbody></table></figure><h5 id='11338-模块-coreopengl'><span>11.3.3.8 模块-core_opengl</span></h5><figure><table><thead><tr><th style='text-align:left;' ><span>名称</span></th><th style='text-align:left;' ><span>说明</span></th></tr></thead><tbody><tr><td style='text-align:left;' ><span>openglhead</span></td><td style='text-align:left;' ><span>当前组件通用头文件。</span></td></tr><tr><td style='text-align:left;' ><span>nv12glwidget</span></td><td style='text-align:left;' ><span>继承自QGLWidget的NV12格式OPENGL绘制窗体。</span></td></tr><tr><td style='text-align:left;' ><span>nv12openglwidget</span></td><td style='text-align:left;' ><span>继承自QOpenGLWidget的NV12格式OPENGL绘制窗体。</span></td></tr><tr><td style='text-align:left;' ><span>yuvglwidget</span></td><td style='text-align:left;' ><span>继承自QGLWidget的YUV格式OPENGL绘制窗体。</span></td></tr><tr><td style='text-align:left;' ><span>yuvopenglwidget</span></td><td style='text-align:left;' ><span>继承自QOpenGLWidget的YUV格式OPENGL绘制窗体。</span></td></tr></tbody></table></figure><h5 id='11339-模块-coreform'><span>11.3.3.9 模块-core_form</span></h5><figure><table><thead><tr><th style='text-align:left;' ><span>名称</span></th><th style='text-align:left;' ><span>说明</span></th></tr></thead><tbody><tr><td style='text-align:left;' ><span>formhelper</span></td><td style='text-align:left;' ><span>封装的导入导出、导出数据到xls/pdf和打印数据、自动备份数据、保存最后打开的文件夹等。</span></td></tr><tr><td style='text-align:left;' ><span>frmconfigdb</span></td><td style='text-align:left;' ><span>通用数据库管理界面类,可选不同的数据库类型,填入用户信息,执行检测连接和初始化数据操作。</span></td></tr><tr><td style='text-align:left;' ><span>frmconfiguser</span></td><td style='text-align:left;' ><span>通用用户管理界面类,可添加、删除、修改用户信息,包括权限分配等,可导入导出打印用户信息。</span></td></tr><tr><td style='text-align:left;' ><span>frmlogin</span></td><td style='text-align:left;' ><span>通用用户登录界面类,包括自动登录和记住密码复选框,多次密码错误校验,记住当前用户信息等。三次错误关闭,下拉可选用户,内置超级密码。</span></td></tr><tr><td style='text-align:left;' ><span>frmlogout</span></td><td style='text-align:left;' ><span>通用用户退出界面类,三次错误关闭,下拉可选用户,内置超级密码。</span></td></tr><tr><td style='text-align:left;' ><span>userhelper</span></td><td style='text-align:left;' ><span>通用用户权限管理类,内置7种类型权限,对应权限名称可自定义,一般在用户切换对应界面或者单击了对应功能按钮的时候触发。</span></td></tr></tbody></table></figure><h5 id='113310-模块-corequi'><span>11.3.3.10 模块-core_qui</span></h5><p><span>本组件涵盖的功能较多,所以采用了分层管理代码结构。</span></p><figure><table><thead><tr><th style='text-align:left;' ><span>名称</span></th><th style='text-align:left;' ><span>说明</span></th></tr></thead><tbody><tr><td style='text-align:left;' ><span>iconhelper</span></td><td style='text-align:left;' ><span>万能图形字体类,可传入多种图形字体文件,一个类通用所有图形字体。</span></td></tr><tr><td style='text-align:left;' ><span>quiconfig</span></td><td style='text-align:left;' ><span>存储当前组件的配置参数信息,比如全局的字体名称、字号、无边框窗体的最小化最大化关闭等图标、样式表的颜色值。</span></td></tr><tr><td style='text-align:left;' ><span>quihead</span></td><td style='text-align:left;' ><span>当前组件通用头文件。</span></td></tr><tr><td style='text-align:left;' ><span>quistyle</span></td><td style='text-align:left;' ><span>当前组件通用样式设置管理类,可以指定枚举类型样式、传入样式内容设置、获取样式表文件对应的颜色值等。当前组件样式相关的处理函数都放在这里,统一管理。</span></td></tr></tbody></table></figure><figure><table><thead><tr><th style='text-align:left;' ><span>名称</span></th><th style='text-align:left;' ><span>说明</span></th></tr></thead><tbody><tr><td style='text-align:left;' ><span>quiabout</span></td><td style='text-align:left;' ><span>关于系统对话框,可传入软件标题、版本、版权、网址等信息。</span></td></tr><tr><td style='text-align:left;' ><span>quidateselect</span></td><td style='text-align:left;' ><span>自定义日期范围选择对话框。</span></td></tr><tr><td style='text-align:left;' ><span>quiinputbox</span></td><td style='text-align:left;' ><span>自定义输入框窗体,可指定不同的输入类型比如文本框、下拉框等。</span></td></tr><tr><td style='text-align:left;' ><span>quimessagebox</span></td><td style='text-align:left;' ><span>自定义信息消息框窗体,可设置关闭倒计时,不同的类型比如信息框、询问框、错误框等。</span></td></tr><tr><td style='text-align:left;' ><span>quisplash</span></td><td style='text-align:left;' ><span>自定义弹出提示信息,提示完自动消息关闭。</span></td></tr><tr><td style='text-align:left;' ><span>quitipbox</span></td><td style='text-align:left;' ><span>自定义右下角信息对话框,可设置对齐方式、关闭倒计时等。</span></td></tr><tr><td style='text-align:left;' ><span>quiwidget</span></td><td style='text-align:left;' ><span>自定义无边框窗体,可设置标题,各种图标等。</span></td></tr></tbody></table></figure><figure><table><thead><tr><th style='text-align:left;' ><span>名称</span></th><th style='text-align:left;' ><span>说明</span></th></tr></thead><tbody><tr><td style='text-align:left;' ><span>quihelper</span></td><td style='text-align:left;' ><span>项目通用辅助类,各种常用函数的封装,比如获取当前屏幕分辨率、设置字体、设置编码、加载翻译文件、各种进制数据转换、弹出各种对话框、设置延时时间等。</span></td></tr><tr><td style='text-align:left;' ><span>quihelpercore</span></td><td style='text-align:left;' ><span>获取当前桌面分辨率,设置编码、字体、翻译文件等。</span></td></tr><tr><td style='text-align:left;' ><span>quihelperdata</span></td><td style='text-align:left;' ><span>16进制、2进制、10进制互相转换,16进制字符串、字节数组互相转换,字节数组转int和short,CRC校验等。</span></td></tr><tr><td style='text-align:left;' ><span>quihelperfile</span></td><td style='text-align:left;' ><span>选择文件、保存文件、选择目录等对话框,复制文件、删除文件等。</span></td></tr><tr><td style='text-align:left;' ><span>quihelperform</span></td><td style='text-align:left;' ><span>设置无边框窗体、边框阴影,弹出信息框、错误框、询问框、日期选择框、关于对话框、中间提示框等。</span></td></tr><tr><td style='text-align:left;' ><span>quihelperimage</span></td><td style='text-align:left;' ><span>获取等比例缩放图片,通用设置logo图片,支持资源文件、本地图片、图形字体、svg自动变色等多种形式。</span></td></tr><tr><td style='text-align:left;' ><span>quihelpernet</span></td><td style='text-align:left;' ><span>获取本机IP地址集合,获取外网IP地址,判断IP、MAC等是否合法,下载网络文件,IP地址字符串与整型互相转换。</span></td></tr><tr><td style='text-align:left;' ><span>quihelperother</span></td><td style='text-align:left;' ><span>初始化数据库文件,设置系统时间、开机启动,设置图标到按钮,写入临时消息的文本文件等。</span></td></tr></tbody></table></figure><h5 id='113311-模块-coretcpfile'><span>11.3.3.11 模块-core_tcpfile</span></h5><figure><table><thead><tr><th style='text-align:left;' ><span>名称</span></th><th style='text-align:left;' ><span>说明</span></th></tr></thead><tbody><tr><td style='text-align:left;' ><span>tcpfilehead</span></td><td style='text-align:left;' ><span>当前组件通用头文件。</span></td></tr><tr><td style='text-align:left;' ><span>tcpfilehelper</span></td><td style='text-align:left;' ><span>辅助类,包括将字节转为MB单位、初始化表格控件、生成表格行、数据加密解密、解压文件、重启系统等。</span></td></tr><tr><td style='text-align:left;' ><span>tcpreceivefileserver</span></td><td style='text-align:left;' ><span>接收文件服务类,管理多个接收文件线程,支持监听端口被动接收文件和主动连接服务器接收文件。</span></td></tr><tr><td style='text-align:left;' ><span>tcpreceivefilethread</span></td><td style='text-align:left;' ><span>接收文件线程类,根据发送的文件名、包编号、块大小、挨个接收数据最终形成文件,可设置保存文件夹等。</span></td></tr><tr><td style='text-align:left;' ><span>tcpsearchfileserver</span></td><td style='text-align:left;' ><span>搜索文件服务类,目前没用,用于接收请求搜索文件是否存在。</span></td></tr><tr><td style='text-align:left;' ><span>tcpsendfilethread</span></td><td style='text-align:left;' ><span>发送文件线程类,按照 文件开始符+文件大小+文件内容+文件结束符 逐个分包发送,可对文件的每个包进行加密传输。</span></td></tr></tbody></table></figure><h5 id='113312-模块-corevideo'><span>11.3.3.12 模块-core_video</span></h5><figure><table><thead><tr><th style='text-align:left;' ><span>名称</span></th><th style='text-align:left;' ><span>说明</span></th></tr></thead><tbody><tr><td style='text-align:left;' ><span>commonvideomanage</span></td><td style='text-align:left;' ><span>通用视频管理类,比如定时器排队打开视频、排队重连视频,可设置超时时间、打开间隔、重连间隔等。</span></td></tr><tr><td style='text-align:left;' ><span>commonvideowidget</span></td><td style='text-align:left;' ><span>通用视频控件类,视频监控系统支持多种内核,每种内核对应的视频控件接口一样,根据预定义关键字识别具体的视频控件类,搞个通用的视频控件类,就不用每个用到该控件的代码文件去挨个判断预定义变量生成对应的视频控件,很大减少重复冗余代码量。</span></td></tr></tbody></table></figure><h5 id='113313-模块-corewebview'><span>11.3.3.13 模块-core_webview</span></h5><figure><table><thead><tr><th style='text-align:left;' ><span>名称</span></th><th style='text-align:left;' ><span>说明</span></th></tr></thead><tbody><tr><td style='text-align:left;' ><span>webcore.pri</span></td><td style='text-align:left;' ><span>通用的根据不同的Qt版本、不同的编译器环境、不同的操作系统,加载对应的浏览器内核模块和定义不同的变量。</span></td></tr><tr><td style='text-align:left;' ><span>miniblink</span></td><td style='text-align:left;' ><span>miniblink封装处理类。</span></td></tr><tr><td style='text-align:left;' ><span>webhelper</span></td><td style='text-align:left;' ><span>经纬度转换、获取小数点经纬度值等常用处理函数。</span></td></tr><tr><td style='text-align:left;' ><span>webjsdata</span></td><td style='text-align:left;' ><span>通用的浏览器控件和Qt程序交互数据中转类。</span></td></tr><tr><td style='text-align:left;' ><span>webview</span></td><td style='text-align:left;' ><span>通用浏览器控件,支持webkit、webengine、miniblink。</span></td></tr></tbody></table></figure><h4 id='1134-界面ui'><span>11.3.4 界面UI</span></h4><p><span> </span><img src="snap/11-3-4.jpg" referrerpolicy="no-referrer"></p><p><strong><span>界面说明</span></strong></p><ul><li><span>这里分门别类存放的各种功能集合的界面类。</span></li><li><span>每个类都一个ui文件、一个h头文件、一个cpp实现文件。</span></li><li><span>可以方便快速查找对应功能的界面,也方便拓展增加界面。</span></li><li><span>不仅分文件夹存放的,而且命名也尽量按照对应功能打头,比如系统设置模块中的都用frmconfig打头。</span></li><li><span>外层文件夹是整齐的,内部代码也是整齐的。</span></li></ul><figure><table><thead><tr><th style='text-align:left;' ><span>名称</span></th><th style='text-align:left;' ><span>说明</span></th></tr></thead><tbody><tr><td style='text-align:left;' ><span>frmconfig</span></td><td style='text-align:left;' ><span>系统设置模块,包括基本设置、录像机管理、摄像机管理、轮询管理、用户管理、视频上传等。</span></td></tr><tr><td style='text-align:left;' ><span>frmdata</span></td><td style='text-align:left;' ><span>日志查询模块,包括本地日志、设备日志等。</span></td></tr><tr><td style='text-align:left;' ><span>frmdemo</span></td><td style='text-align:left;' ><span>演示demo示例,用于演示具体控件或者功能的使用,方便学习参考,比如视频图片、视频控件、视频存储都单独的使用demo。</span></td></tr><tr><td style='text-align:left;' ><span>frmipc</span></td><td style='text-align:left;' ><span>存放摄像机处理相关的模块,比如设备控制,云台控制、预置位、巡航设置等。之前放在frmmodule模块中,后面独立出来管理更方便。</span></td></tr><tr><td style='text-align:left;' ><span>frmmain</span></td><td style='text-align:left;' ><span>主界面模块,包括登录登出界面、主界面、右上角时间组件、欢迎组件等。</span></td></tr><tr><td style='text-align:left;' ><span>frmmap</span></td><td style='text-align:left;' ><span>地图模块,包括通用地图内核界面、图片地图、在线地图、离线地图、路径规划等。</span></td></tr><tr><td style='text-align:left;' ><span>frmmodule</span></td><td style='text-align:left;' ><span>停靠子窗体模块,包括停靠窗体管理核心类、设备列表、窗口信息、图文警情、设备轨迹、网页浏览等模块。将摄像机、机器人、无人机相关的模块放到了对应的模块文件夹,这里放的是系统通用的模块。</span></td></tr><tr><td style='text-align:left;' ><span>frmrobot</span></td><td style='text-align:left;' ><span>无人机模块,包括图像增强、飞行监控等模块。</span></td></tr><tr><td style='text-align:left;' ><span>frmuavs</span></td><td style='text-align:left;' ><span>无人机模块,包括图像增强、飞行监控等模块。</span></td></tr><tr><td style='text-align:left;' ><span>frmvideo</span></td><td style='text-align:left;' ><span>视频监控模块,所有视频监控相关的都放在这里,包括主界面的视频监控布局窗体、视频回放、远程回放、图片回放等。</span></td></tr></tbody></table></figure><h5 id='11341-模块-frmconfig'><span>11.3.4.1 模块-frmconfig</span></h5><figure><table><thead><tr><th style='text-align:left;' ><span>名称</span></th><th style='text-align:left;' ><span>说明</span></th></tr></thead><tbody><tr><td style='text-align:left;' ><span>frmconfig</span></td><td style='text-align:left;' ><span>系统设置模块主界面,采用堆栈窗体形式,加载多个子界面比如摄像机管理、轮询管理等。</span></td></tr><tr><td style='text-align:left;' ><span>frmconfigipc</span></td><td style='text-align:left;' ><span>摄像机管理,可以增加、删除、修改、清空、导入、导出、打印摄像机信息。</span></td></tr><tr><td style='text-align:left;' ><span>frmconfigipcsearch</span></td><td style='text-align:left;' ><span>onvif设备搜索,独立出来的窗体,可以搜索局域网内的所有onvif摄像机信息,搜索完以后获取摄像机的视频流地址等,最后可以单个添加或者批量选中添加到摄像机信息表格中。</span></td></tr><tr><td style='text-align:left;' ><span>frmconfignvr</span></td><td style='text-align:left;' ><span>录像机管理,可以增加、删除、修改、清空、导入、导出、打印录像机信息。</span></td></tr><tr><td style='text-align:left;' ><span>frmconfigpoll</span></td><td style='text-align:left;' ><span>轮询管理,可以增加、删除、修改、清空、导入、导出、打印轮询点信息。可以按照设定规则批量生成轮询点信息。</span></td></tr><tr><td style='text-align:left;' ><span>frmconfigpollplus</span></td><td style='text-align:left;' ><span>将轮询管理中的轮询参数配置、分组管理、批量添加等独立出来的界面,方便管理和拓展。</span></td></tr><tr><td style='text-align:left;' ><span>frmconfigsave</span></td><td style='text-align:left;' ><span>录像计划,目前空的,等想好了怎么设计好在实现。</span></td></tr><tr><td style='text-align:left;' ><span>frmconfigsystem</span></td><td style='text-align:left;' ><span>系统设置,包括基本设置、视频参数、数据库设置、地图配置、功能激活、颜色配置、串口配置、网络配置等。</span></td></tr></tbody></table></figure><h5 id='11342-模块-frmdata'><span>11.3.4.2 模块-frmdata</span></h5><figure><table><thead><tr><th style='text-align:left;' ><span>名称</span></th><th style='text-align:left;' ><span>说明</span></th></tr></thead><tbody><tr><td style='text-align:left;' ><span>frmdata</span></td><td style='text-align:left;' ><span>日志查询模块主界面,采用堆栈窗体形式,加载多个子界面包括本地日志、设备日志等。</span></td></tr><tr><td style='text-align:left;' ><span>frmdatadevice</span></td><td style='text-align:left;' ><span>设备日志,通过私有协议从NVR取对应设备日志信息。</span></td></tr><tr><td style='text-align:left;' ><span>frmdatauser</span></td><td style='text-align:left;' ><span>本地地址,用户操作的日志信息,可查询和导出打印数据记录。</span></td></tr></tbody></table></figure><h5 id='11343-模块-frmdemo'><span>11.3.4.3 模块-frmdemo</span></h5><figure><table><thead><tr><th style='text-align:left;' ><span>名称</span></th><th style='text-align:left;' ><span>说明</span></th></tr></thead><tbody><tr><td style='text-align:left;' ><span>frmdemo</span></td><td style='text-align:left;' ><span>单独的功能演示示例主窗体,加载多个子界面比如视频控件等。</span></td></tr><tr><td style='text-align:left;' ><span>frmdemoqui</span></td><td style='text-align:left;' ><span>通用辅助示例,主要演示qui通用组件中封装的函数如何使用,比如各种消息框、提示框等。</span></td></tr><tr><td style='text-align:left;' ><span>frmdemovideoimage</span></td><td style='text-align:left;' ><span>视频图片示例,从图片文件夹读取图片集合,定时器绘制取出图片发给视频控件绘制。</span></td></tr><tr><td style='text-align:left;' ><span>frmdemovideoplus</span></td><td style='text-align:left;' ><span>视频叠加示例,多个视频控件叠加在一起同时播放,可以设置在四个角落位置。</span></td></tr><tr><td style='text-align:left;' ><span>frmdemovideosave</span></td><td style='text-align:left;' ><span>视频保存示例,演示如何对视频控件进行视频保存,可动态保存。</span></td></tr><tr><td style='text-align:left;' ><span>frmdemovideowidget</span></td><td style='text-align:left;' ><span>视频控件示例,演示视频控件如何使用。</span></td></tr></tbody></table></figure><h5 id='11344-模块-frmipc'><span>11.3.4.4 模块-frmipc</span></h5><figure><table><thead><tr><th style='text-align:left;' ><span>名称</span></th><th style='text-align:left;' ><span>说明</span></th></tr></thead><tbody><tr><td style='text-align:left;' ><span>frmipccontrol</span></td><td style='text-align:left;' ><span>设备控制模块,可对选中设备进行图片参数调节、NTP校时、设备重启、抓拍图片(ONVIF抓图)等。</span></td></tr><tr><td style='text-align:left;' ><span>frmipcnavigate</span></td><td style='text-align:left;' ><span>巡航管理模块,暂未实现,后期完善。</span></td></tr><tr><td style='text-align:left;' ><span>frmipcreset</span></td><td style='text-align:left;' ><span>预置位管理模块,暂未实现,后期完善。</span></td></tr><tr><td style='text-align:left;' ><span>frmipcptz</span></td><td style='text-align:left;' ><span>云台控制模块,可对选中的摄像机进行云台控制。</span></td></tr></tbody></table></figure><h5 id='11345-模块-frmmain'><span>11.3.4.5 模块-frmmain</span></h5><figure><table><thead><tr><th style='text-align:left;' ><span>名称</span></th><th style='text-align:left;' ><span>说明</span></th></tr></thead><tbody><tr><td style='text-align:left;' ><span>frmmain</span></td><td style='text-align:left;' ><span>系统主界面,采用堆栈窗体,加载各个子模块。</span></td></tr><tr><td style='text-align:left;' ><span>frmmain1</span></td><td style='text-align:left;' ><span>备用模块1界面,根据参数设置决定是否启用。</span></td></tr><tr><td style='text-align:left;' ><span>frmtimecpu</span></td><td style='text-align:left;' ><span>右上角日期时间+CPU内存显示。</span></td></tr><tr><td style='text-align:left;' ><span>frmwelcome</span></td><td style='text-align:left;' ><span>右上角欢迎信息界面。</span></td></tr></tbody></table></figure><h5 id='11346-模块-frmmap'><span>11.3.4.6 模块-frmmap</span></h5><figure><table><thead><tr><th style='text-align:left;' ><span>名称</span></th><th style='text-align:left;' ><span>说明</span></th></tr></thead><tbody><tr><td style='text-align:left;' ><span>frmmap</span></td><td style='text-align:left;' ><span>地图管理主界面,采用堆栈窗体形式,加载各个子界面比如图片地图、在线地图、离线地图、路径规划等。</span></td></tr><tr><td style='text-align:left;' ><span>frmmapcore</span></td><td style='text-align:left;' ><span>通用百度地图内核界面,用来加载百度地图,可设置在线、离线模式,有很多个窗体用到类似功能特意封装到一个类,重复利用,比如悬浮地图、飞行轨迹、路径规划等模块都用到了此内核。</span></td></tr><tr><td style='text-align:left;' ><span>frmmapdevice</span></td><td style='text-align:left;' ><span>通用的设备地图界面,在线地图和离线地图界面公用这个界面,唯一区别就是设置下地图的模式是在线还是离线。</span></td></tr><tr><td style='text-align:left;' ><span>frmmapimage</span></td><td style='text-align:left;' ><span>图片地图界面,设备作为一个个按钮点显示在对应地图上,可以拖动,双击弹出预览实时视频。</span></td></tr><tr><td style='text-align:left;' ><span>frmmaplocal</span></td><td style='text-align:left;' ><span>离线地图界面,可更新经纬度值、模拟运动轨迹等。</span></td></tr><tr><td style='text-align:left;' ><span>frmmapweb</span></td><td style='text-align:left;' ><span>在线地图界面,可更新经纬度值、模拟运动轨迹等。</span></td></tr><tr><td style='text-align:left;' ><span>frmmaproute</span></td><td style='text-align:left;' ><span>路径规划界面,可查询路线得到路线的经纬度坐标集合。</span></td></tr></tbody></table></figure><h5 id='11347-模块-frmmodule'><span>11.3.4.7 模块-frmmodule</span></h5><figure><table><thead><tr><th style='text-align:left;' ><span>名称</span></th><th style='text-align:left;' ><span>说明</span></th></tr></thead><tbody><tr><td style='text-align:left;' ><span>frmdevicegps</span></td><td style='text-align:left;' ><span>设备轨迹模块,对设定的设备随机模拟轨迹,也可传入经纬度坐标值自动移动并绘制轨迹线条,不同设备可以不同颜色。</span></td></tr><tr><td style='text-align:left;' ><span>frmdevicetree</span></td><td style='text-align:left;' ><span>设备列表模块,读取设备信息加载形成树状列表,双击或者拖动到视频监控窗体直接播放视频,提供右键菜单作为演示如何使用。</span></td></tr><tr><td style='text-align:left;' ><span>frmmodule</span></td><td style='text-align:left;' ><span>主界面中心部分窗体,采用QMainWindow类,中间加载的视频监控面板,其余new出来每个子模块,子模块可停靠和悬浮拖动等。不同工作模式下的各种子模块都在此加载。同时负责管理模块的显示隐藏菜单。</span></td></tr><tr><td style='text-align:left;' ><span>frmmsglist</span></td><td style='text-align:left;' ><span>图文警情模块,也叫消息列表模块,带有右键菜单添加、删除、清空列表中的消息,双击可以弹出大图预览。</span></td></tr><tr><td style='text-align:left;' ><span>frmmsglistitem</span></td><td style='text-align:left;' ><span>图文警情模块子类,都是由一个个item组成放到panelwidget面板控件中,自动形成滚动条。</span></td></tr><tr><td style='text-align:left;' ><span>frmmsgtable</span></td><td style='text-align:left;' ><span>窗口消息模块,也叫表格消息模块,表格形式显示打印信息,不同的内容可以不同颜色区分。</span></td></tr><tr><td style='text-align:left;' ><span>frmwebview</span></td><td style='text-align:left;' ><span>网页浏览模块,传入一个url地址打开对应的网页,比如打开一个3D的网页。</span></td></tr></tbody></table></figure><h5 id='11348-模块-frmrobot'><span>11.3.4.8 模块-frmrobot</span></h5><figure><table><thead><tr><th style='text-align:left;' ><span>名称</span></th><th style='text-align:left;' ><span>说明</span></th></tr></thead><tbody><tr><td style='text-align:left;' ><span>frmrobotdata</span></td><td style='text-align:left;' ><span>仿真数据模块,启动机器人通信服务,接收数据解析显示。</span></td></tr><tr><td style='text-align:left;' ><span>frmrobotdebug</span></td><td style='text-align:left;' ><span>数据调试模块,可模拟发送轨迹数据测试解析类。</span></td></tr><tr><td style='text-align:left;' ><span>frmrobotdebug2</span></td><td style='text-align:left;' ><span>新数据调试模块,打印多个串口数据,不同颜色显示。</span></td></tr><tr><td style='text-align:left;' ><span>frmrobotemulate</span></td><td style='text-align:left;' ><span>运动仿真模块,预留给用户实现,一般放个3D效果。</span></td></tr><tr><td style='text-align:left;' ><span>frmrobotlog</span></td><td style='text-align:left;' ><span>机器人实时数据模块,预留给用户实现。</span></td></tr></tbody></table></figure><h5 id='11349-模块-frmvideo'><span>11.3.4.9 模块-frmvideo</span></h5><figure><table><thead><tr><th style='text-align:left;' ><span>名称</span></th><th style='text-align:left;' ><span>说明</span></th></tr></thead><tbody><tr><td style='text-align:left;' ><span>frmvideo</span></td><td style='text-align:left;' ><span>视频回放模块主界面,堆栈窗体形式,加载多个子界面比如本地回放、远程回放、设备播放等。</span></td></tr><tr><td style='text-align:left;' ><span>frmvideopanel</span></td><td style='text-align:left;' ><span>视频监控面板,主界面中间部分,这是核心,管理多个通道,通道可移除删除,拖曳打开,拖曳交换等。</span></td></tr><tr><td style='text-align:left;' ><span>frmvideopaneltool</span></td><td style='text-align:left;' ><span>视频监控底部工具栏,独立出来一个类专门管理。</span></td></tr><tr><td style='text-align:left;' ><span>frmvideoplayimage</span></td><td style='text-align:left;' ><span>图片回放模块,按照规则查询图片目录,然后可设定播放速度进行图片序列播放。</span></td></tr><tr><td style='text-align:left;' ><span>frmvideoplaylocal</span></td><td style='text-align:left;' ><span>本地回放模块,查询对应通道的本地存储的视频文件,双击播放,可暂停和拖动进度条位置。</span></td></tr><tr><td style='text-align:left;' ><span>frmvideoplaynvr</span></td><td style='text-align:left;' ><span>设备播放模块,通过RTSP视频流的形式从远程设备取视频进行播放,支持摄像机和录像机,手动填入地址也行。</span></td></tr><tr><td style='text-align:left;' ><span>frmvideoplayweb</span></td><td style='text-align:left;' ><span>远程回放模块,需要用厂家sdk去实现,从NVR回放录像。</span></td></tr><tr><td style='text-align:left;' ><span>frmvideopreview</span></td><td style='text-align:left;' ><span>视频预览窗体,比如图片或者地图上双击设备弹出的视频预览,可以多个,关闭的时候自动释放资源。</span></td></tr><tr><td style='text-align:left;' ><span>frmvideoupload</span></td><td style='text-align:left;' ><span>视频上传,将本地存储的视频文件上传到服务器。</span></td></tr></tbody></table></figure><h2 id='12-二次开发说明'><span>12 二次开发说明</span></h2><h3 id='121-通用开发环境搭建'><span>12.1 通用开发环境搭建</span></h3><ol start='' ><li><span>第一步:安装系统,推荐用vmware虚拟机。</span></li><li><span>第二步:安装qt环境,可以直接用官方下载的run安装包安装,有些要求用命令行安装。</span></li><li><span>第三步:写个空白窗体程序测试下是否环境正常。</span></li><li><span>第四步:编译ffmpeg,生成对应的动态库或者静态库。</span></li><li><span>第五步:打开video_system.pro项目进行编译。</span></li><li><span>第六步:打包发布,为了发布方便,推荐用静态编译的Qt+静态编译的ffmpeg,这样打包发布很清爽,就一个可执行文件。</span></li></ol><h3 id='122-不同系统注意事项'><span>12.2 不同系统注意事项</span></h3><h3 id='123-监控系统组件示例'><span>12.3 监控系统组件示例</span></h3><p><span>本系统功能比较多,封装了多个控件,尤其是核心的视频监控控件,所以特意安排了独立的使用示例演示如何使用,可以在main函数找到 AppConfig::IndexStart = 0; 改成AppConfig::IndexStart = 1;即可,这样编译运行的是监控系统组件示例。</span></p><h4 id='1231-通用辅助'><span>12.3.1 通用辅助</span></h4><p><span> </span><img src="snap/12-3-1.jpg" referrerpolicy="no-referrer"></p><p><span>演示通用组件比如qui封装的类的使用。</span></p><ul><li><span>弹出信息框</span></li><li><span>弹出错误框</span></li><li><span>弹出询问框</span></li><li><span>带自动关闭倒计时</span></li><li><span>弹出右下角信息框</span></li><li><span>隐藏右下角信息框</span></li><li><span>弹出时间选择框</span></li><li><span>弹出中间提示信息</span></li><li><span>弹出关于对话框</span></li></ul><h4 id='1232-视频图片'><span>12.3.2 视频图片</span></h4><p><span> </span><img src="snap/12-3-2.jpg" referrerpolicy="no-referrer"></p><p><span>演示加载图片文件夹,进行图片序列的播放。</span></p><h4 id='1233-视频控件'><span>12.3.3 视频控件</span></h4><p><span> </span><img src="snap/12-3-3.jpg" referrerpolicy="no-referrer"></p><p><span>演示通用视频控件如何使用,包括打开、关闭、暂停、继续、截图、自动抓拍等功能。</span></p><h4 id='1234-视频存储'><span>12.3.4 视频存储</span></h4><p><span> </span><img src="snap/12-3-4.jpg" referrerpolicy="no-referrer"></p><p><span>演示视频控件如何存储视频文件到本地,单击开始按钮开始存储视频,单击关闭则关闭存储。</span></p><h4 id='1235-视频叠加'><span>12.3.5 视频叠加</span></h4><p><span> </span><img src="snap/12-3-5.jpg" referrerpolicy="no-referrer"></p><p><span>演示如何用多个视频控件做视频叠加播放,可以设置叠加的位置在四个角落。</span></p><h3 id='124-人工智能集成'><span>12.4 人工智能集成</span></h3><h2 id='13-其他说明'><span>13 其他说明</span></h2><h3 id='131-海康onvif设置'><span>13.1 海康onvif设置</span></h3><p><span> </span><img src="snap/13-1-1.jpg" referrerpolicy="no-referrer"></p><p><span>新版的海康的摄像机,默认onvif是关闭的,需要手动开启,开启以后记得添加onvif用户,并重启摄像机应用。</span><strong><span>提示:海康旗下的萤石目前暂时不支持onvif协议。</span></strong></p><h3 id='132-大华onvif设置'><span>13.2 大华onvif设置</span></h3><p><span> </span><img src="snap/13-2-1.jpg" referrerpolicy="no-referrer"></p><p><span>大华摄像机,需要在用户管理中添加onvif用户,添加好以后建议重启摄像机应用。</span></p><h3 id='133-国际onvif工具'><span>13.3 国际onvif工具</span></h3><p><span> </span><img src="snap/13-3-1.jpg" referrerpolicy="no-referrer"></p><p><span>工具的名字叫ONVIF Device Manager,可以自行搜索下载,此工具位国际官方工具,如果此工具搜索不到摄像机,则说明该摄像机不是真正的onvif摄像机,不是标准的摄像机,目前市面上的绝大部分网络摄像机都支持onvif。具体用法可以参考 </span><a href='https://www.cnblogs.com/lsdb/p/9157302.html'><span>https://www.cnblogs.com/lsdb/p/9157302.html</span></a></p><p><span> </span><img src="snap/13-3-2.jpg" referrerpolicy="no-referrer"></p><p><span>现在大部分厂家的NVR也逐渐支持onvif,并将每个通道都可以单独列出来。</span></p><h3 id='134-报警输入设置'><span>13.4 报警输入设置</span></h3><p><span> </span><img src="snap/13-4-1.jpg" referrerpolicy="no-referrer">
|
||
<span> </span><img src="snap/13-4-1.jpg" referrerpolicy="no-referrer">
|
||
<span> </span><img src="snap/13-4-1.jpg" referrerpolicy="no-referrer"></p><p><strong><span>操作说明</span></strong></p><ul><li><span>默认摄像机IO输入或者开关量输入是关闭的,需要手动开启。</span></li><li><span>一般都是登录到摄像机的web页面找到开关量的地方,可能描述不一样但是大致的意思差不多。</span></li><li><span>一般摄像机会有两组开关量输入,而且开关量报警有常开常闭两种,都需要自己手动选择。</span></li><li><span>如果是常开的话意味着闭合是属于报警,反之亦然。</span></li><li><span>找两个导线接在对应口子(详见摄像机厂家的说明书,摄像机背面板也会有对应字样标识一般叫 in)。</span></li><li><span>短接或者扒开,都会有反应,onvif工具都能接收到信息(前提是单击过订阅事件按钮,而且顺利返回了订阅地址才行)。</span></li><li><span>会收到LogicalState关键字的信息,true或者1表示报警,false或者0表示正常。</span></li><li><span>可能每个厂家会有所区别,需要自己拿到数据后做特殊处理,但是大部分厂家都是相似的,实在不行无非搞个contains方法判断好了。</span></li></ul><h3 id='135-环境使用qtvs'><span>13.5 环境使用qt+vs</span></h3><p><span> </span><img src="snap/13-5-1.jpg" referrerpolicy="no-referrer">
|
||
<span> </span><img src="snap/13-5-2.jpg" referrerpolicy="no-referrer"></p><p><span>打开项目:QT VS TOOLS – Open Qt Project File 选择 video_system.pro,然后等待项目加载完毕。</span>
|
||
<span>由于项目中用到了ffmpeg和vlc,引用了对应的lib库,所以在用vs+qt的开发环境中,很可能报错提示映像是不安全的错误,导致编译通不过,需要做个设置。</span></p><p><strong><span>解决方法</span></strong></p><ol start='' ><li><span>第一步:打开该项目的“属性页”对话框。</span></li><li><span>第二步:单击“链接器”文件夹。</span></li><li><span>第三步:单击“命令行”属性页。</span></li><li><span>第四步:将 /SAFESEH:NO 键入“附加选项”框中,然后点击应用。</span></li><li><span>如果设置完发现还是不行,那应该是没有一开始就设置这个步骤,你需要打开项目以后就设置好这个步骤,再去编译,建议重新解压项目来一遍。</span></li></ol><h3 id='136-数据库设置mysql'><span>13.6 数据库设置mysql</span></h3><p><span> </span><img src="snap/13-6-1.jpg" referrerpolicy="no-referrer"></p><p><span>如果在数据库设置中选择了mysql数据库,需要对mysql数据库做个设置,就是将编码设置成utf8,已设置可以跳过,不然很可能数据库无法正常使用。</span></p><p><span>32位的Qt程序,带对应32位的libmysql动态库,可以访问32/64位的mysql数据库,64位的也是一样可以访问32/64位的mysql数据库,只需要带上对应位数的动态库就行。查看mysql是32位还是64位命令 mysql.exe -V。</span>
|
||
<span> </span><img src="snap/13-6-2.jpg" referrerpolicy="no-referrer"></p><h3 id='137-打开usb摄像头'><span>13.7 打开USB摄像头</span></h3><p><span> </span><img src="snap/13-7-1.jpg" referrerpolicy="no-referrer"></p><p><span>在加载USB摄像机的时候,需要填写对应USB设备的名称,可以通过命令行和设备管理器查看对应的名称,要英文的。</span></p><p><span>在需要加载多个USB摄像机的场景下,有时候会遇到同名的USB名称设备,此时需要打开注册表进行设备名称修改后,按照新修改后的设备名称填入即可。</span></p><p><span> </span><img src="snap/13-7-2.jpg" referrerpolicy="no-referrer">
|
||
<span> </span><img src="snap/13-7-3.jpg" referrerpolicy="no-referrer">
|
||
<span> </span><img src="snap/13-7-4.jpg" referrerpolicy="no-referrer"></p><h3 id='138-项目代码行数'><span>13.8 项目代码行数</span></h3><p><span> </span><img src="snap/13-8-1.jpg" referrerpolicy="no-referrer"></p><p><span>整个项目源代码行数大概30W行,其中代码13.5W行(占比45%),注释12.7W行(占比42%),空行3.5W行。分层设计注释详细。</span></p><h3 id='139-编译ffmpeg'><span>13.9 编译ffmpeg</span></h3><p><span>下面是linux系统编译ffmpeg步骤</span></p><ol start='' ><li><span>第一步:下载好ffmpeg,这个可以去官网 </span><a href='http://ffmpeg.org/' target='_blank' class='url'>http://ffmpeg.org/</a><span> 自行找到下载位置下载。要注意的是有些很老的嵌入式linux系统的编译器未必支持最新的ffmpeg4,建议下载3。</span></li><li><span>第二步:复制ffmpeg-3.4.5.tar.gz 到自定义文件夹下,我这里是/home/liu</span></li><li><span>第三步:解压ffmpeg,tar –zxvf ffmpeg-3.4.5.tar.gz –C /home/liu</span></li><li><span>第四步:安装编译ffmpeg依赖的包 apt-get install yasm</span></li><li><span>第五步:编译ffmpeg cd /home/liu/ffmpeg-3.4.5</span></li></ol><ul><li><span>如果编译静态库执行以下命令</span></li><li><span>./configure --prefix=host --enable-static --disable-shared --disable-doc</span></li><li><span>如果编译动态库执行以下命令</span></li><li><span>./configure --prefix=host --enable-shared --disable-static --disable-doc</span></li><li><span>如果需要编译ffplay以便直接用其打开测试,可以在参数后面加上--enable-ffplay</span></li><li><span>./configure --prefix=host --enable-shared --disable-static --disable-doc --enable-ffplay</span></li><li><span>嵌入式交叉编译需要指定编译器路径 --cross-prefix=/usr/local/arm-linux-gcc-4.9.2/gcc-linaro-arm-linux-gnueabihf-4.9-2014.08_linux/bin/arm-linux-gnueabihf- --arch=arm --target-os=linux</span></li><li><span>其他常用参数 --disable-zlib --disable-xlib --enable-x11grab --disable-libxcb </span></li><li><span>可以执行./configure –help 来查看支持哪些参数,尤其是各种解码器的开关,具体可搜索。</span></li><li><span>其他参数可参见网页 </span><a href='https://blog.csdn.net/momo0853/article/details/78043903' target='_blank' class='url'>https://blog.csdn.net/momo0853/article/details/78043903</a></li><li><span>make (还可以开启多线程编译加快速度 make –j4)</span></li><li><span>make install</span></li></ul><ol start='6' ><li><span>第六步:打开ffmpeg3.4.5/host目录,生成的文件都在这里,拿去用吧。</span></li></ol><p><span>windows系统采用mingw编译ffmpeg </span><a href='https://blog.csdn.net/yp18792574062/article/details/108962638' target='_blank' class='url'>https://blog.csdn.net/yp18792574062/article/details/108962638</a></p><h3 id='1310-高分屏缩放'><span>13.10 高分屏缩放</span></h3><ul><li><span>在windows上经常遇到高分屏缩放的问题,很头疼,貌似这东西就是windows首发的。</span></li><li><span>在Qt4时代的程序遇到高分屏缩放,不作任何处理,毕竟Qt4时代(2010年以前)出来的时候几乎还没高分屏缩放这东西。</span></li><li><span>从Qt5.6开始提供了高分屏缩放支持,需要在main函数前面设置 QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);</span></li><li><span>从Qt5.14开始提供了高分屏缩放策略设置,需要在main函数前面设置 QApplication::setHighDpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy::PassThrough);</span></li><li><span>从Qt6.0开始默认就开启高分屏属性Qt::AA_EnableHighDpiScaling,而且不允许关闭(所以你会发现程序用Qt6编译后界面变得很大)。可以通过setHighDpiScaleFactorRoundingPolicy函数设置策略。</span></li><li><span>如果不想要高分屏,希望程序永远保持默认的尺寸,你需要在main函数前面设置 QApplication::setAttribute(Qt::AA_Use96Dpi); 表示永远不缩放。</span></li><li><span>如果希望启用Qt的高分屏则需要设置Qt::AA_EnableHighDpiScaling和setHighDpiScaleFactorRoundingPolicy。缺点是图片容易发虚,比如复选框的边框,哪怕是Qt内置样式风格或者系统默认风格也一样。</span></li></ul><pre class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" spellcheck="false" lang="cpp"><div class="CodeMirror cm-s-inner cm-s-null-scroll CodeMirror-wrap" lang="cpp"><div style="overflow: hidden; position: relative; width: 3px; height: 0px; top: 9.51471px; left: 35.9874px;"><textarea autocorrect="off" autocapitalize="off" spellcheck="false" tabindex="0" style="position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;"></textarea></div><div class="CodeMirror-scrollbar-filler" cm-not-content="true"></div><div class="CodeMirror-gutter-filler" cm-not-content="true"></div><div class="CodeMirror-scroll" tabindex="-1"><div class="CodeMirror-sizer" style="margin-left: 28px; margin-bottom: 0px; border-right-width: 0px; padding-right: 0px; padding-bottom: 0px;"><div style="position: relative; top: 0px;"><div class="CodeMirror-lines" role="presentation"><div role="presentation" style="position: relative; outline: none;"><div class="CodeMirror-measure"><pre><span>xxxxxxxxxx</span></pre><div class="CodeMirror-linenumber CodeMirror-gutter-elt"><div>5</div></div></div><div class="CodeMirror-measure"></div><div style="position: relative; z-index: 1;"></div><div class="CodeMirror-code" role="presentation" style=""><div class="CodeMirror-activeline" style="position: relative;"><div class="CodeMirror-activeline-background CodeMirror-linebackground"></div><div class="CodeMirror-gutter-background CodeMirror-activeline-gutter" style="left: -27.9958px; width: 28px;"></div><div class="CodeMirror-gutter-wrapper CodeMirror-activeline-gutter" style="left: -27.9958px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt CodeMirror-linenumber-show" style="left: 0px; width: 19px;">1</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-variable-3">int</span> <span class="cm-def">main</span>(<span class="cm-variable-3">int</span> <span class="cm-variable">argc</span>, <span class="cm-variable-3">char</span> <span class="cm-variable-3">*</span><span class="cm-variable">argv</span>[])</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -27.9958px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 19px;">2</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;">{</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -27.9958px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 19px;">3</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">QApplication::setAttribute</span>(<span class="cm-variable">Qt::AA_EnableHighDpiScaling</span>); <span class="cm-variable">QApplication::setHighDpiScaleFactorRoundingPolicy</span>(<span class="cm-variable">Qt::HighDpiScaleFactorRoundingPolicy::PassThrough</span>);</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -27.9958px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 19px;">4</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">QApplication</span> <span class="cm-variable">a</span>(<span class="cm-variable">argc</span>, <span class="cm-variable">argv</span>);</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -27.9958px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt CodeMirror-linenumber-show" style="left: 0px; width: 19px;">5</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;">}</span></pre></div></div></div></div></div></div><div style="position: absolute; height: 0px; width: 1px; border-bottom: 0px solid transparent; top: 138px;"></div><div class="CodeMirror-gutters" style="height: 138px;"><div class="CodeMirror-gutter CodeMirror-linenumbers" style="width: 27px;"></div></div></div></div></pre><ul><li><span>另外一种办法就是写个文本文件qt.conf(Qt程序默认的标准配置文件,必须是这个名字),写入内容后,放到可执行文件同一目录即可,此方法采用操作系统的策略进行缩放,推荐此方法,虽然看起来稍微有点模糊,但不会出现发虚等问题,整体一致。</span></li></ul><pre class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" spellcheck="false" lang="cpp"><div class="CodeMirror cm-s-inner cm-s-null-scroll CodeMirror-wrap" lang="cpp"><div style="overflow: hidden; position: relative; width: 3px; height: 0px; top: 9.51471px; left: 35.9874px;"><textarea autocorrect="off" autocapitalize="off" spellcheck="false" tabindex="0" style="position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;"></textarea></div><div class="CodeMirror-scrollbar-filler" cm-not-content="true"></div><div class="CodeMirror-gutter-filler" cm-not-content="true"></div><div class="CodeMirror-scroll" tabindex="-1"><div class="CodeMirror-sizer" style="margin-left: 28px; margin-bottom: 0px; border-right-width: 0px; padding-right: 0px; padding-bottom: 0px;"><div style="position: relative; top: 0px;"><div class="CodeMirror-lines" role="presentation"><div role="presentation" style="position: relative; outline: none;"><div class="CodeMirror-measure"><pre><span>xxxxxxxxxx</span></pre><div class="CodeMirror-linenumber CodeMirror-gutter-elt"><div>2</div></div></div><div class="CodeMirror-measure"></div><div style="position: relative; z-index: 1;"></div><div class="CodeMirror-code" role="presentation"><div class="CodeMirror-activeline" style="position: relative;"><div class="CodeMirror-activeline-background CodeMirror-linebackground"></div><div class="CodeMirror-gutter-background CodeMirror-activeline-gutter" style="left: -27.9958px; width: 28px;"></div><div class="CodeMirror-gutter-wrapper CodeMirror-activeline-gutter" style="left: -27.9958px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt CodeMirror-linenumber-show" style="left: 0px; width: 19px;">1</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;">[<span class="cm-variable">Platforms</span>]</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -27.9958px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt CodeMirror-linenumber-show" style="left: 0px; width: 19px;">2</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-variable">WindowsArguments</span> <span class="cm-operator">=</span> <span class="cm-variable">dpiawareness</span><span class="cm-operator">=</span><span class="cm-number">0</span></span></pre></div></div></div></div></div></div><div style="position: absolute; height: 0px; width: 1px; border-bottom: 0px solid transparent; top: 46px;"></div><div class="CodeMirror-gutters" style="height: 46px;"><div class="CodeMirror-gutter CodeMirror-linenumbers" style="width: 27px;"></div></div></div></div></pre><ul><li><span>没有完美的高分屏支持方法,都是只能尽量满足,哪怕是windows系统本身,在开启缩放的时候,任务管理器也是模糊的很(尽管改成124%可以改变,但总归不是好办法),还有很多其他知名软件也是如此。</span></li><li><span>参考文章 </span><a href='https://blog.csdn.net/startl/article/details/105862817'><span>https://blog.csdn.net/startl/article/details/105862817</span></a></li></ul><p><span> </span><img src="snap/13-10-1.jpg" referrerpolicy="no-referrer">
|
||
<span> </span><img src="snap/13-10-2.jpg" referrerpolicy="no-referrer">
|
||
<span> </span><img src="snap/13-10-3.jpg" referrerpolicy="no-referrer"></p><h3 id='1311-浏览器内核'><span>13.11 浏览器内核</span></h3><ul><li><span>本系统的电子地图模块支持三种浏览器内核:webkit、webengine、miniblink,编译的时候会自动识别。</span></li><li><span>其中Qt5.6以前用的是webkit,Qt5.6版本以后分两种情况,一种是mingw编译器(windows系统)对应的Qt库不再提供浏览器模块,所以本系统为了兼容各种编译器,特意封装了miniblink浏览器内核,弥补这个不足。</span></li><li><span>Qt5.6以后的版本在linux系统和mac等系统,都不存在没有浏览器控件的情况,都使用的webengine。</span></li><li><span>仅仅是windows上的mingw编译器的Qt版本没有,其他系统其实都有的。很多人在这个地方都有疑问,都以为只有msvc编译器有浏览器控件,其实确切的说是在windows上msvc的Qt库带浏览器控件。</span></li><li><span>安装Qt的时候webengine模块默认不勾选,需要主动勾选才会安装。</span></li><li><span>也不是所有的msvc的Qt版本都有webengine浏览器模块,哪怕你勾选了也没用,有些版本官方并没有编译,需要自行编译。需要到对应的Qt安装目录查看是否有 Qt5WebEngine.dll 文件。</span></li></ul><p><span> </span><img src="snap/13-11-1.jpg" referrerpolicy="no-referrer"></p><h3 id='1312-odbc数据源'><span>13.12 ODBC数据源</span></h3><p><span>本系统除了支持直连各种数据库比如mysql、postgresql、sqlserver、oracle数据库,也支持odbc数据源的形式连接以上各种数据库,在配置数据源的时候,记得区分32、64位,对应数据源后面带有32/64一起字样的说明该数据源可以同时支持32位和64位的程序访问,不带的要用对应位数的才能访问。数据库名称记得填写的是数据源对应的名称,而不是数据源连接的数据库名称,很多人会搞错。</span></p><p><span> </span><img src="snap/13-12-1.jpg" referrerpolicy="no-referrer"></p></div></div>
|
||
|
||
<script>(function(){var e=document.body.parentElement,t=[],n=null,i=document.body.classList.contains("typora-export-collapse-outline"),r=function(e,t,n){document.addEventListener(e,function(e){if(!e.defaultPrevented)for(var i=e.target;i&&i!=this;i=i.parentNode)if(i.matches(t)){!1===n.call(i,e)&&(e.preventDefault(),e.stopPropagation());break}},!1)};function o(){return e.scrollTop}r("click",".outline-expander",function(e){var t=this.closest(".outline-item-wrapper").classList;return t.contains("outline-item-open")?t.remove("outline-item-open"):t.add("outline-item-open"),d(),!1}),r("click",".outline-item",function(e){var t=this.querySelector(".outline-label");if(location.hash="#"+t.getAttribute("href"),i){var n=this.closest(".outline-item-wrapper").classList;n.contains("outline-item-open")||n.add("outline-item-open"),c(),n.add("outline-item-active")}});var a,s,l=function(){var e=o();n=null;for(var i=0;i<t.length&&t[i][1]-e<60;i++)n=t[i]},c=function(){document.querySelectorAll(".outline-item-active").forEach(e=>e.classList.remove("outline-item-active")),document.querySelectorAll(".outline-item-single.outline-item-open").forEach(e=>e.classList.remove("outline-item-open"))},d=function(){if(n){c();var e=document.querySelector('.outline-label[href="#'+(CSS.escape?CSS.escape(n[0]):n[0])+'"]');if(e)if(i){var t=e.closest(".outline-item-open>ul>.outline-item-wrapper");if(t)t.classList.add("outline-item-active");else{for(var r=(e=e.closest(".outline-item-wrapper")).parentElement.closest(".outline-item-wrapper");r;)r=(e=r).parentElement.closest(".outline-item-wrapper");e.classList.add("outline-item-active")}}else e.closest(".outline-item-wrapper").classList.add("outline-item-active")}};window.addEventListener("scroll",function(e){a&&clearTimeout(a),a=setTimeout(function(){l(),d()},300)});var u=function(){s=setTimeout(function(){!function(){t=[];var e=o();document.querySelector("#write").querySelectorAll("h1, h2, h3, h4, h5, h6").forEach(n=>{var i=n.getAttribute("id");t.push([i,e+n.getBoundingClientRect().y])})}(),l(),d()},300)};window.addEventListener("resize",function(e){s&&clearTimeout(s),u()}),u()})();</script></body>
|
||
</html> |