Improved visibility observer on MJPEG streams

This commit is contained in:
Joel Collins 2020-09-22 10:08:16 +01:00
parent 292137cf09
commit ac21bb3617
6 changed files with 44 additions and 6 deletions

View file

@ -12983,6 +12983,11 @@
} }
} }
}, },
"vue-observe-visibility": {
"version": "0.4.6",
"resolved": "https://registry.npmjs.org/vue-observe-visibility/-/vue-observe-visibility-0.4.6.tgz",
"integrity": "sha512-xo0CEVdkjSjhJoDdLSvoZoQrw/H2BlzB5jrCBKGZNXN2zdZgMuZ9BKrxXDjNP2AxlcCoKc8OahI3F3r3JGLv2Q=="
},
"vue-plugin-load-script": { "vue-plugin-load-script": {
"version": "1.2.0", "version": "1.2.0",
"resolved": "https://registry.npmjs.org/vue-plugin-load-script/-/vue-plugin-load-script-1.2.0.tgz", "resolved": "https://registry.npmjs.org/vue-plugin-load-script/-/vue-plugin-load-script-1.2.0.tgz",

View file

@ -14,7 +14,8 @@
}, },
"dependencies": { "dependencies": {
"material-design-icons": "^3.0.1", "material-design-icons": "^3.0.1",
"mousetrap": "^1.6.5" "mousetrap": "^1.6.5",
"vue-observe-visibility": "^0.4.6"
}, },
"devDependencies": { "devDependencies": {
"@vue/cli-plugin-babel": "^3.12.1", "@vue/cli-plugin-babel": "^3.12.1",

View file

@ -2,9 +2,11 @@
<div <div
id="stream-display" id="stream-display"
ref="streamDisplay" ref="streamDisplay"
v-observe-visibility="visibilityChanged"
class="stream-display uk-width-1-1 uk-height-1-1 scrollTarget" class="stream-display uk-width-1-1 uk-height-1-1 scrollTarget"
> >
<img <img
v-if="isVisible"
ref="click-frame" ref="click-frame"
class="uk-align-center uk-margin-remove-bottom" class="uk-align-center uk-margin-remove-bottom"
:src="streamImgUri" :src="streamImgUri"
@ -19,7 +21,9 @@ export default {
name: "MiniStreamDisplay", name: "MiniStreamDisplay",
data: function() { data: function() {
return {}; return {
isVisible: false
};
}, },
computed: { computed: {
@ -27,7 +31,11 @@ export default {
return `${this.$store.getters.baseUri}/api/v2/streams/mjpeg`; return `${this.$store.getters.baseUri}/api/v2/streams/mjpeg`;
} }
}, },
methods: {} methods: {
visibilityChanged(isVisible) {
this.isVisible = isVisible;
}
}
}; };
</script> </script>

View file

@ -59,19 +59,25 @@
<!--Show auto calibrate if default plugin is enabled--> <!--Show auto calibrate if default plugin is enabled-->
<h3>Automatic calibration</h3> <h3>Automatic calibration</h3>
<cameraCalibrationSettings></cameraCalibrationSettings> <cameraCalibrationSettings></cameraCalibrationSettings>
<div id="mini-stream">
<miniStreamDisplay />
</div>
</div> </div>
</template> </template>
<script> <script>
import axios from "axios"; import axios from "axios";
import cameraCalibrationSettings from "./cameraCalibrationSettings.vue"; import cameraCalibrationSettings from "./cameraCalibrationSettings.vue";
import miniStreamDisplay from "../miniStreamDisplay.vue";
// Export main app // Export main app
export default { export default {
name: "CameraSettings", name: "CameraSettings",
components: { components: {
cameraCalibrationSettings cameraCalibrationSettings,
miniStreamDisplay
}, },
data: function() { data: function() {
@ -133,4 +139,13 @@ export default {
}; };
</script> </script>
<style lang="less"></style> <style lang="less">
#mini-stream {
width: 500px;
text-align: center;
margin-left: auto;
margin-right: auto;
margin-top: 50px;
border: 1px solid #555;
}
</style>

View file

@ -2,10 +2,11 @@
<div <div
id="stream-display" id="stream-display"
ref="streamDisplay" ref="streamDisplay"
v-observe-visibility="visibilityChanged"
class="stream-display uk-width-1-1 uk-height-1-1 scrollTarget" class="stream-display uk-width-1-1 uk-height-1-1 scrollTarget"
> >
<img <img
v-if="thisStreamOpen" v-if="isVisible"
ref="click-frame" ref="click-frame"
class="uk-align-center uk-margin-remove-bottom" class="uk-align-center uk-margin-remove-bottom"
:hidden="!streamEnabled" :hidden="!streamEnabled"
@ -42,6 +43,7 @@ export default {
data: function() { data: function() {
return { return {
isVisible: false,
displaySize: [0, 0], displaySize: [0, 0],
displayPosition: [0, 0], displayPosition: [0, 0],
fov: [0, 0], fov: [0, 0],
@ -119,6 +121,9 @@ export default {
}, },
methods: { methods: {
visibilityChanged(isVisible) {
this.isVisible = isVisible;
},
flashStream: function() { flashStream: function() {
// Run an animation that flashes the stream (for capture feedback) // Run an animation that flashes the stream (for capture feedback)
let element = this.$refs.streamDisplay; let element = this.$refs.streamDisplay;

View file

@ -5,6 +5,7 @@ import UIkit from "uikit";
import VueTour from "vue-tour"; import VueTour from "vue-tour";
import LoadScript from "vue-plugin-load-script"; import LoadScript from "vue-plugin-load-script";
import VueFriendlyIframe from "vue-friendly-iframe"; import VueFriendlyIframe from "vue-friendly-iframe";
import VueObserveVisibility from "vue-observe-visibility";
require("vue-tour/dist/vue-tour.css"); require("vue-tour/dist/vue-tour.css");
@ -30,6 +31,9 @@ Vue.use(VueTour);
// Use Friendly Iframe module // Use Friendly Iframe module
Vue.use(VueFriendlyIframe); Vue.use(VueFriendlyIframe);
// Use visibility observer
Vue.use(VueObserveVisibility);
Vue.config.productionTip = false; Vue.config.productionTip = false;
Vue.mixin({ Vue.mixin({