2021-07-10 09:47:51 +00:00
<!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' > h t m l { o v e r f l o w - x : i n i t i a l ! i m p o r t a n t ; } : r o o t { - - b g - c o l o r : # f f f f f f ; - - t e x t - c o l o r : # 3 3 3 3 3 3 ; - - s e l e c t - t e x t - b g - c o l o r : # B 5 D 6 F C ; - - s e l e c t - t e x t - f o n t - c o l o r : a u t o ; - - m o n o s p a c e : " L u c i d a C o n s o l e " , C o n s o l a s , " C o u r i e r " , m o n o s p a c e ; - - t i t l e - b a r - h e i g h t : 2 0 p x ; }
.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; }
2021-07-23 06:56:32 +00:00
body { margin: 0px; padding: 0px; height: auto; inset: 0px; font-size: 1rem; line-height: 1.42857; overflow-x: hidden; background: inherit; tab-size: 4; }
2021-07-10 09:47:51 +00:00
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; }
.CodeMirror-sizer { margin-left: 0px !important; }
.CodeMirror-gutters { display: none !important; }
}
#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; }
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; }
.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; }
.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; }
.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.8; 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; }
2021-07-23 06:56:32 +00:00
.md-inline-math-container mjx-container { zoom: 0.95; }
2021-07-10 09:47:51 +00:00
.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; }
2021-07-23 06:56:32 +00:00
.CodeMirror-gutter-filler, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-vscrollbar { position: absolute; z-index: 6; display: none; outline: 0px; }
2021-07-10 09:47:51 +00:00
.CodeMirror-vscrollbar { right: 0px; top: 0px; overflow: hidden; }
2021-07-23 06:56:32 +00:00
.CodeMirror-hscrollbar { bottom: 0px; left: 0px; overflow: auto hidden; }
2021-07-10 09:47:51 +00:00
.CodeMirror-scrollbar-filler { right: 0px; bottom: 0px; }
.CodeMirror-gutter-filler { left: 0px; bottom: 0px; }
2021-07-23 06:56:32 +00:00
.CodeMirror-gutters { position: absolute; left: 0px; top: 0px; padding-bottom: 10px; z-index: 3; overflow-y: hidden; }
2021-07-10 09:47:51 +00:00
.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; }
2021-07-23 06:56:32 +00:00
.CodeMirror-linebackground { position: absolute; inset: 0px; z-index: 0; }
2021-07-10 09:47:51 +00:00
.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;
2021-07-23 06:56:32 +00:00
-webkit-font-smoothing: antialiased;
2021-07-10 09:47:51 +00:00
}
body {
2021-07-23 06:56:32 +00:00
font-family: "Open Sans","Clear Sans", "Helvetica Neue", Helvetica, Arial, 'Segoe UI Emoji', sans-serif;
2021-07-10 09:47:51 +00:00
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;
}
table,
pre {
page-break-inside: avoid;
}
pre {
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));
}
2021-09-26 01:50:09 +00:00
2021-07-10 09:47:51 +00:00
< / style > < title > Qt编写的视频监控系统开发及使用说明< / title >
< / head >
2021-08-24 01:45:35 +00:00
< body class = 'typora-export os-windows typora-export-show-outline typora-export-collapse-outline' > < div class = 'typora-export-content' >
2021-09-28 12:50:34 +00:00
< 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" > < /u
2021-09-26 01:50:09 +00:00
< span > contains(QT_ARCH, arm) {< / span >
< span > DEFINES -= videoffmpeg< / span >
< span > }< / 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 >
2021-09-28 12:50:34 +00:00
< 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目录下的IconFont.png、Font Awesome Cheatsheet.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 > < / 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/1d7TH_GEYl5nOecuNlWJJ7g' target = '_blank' class = 'url' > https://pan.baidu.com/s/1d7TH_GEYl5nOecuNlWJJ7g< / a > < span > 提取密码: 01jf 文件名称: bin_map_tiles.zip< / span > < / li > < / ol > < p > < strong > < span > 使用说明< / span > < / strong > < / p > < ol start = '' > < li > < span > 将压缩包下的两个文件夹复制到对应可执行文件下的config文件夹下, 和map.js文件同一级目录。< / span > < / li > < li > < span > tiles文件夹是街道图, tiles_hybrid文件夹是卫星图。< / 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 >
2021-09-26 01:50:09 +00:00
< span > < / span > < img src = "snap/1-1-2.jpg" referrerpolicy = "no-referrer" >
2021-07-10 09:47:51 +00:00
< span > 系统默认开启了自动登录,可以在系统设置中将自动登录按钮关闭即可,可以在用户登录界面勾选记住密码和自动登录复选框,如果勾选了记住密码,则下次弹出的登录窗体会自动把最后一次的密码填进去,如果勾选了自动登录,则直接以上一次的用户登录到系统。< / span > < / p > < h3 id = '12-用户退出' > < span > 1.2 用户退出< / span > < / h3 > < p > < span > < / span > < img src = "snap/1-2-1.jpg" referrerpolicy = "no-referrer" >
< 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" >
< span > 主界面由左侧的设备列表、窗口信息,中间的视频监控画面,底部的画面切换和快捷操作按钮,右侧的云台控制及其他操作功能面板组成,其中左右两侧的面板可以拉伸宽度,上下面板之间也可以拉伸高度,每个带关闭按钮的面板都可以关闭。< / span > < / p > < p > < strong > < span > 新增说明< / span > < / strong >
2021-09-26 01:50:09 +00:00
< span > 2021-5-8, 主界面改成了停靠窗体模式, 拓展性更强, 可以任意组合多种子模块, 模块可停靠悬浮, 在普通模式和全屏模式都有独立的布局文件, 不同的工作模式都可对应不同的布局文件。< / span > < / p > < 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" >
< 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" >
< span > 面板和面板之间有个分隔条,鼠标移到对应分隔条的地方,会变成可拉动的鼠标指针,此时可以上下左右拉动调整宽高,调整好以后会自动保存宽高比例,下次启动后自动应用最后的配置来显示。< / span > < / p > < h3 id = '23-视频播放' > < span > 2.3 视频播放< / span > < / h3 > < p > < span > < / span > < img src = "snap/2-3-1.jpg" referrerpolicy = "no-referrer" >
< 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 > < / ol > < h3 id = '24-视频截图' > < span > 2.4 视频截图< / span > < / h3 > < p > < span > < / span > < img src = "snap/2-4-1.jpg" referrerpolicy = "no-referrer" >
< 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 > < / 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" >
< 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" >
< 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" >
< span > 视频轮询默认4画面轮询, 如果需要其他画面, 可以在系统设置中设置即可。< / span >
< span > 有两种方式可以启动视频轮询功能:< / span > < / p > < ol start = '' > < 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" >
< span > 通道交换功能很常用, 一般用户喜欢调整自己想要的通道显示到前面或者占据画面的更大部分, 比如6画面8画面的时候, 左侧有一个画面占据很大的位置, 一般这个用来显示重要性最高的实时视频, 如果需要通道交换, 则按住通道拖动到另外一个通道上面松开鼠标即可, 会立即应用, 瞬间切换, 这里切记不要移出视频画面外, 移出去表示删除。< / span > < / p > < h3 id = '210-云台控制' > < span > 2.10 云台控制< / span > < / h3 > < p > < span > < / span > < img src = "snap/2-10-1.jpg" referrerpolicy = "no-referrer" >
< 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" >
2021-07-10 09:47:51 +00:00
< 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" >
2021-09-26 01:50:09 +00:00
< 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" >
< span > 本系统中将视频显示这块都封装成了一个控件,每个视频控件都有自己独立的悬浮条,悬浮条的位置可以自行修改两三行代码调整,默认悬浮条在顶部,自动拉伸填充显示,你也可以改成左侧右侧等位置显示,高度可调。悬浮条是一排按钮组成,具体按钮什么名称标识符和功能,可以自定义,控件的封装只是默认放了一排按钮,除了关闭按钮实现了功能外,其余都是信号的形式发出去的,具体操作由程序员本身根据不同的厂家来定义不同的功能。< / span > < / p > < h3 id = '214-标签设置' > < span > 2.14 标签设置< / span > < / h3 > < p > < span > < / span > < img src = "snap/2-14-1.jpg" referrerpolicy = "no-referrer" >
2021-09-28 12:50:34 +00:00
< span > 视频控件已经将OSD标签封装好了, 默认提供两路OSD设置, 每个OSD都可以设置是否启用、位置、文字内容、文字颜色、图片、文字大小等, 这些设置都提供了友好的接口设置。< / span > < / p > < p > < span > 在frmvideopanel.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.29412px; 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 > 14< / 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-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;" > 2< / 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" 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" > 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;" > 4< / div > < / div > < pre class = " CodeMirror-line " role = "presentation" > < span role = "presentation" style = "padding-right: 0.1px;" >
2021-09-26 01:50:09 +00:00
< / 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-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 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" > 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;" > 11< / 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;" > 12< / 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" 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" > 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;" > 14< / 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: 316px;" > < / div > < div class = "CodeMirror-gutters" style = "height: 316px;" > < 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-本<> <E69CAC>
< span > 本地回放模块主要用来回放存储在本地电脑上的视频,先从右侧选择要回放的通道,默认是所有通道,然后选择类型:存储视频还是报警视频,默认选择存储视频(目前也只有存储的视频,没有报警视频,报警视频的规则还没定好,一般都是买过去自己定义),然后选择要查询的开始时间和结束时间,单击查询按钮,会自动列出来,双击对应的视频文件名称就会播放,除了查询按钮,其余按钮均没有实现具体功能。< / span > < / p > < h4 id = '312-存储规则' > < span > 3.1.2 存储规则< / span > < / h4 > < p > < span > < / span > < img src = "snap/3-1-2-1.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-1.jpg" referrerpolicy = "no-referrer" >
< span > 视频下载是将查询出来的视频文件,按照勾选了的文件保存到选择的目录中。< / span > < / p > < h3 id = '32-远程回放' > < span > 3.2 远程回放< / span > < / h3 > < p > < span > < / span > < img src = "snap/3-2-1.jpg" referrerpolicy = "no-referrer" >
< 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" >
< 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-1.jpg" referrerpolicy = "no-referrer" >
< span > 选择设备通道和时间范围,单击查询按钮,会将查询到的图片序列按照日期的形式作为一行添加到列表结果中,双击可以自动播放,可以调节播放速度。< / span > < / p > < h4 id = '342-存储规则' > < span > 3.4.2 存储规则< / span > < / h4 > < p > < span > < / span > < img src = "snap/3-4-2-1.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-1.jpg" referrerpolicy = "no-referrer" >
< span > 将勾选的图片序列文件,导出到选择的目录。< / span > < / p > < h4 id = '344-导出报告' > < span > 3.4.4 导出报告< / span > < / h4 > < p > < span > < / span > < img src = "snap/3-4-4-1.jpg" referrerpolicy = "no-referrer" >
< span > 图文混排,可以自定义信息,封装好的类,传入图片队列,图片自适应等比例缩放显示,超过自动分页。< / span > < / p > < h3 id = '35-视频上传' > < span > 3.5 视频上传< / span > < / h3 > < p > < span > < / span > < img src = "snap/3-5-1.jpg" referrerpolicy = "no-referrer" >
< 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<EFBFBD> <EFBFBD>
< 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" >
< span > 在摄像机管理的界面,可以添加经纬度信息,这样就可以在地图上显示对应的摄像机点位信息,如果发现位置不对,可以在右侧先选择摄像机设备,然后鼠标单击新的位置,右侧目标经度、目标纬度信息会自动更新,然后再单击更新经纬度值则会更新当前下拉选择的设备的经纬度信息,也可以在摄像机管理界面手动填入进行修改。< / span >
< 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 > < 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 > < p > < span > < / span > < img src = "snap/4-5-1.jpg" referrerpolicy = "no-referrer" > < span > < / span > < img src = "snap/4-5-2.jpg" referrerpolicy = "no-referrer" > < span > < / span > < img src = "snap/4-5-3.jpg" referrerpolicy = "no-referrer" > < span > < / span > < img src = "snap/4-5-4.jpg" referrerpolicy = "no-referrer" > < / p > < 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" >
2021-07-10 09:47:51 +00:00
< span > 本地日志存放的是本系统的操作日志,比如用户登录退出、记录删除、设备报警等操作,都会有对应的记录存放的数据库,可以在这里选择时间段和日志类型进行查询。查询后的日志记录可以翻页查看,还可以直接支持指定页码跳转,(此翻页组件超级牛逼,外观和功能分离,自动计算页码切换导航,具体可参见对应类的头文件功能描述),每页显示多少条记录在系统设置中可以设置。< / span > < / p > < h4 id = '511-查询记录' > < span > 5.1.1 查询记录< / span > < / h4 > < p > < span > 可以按照多条件进行查询记录,比如选择设备通道,选择日志的类型(用户操作、运行日志、设备日志、报警日志)、时间范围。< / span >
< span > 在查询记录的时候, 如果勾选了前面的复选框则表示启用该选择条件进行查询, 没有勾选, 就算后面选择了类型等, 也是按照where 1=1 条件查询的。< / span >
< span > 查询后的记录会自动分页显示,而不是一次性显示,可以单击底部的翻页按钮进行翻页查看记录,可以快速切换到第一页、末一页、上一页、下一页、显示的页码切换、指定的页码切换。< / span > < / p > < h4 id = '512-打印记录' > < span > 5.1.2 打印记录< / span > < / h4 > < p > < span > < / span > < img src = "snap/5-1-2-1.jpg" referrerpolicy = "no-referrer" >
2021-09-26 01:50:09 +00:00
< span > 单击打印按钮,会将当前查询的记录打印出来,自动分页。打印前会弹出打印预览对话框,可以最后在这里调整边距、纸张等设置参数。< / span > < / p > < h4 id = '513-导出记录到xls' > < span > 5.1.3 导出记录到xls< / span > < / h4 > < p > < span > < / span > < img src = "snap/5-1-3-1.jpg" referrerpolicy = "no-referrer" >
< 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-1.jpg" referrerpolicy = "no-referrer" > < / p > < h4 id = '515-删除记录' > < span > 5.1.5 删除记录< / span > < / h4 > < p > < span > < / span > < img src = "snap/5-1-5-1.jpg" referrerpolicy = "no-referrer" >
< span > 单击删除按钮,会弹出时间范围选择对话框,选择要删除的记录的开始时间和结束时间,单击确定,会将该时间段内的记录全部删除,结束时间必须大于开始时间。< / span > < / p > < h4 id = '516-清空记录' > < span > 5.1.6 清空记录< / span > < / h4 > < p > < span > < / span > < img src = "snap/5-1-6-1.jpg" referrerpolicy = "no-referrer" > < span > < / span > < img src = "snap/5-1-6-2.jpg" referrerpolicy = "no-referrer" >
< span > 单击清空按钮会先弹出询问框提示是否需要清空数据,单击确定则自动清空所有的记录,清空后不能恢复。< / span > < / p > < h3 id = '52-设备日志' > < span > 5.2 设备日志< / span > < / h3 > < p > < span > < / span > < img src = "snap/5-2-1.jpg" referrerpolicy = "no-referrer" >
< span > 设备日志是指直接通过sdk协议, 远程从NVR设备上拉取日志记录到本地显示, 其余功能和本地日志一致, 此功能未实现。< / span > < / p > < h2 id = '6-系统设置' > < span > 6 系统设置< / span > < / h2 > < h3 id = '61-系统设置' > < span > 6.1 系统设置< / span > < / h3 > < p > < span > 系统设置主界面如下图:< / span >
< span > < / span > < img src = "snap/6-1-1.jpg" referrerpolicy = "no-referrer" > < / p > < h4 id = '611-基本设置' > < span > 6.1.1 基本设置< / span > < / h4 > < p > < span > < / span > < img src = "snap/6-1-1-1.jpg" referrerpolicy = "no-referrer" >
2021-07-10 09:47:51 +00:00
< span > 基本设置中有部分参数的切换会自动重启应用。< / span >
< 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 > 全屏模式:开启以后,最大化显示自动全屏显示而不是最大化显示,默认关闭。< / span > < / li > < li > < span > 全屏适应: 开启了以后会自动采用上移一个像素的办法解决opengl的BUG。< / span > < / li > < li > < span > 软件图标: 自动从logo文件夹读取, 可以自行选择对应的logo文件。< / span > < / li > < li > < span > 界面样式: 系统自带17套皮肤, 可以在这里自动换肤, 默认视频黑。< / span > < / li > < li > < span > 工作模式:默认视频监控,可选机器人监控、无人机监控等。< / 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-1.jpg" referrerpolicy = "no-referrer" >
< 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-1.jpg" referrerpolicy = "no-referrer" >
2021-08-24 01:45:35 +00:00
< 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" > < 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.29412px; 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 > 11< / 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;"
2021-07-10 09:47:51 +00:00
< 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-1.jpg" referrerpolicy = "no-referrer" >
< strong > < span > 参数说明< / span > < / strong >
< span > 勾选则表示启用,可以对各种分屏进行功能激活,需要重启应用,没有勾选的,不会显示对应的菜单切换和分屏快捷按钮。多个子界面模块也可以选择显示或者隐藏,以便将不需要的模块隐藏掉,碍眼。< / span > < / p > < h4 id = '616-颜色配置' > < span > 6.1.6 颜色配置< / span > < / h4 > < p > < span > < / span > < img src = "snap/6-1-6-1.jpg" referrerpolicy = "no-referrer" >
< strong > < span > 参数说明< / span > < / strong >
< span > 可以设置不同的场景不同的颜色,比如正常的系统消息显示白色,异常消息红色。< / span > < / p > < h4 id = '617-串口配置' > < span > 6.1.7 串口配置< / span > < / h4 > < p > < span > < / span > < img src = "snap/6-1-7-1.jpg" referrerpolicy = "no-referrer" >
< strong > < span > 参数说明< / span > < / strong >
< span > 系统中可能用到了多个串口通信,可以在这里选择对应的串口号和波特率。< / span > < / p > < h4 id = '618-网络配置' > < span > 6.1.8 网络配置< / span > < / h4 > < p > < span > < / span > < img src = "snap/6-1-8-1.jpg" referrerpolicy = "no-referrer" >
< strong > < span > 参数说明< / span > < / strong >
2021-09-26 01:50:09 +00:00
< span > 系统中可能用到多种网络通信, 比如软件主动连接服务器, 需要填写TCP地址和端口, 也可能软件作为服务端, 填写TCP或者UDP监听端口。< / span > < / p > < h3 id = '62-录像机管理' > < span > 6.2 录像机管理< / span > < / h3 > < p > < span > < / span > < img src = "snap/6-2-1.jpg" referrerpolicy = "no-referrer" >
< 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 >
< span > < / span > < / p > < h4 id = '626-录像机信息打印' > < span > 6.2.6 录像机信息打印< / span > < / h4 > < p > < span > 单击打印按钮可以将表格中的内容打印出来,打印前会弹出打印预览界面,可以自行做边距的调整等,可以查看等待打印的内容,翻页切换。< / span > < / p > < h4 id = '627-导出到excel' > < span > 6.2.7 导出到Excel< / span > < / h4 > < p > < span > < / span > < img src = "snap/6-2-7-1.jpg" referrerpolicy = "no-referrer" >
< span > < / span > < img src = "snap/6-2-7-2.jpg" referrerpolicy = "no-referrer" >
< 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" >
< 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 > < / p > < h4 id = '637-导出到excel' > < span > 6.3.7 导出到Excel< / span > < / h4 > < p > < span > < / span > < img src = "snap/6-3-7-1.jpg" referrerpolicy = "no-referrer" >
< span > < / span > < img src = "snap/6-3-7-2.jpg" referrerpolicy = "no-referrer" >
< span > 单击导出按钮可以将表格中的内容导出到excel表格, 独创的excel导出数据算法, 极速导出, 支持任意系统, 无依赖。< / span > < / p > < h4 id = '638-设备搜索' > < span > 6.3.8 设备搜索< / span > < / h4 > < p > < span > < / span > < img src = "snap/6-3-8-1.jpg" referrerpolicy = "no-referrer" >
< span > < / span > < img src = "snap/6-3-8-2.jpg" referrerpolicy = "no-referrer" >
< 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 > < span > < / span > < img src = "snap/6-3-8-3.jpg" referrerpolicy = "no-referrer" >
< 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" >
2021-07-10 09:47:51 +00:00
< span > 轮询点管理界面,上侧是轮询点信息表,可以直接添加、删除、修改、清空轮询点信息,下侧是摄像机信息表,会自动加载,当摄像机信息变动后,这里会自动加载最新的数据。右下角是批量生成轮询点和轮询分组管理。< / span > < / p > < h4 id = '641-轮询点添加' > < span > 6.4.1 轮询点添加< / span > < / h4 > < p > < span > 轮询点的添加有三种方式:手动添加、单个添加、批量添加。允许重复添加,没有过滤机制。< / span > < / 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-1.jpg" referrerpolicy = "no-referrer" >
< 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-1.jpg" referrerpolicy = "no-referrer" > < span > < / span > < img src = "snap/6-4-9-2.jpg" referrerpolicy = "no-referrer" > < span > < / span > < img src = "snap/6-4-9-3.jpg" referrerpolicy = "no-referrer" >
< span > 轮询表信息可以通过已添加的摄像机信息表选中添加,也可以自定义规则批量生成视频流地址添加,这种应用场景非常多,比如现场是某一种品牌的摄像机,视频流格式固定,只需要设置好主码流子码流的视频流格式,便可批量生成。< / span >
< 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-1.jpg" referrerpolicy = "no-referrer" >
< strong > < span > 参数说明< / span > < / strong >
2021-09-26 01:50:09 +00:00
< span > 可添加、删除、修改、清空轮询分组名称,相当于轮询预案。< / span > < / p > < h3 id = '65-用户管理' > < span > 6.5 用户管理< / span > < / h3 > < p > < span > < / span > < img src = "snap/6-5-1.jpg" referrerpolicy = "no-referrer" >
< 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-1.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-1.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" >
< span > 假设设置了用户没有退出系统和电子地图的权限,则关闭系统的时候会弹出错误信息提示当前用户没有权限。< / 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 >
2021-07-10 09:47:51 +00:00
< 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 > < 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 >
2021-09-26 01:50:09 +00:00
< 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-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地址发送对应的
2021-07-10 09:47:51 +00:00
< 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" >
< span > 窗口信息负责显示一些打印信息,比如串口是否打开成功,摄像机是否异常,各种报警日志等,可以在系统设置中设置不同的文字颜色,窗口信息的信息条数自动计算应用,保证最大可能的适应高度。< / span > < / p > < h3 id = '93-图文警情' > < span > 9.3 图文警情< / span > < / h3 > < p > < span > < / span > < img src = "snap/9-3-1.jpg" referrerpolicy = "no-referrer" >
< span > 图文警情模块负责以图文的形式显示对应的警情或者提示信息,有时间、内容、图片,双击对应图片可以放大查看具体图片,为了方便演示如何使用,在此模块增加了右键菜单,可以添加消息、删除消息、清空消息。< / span > < / p > < h3 id = '94-云台控制' > < span > 9.4 云台控制< / span > < / h3 > < p > < span > < / span > < img src = "snap/9-4-1.jpg" referrerpolicy = "no-referrer" >
< span > 云台控制模块, 可以对选中的通道的摄像机( ONVIF协议) , 进行云台控制, 可以控制球机的上下左右等各个方位的移动, 还可以调节变倍步长, 至于变焦和光圈, 目前onvif协议中没看到对应的协议支持, 没有实现。< / span >
< 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" >
< 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" >
< span > 预置位功能,只对带有预置位的球机才起作用,有云台的球机未必有预置位,要仔细查看清楚,不清楚可以询问厂家或者查阅手册,在本模块中,可以获取预置位、添加预置位、调用预置位、删除预置位、调用起始位、设置起始位、开始巡航、停止巡航等。< / span >
< span > 获取预置位以后,会将获取到的预置位集合(一般有255个甚至更多)显示到列表中, 前面是编号token, 后面是预置位的别名name, 别名可以是中文的, 可以通过添加预置位的时候设置中文的名称。添加、调用、删除预置位之前要先从预置位列表中选中一个预置位。< / span >
2021-09-26 01:50:09 +00:00
< 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" >
< span > 悬浮地图子模块,使用的百度地图,支持在线和离线,用于显示对于设备的位置,支持鼠标直接拖动和缩放。具体和飞行轨迹模块类似。< / span > < / p > < h3 id = '99-飞行轨迹' > < span > 9.9 飞行轨迹< / span > < / h3 > < p > < span > < / span > < img src = "snap/9-9-1.jpg" referrerpolicy = "no-referrer" >
< span > 专为无人机打造的模块,也可以作为机器人移动模块,通过传入一个经纬度值,实时更新设备的位置和绘制轨迹,模块已经内置了接口进行处理,支持不同设备不同的轨迹颜色(这个功能好)。< / span > < / p > < h3 id = '910-飞行监控' > < span > 9.10 飞行监控< / span > < / h3 > < p > < span > < / span > < img src = "snap/9-10-1.jpg" referrerpolicy = "no-referrer" >
2021-07-10 09:47:51 +00:00
< span > 目前放置的是6个飞行套装控件( 代码中有8个可以自行添加修改) , 默认定时器模拟数据, 可以自行传入真实的数据会自动显示值。< / span > < / p > < h3 id = '911-数据调试' > < span > 9.11 数据调试< / span > < / h3 > < p > < span > < / span > < img src = "snap/9-11-1.jpg" referrerpolicy = "no-referrer" >
< 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" >
2021-09-28 12:50:34 +00:00
< 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-4.jpg" referrerpolicy = "no-referrer" >
< span > < / span > < img src = "snap/10-0-5.jpg" referrerpolicy = "no-referrer" >
< span > < / span > < img src = "snap/10-0-7.jpg" referrerpolicy = "no-referrer" >
< span > < / span > < img src = "snap/10-0-9.jpg" referrerpolicy = "no-referrer" >
< span > < / span > < img src = "snap/10-0-11.jpg" referrerpolicy = "no-referrer" >
< span > < / span > < img src = "snap/10-0-13.jpg" referrerpolicy = "no-referrer" >
< span > < / span > < img src = "snap/10-0-15.jpg" referrerpolicy = "no-referrer" >
< span > < / span > < img src = "snap/10-0-16.jpg" referrerpolicy = "no-referrer" >
< span > < / span > < img src = "snap/10-0-17.jpg" referrerpolicy = "no-referrer" > < / p > < 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" >
2021-07-10 09:47:51 +00:00
< span > < / span > < img src = "snap/10-3-2.jpg" referrerpolicy = "no-referrer" > < / p > < h3 id = '104-linux-deepin' > < span > 10.4 linux-deepin< / span > < / h3 > < p > < span > < / span > < img src = "snap/10-4-1.jpg" referrerpolicy = "no-referrer" >
< span > < / span > < img src = "snap/10-4-2.jpg" referrerpolicy = "no-referrer" > < / p > < h3 id = '105-linux-centeros' > < span > 10.5 linux-centeros< / 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" >
< span > < / span > < img src = "snap/10-6-2.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" >
2021-09-26 01:50:09 +00:00
< span > < / span > < img src = "snap/10-7-2.jpg" referrerpolicy = "no-referrer" > < / p > < h3 id = '108-unix-mac' > < span > 10.8 unix-mac< / span > < / h3 > < p > < span > < / span > < img src = "snap/10-8-1.jpg" referrerpolicy = "no-referrer" >
2021-07-10 09:47:51 +00:00
< span > < / span > < img src = "snap/10-8-2.jpg" referrerpolicy = "no-referrer" >
< span > < / span > < img src = "snap/10-8-3.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" >
< 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" >
< 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-1.jpg" referrerpolicy = "no-referrer" >
< 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 > device< / span > < / td > < td style = 'text-align:left;' > < span > 设备通信管理,比如机器人通信、无人机通信、人工智能处理等。< / span > < / td > < / tr > < tr > < td style = 'text-align:left;' > < span > flight< / span > < / td > < td style = 'text-align:left;' > < span > 飞行套件控件集合。< / 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 > < 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 = '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个地方乱七八糟, 建议需要跨层级传递的信号都放在这里中转。比如软件退出信号, 可能多个界面需要收到退出信号进行保存和其他处理, 如果从关闭界面发出信号传递给需要的界面, 那不知道要中间层层传递
< span > 这里放的全部是个人一直持续更新完善的独创的轮子,所有的项目都公用这些轮子,用到哪个就包含哪个进来,更新只需要更新轮子代码就行。< / span >
< 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_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-模块-corecontrol' > < span > 11.3.3.1 模块-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 > 这里分门别类存放的各种功能集合的界面类, 每个类都一个ui文件、一个h头文件、一个cpp实现文件, 方便快速查找对应功能的界面, 也方便拓展增加界面。< / span >
2021-09-26 01:50:09 +00:00
< span > 不仅分文件夹存放的, 而且命名也尽量按照对应功能打头, 比如系统设置模块中的都用frmconfig打头, 外层文件夹是整齐的, 内部代码也是整齐的。< / 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 > 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 > frmconfigdb< / 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-alig
< 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" >
< 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" >
< span > 工具的名字叫ONVIF Device Manager, 可以自行搜索下载, 此工具位国际官方工具, 如果此工具搜索不到摄像机, 则说明该摄像机不是真正的onvif摄像机, 不是标准的摄像机, 目前市面上的绝大部分网络摄像机都支持onvif。< / span > < / p > < h3 id = '134-报警输入设置' > < span > 13.4 报警输入设置< / span > < / h3 > < 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 > < p > < span > < / span > < img src = "snap/13-4-1.jpg" referrerpolicy = "no-referrer" >
2021-07-10 09:47:51 +00:00
< span > < / span > < img src = "snap/13-4-1.jpg" referrerpolicy = "no-referrer" >
2021-09-26 01:50:09 +00:00
< span > < / span > < img src = "snap/13-4-1.jpg" referrerpolicy = "no-referrer" > < / p > < 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 > 打开项目: QT VS TOOLS – Open Qt Project File 选择 video_system.pro,然后等待项目加载完毕。< / span >
< span > < / span > < img src = "snap/13-5-2.jpg" referrerpolicy = "no-referrer" >
< 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" >
2021-07-10 09:47:51 +00:00
< span > 如果在数据库设置中选择了mysql数据库, 需要对mysql数据库做个设置, 就是将编码设置成utf8, 已设置可以跳过, 不然很可能数据库无法正常使用。< / span > < / p > < h3 id = '137-查看usb设备名称' > < span > 13.7 查看USB设备名称< / span > < / h3 > < p > < span > < / span > < img src = "snap/13-7-1.jpg" referrerpolicy = "no-referrer" >
2021-09-26 01:50:09 +00:00
< span > 在加载USB摄像机的时候, 需要填写对应USB设备的名称, 可以通过命令行和设备管理器查看对应的名称, 要英文的。< / span > < / p > < h3 id = '138-项目代码行数' > < span > 13.8 项目代码行数< / span > < / h3 > < p > < span > < / span > < img src = "snap/13-8-1.jpg" referrerpolicy = "no-referrer" >
< span > 整个项目源代码行数大概30W行, 其中代码13.5W行( 占比45%) , 注释12.7W行( 占比42%) , 空行3.5W行。分层设计注释详细。< / span > < / p > < h3 id = '139-编译ffmpeg' > < span > 13.9 编译ffmpeg< / span > < / h3 > < 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 > 其他常用参数 --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 > < / div > < / div >
2021-07-10 09:47:51 +00:00
< 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 >