feature: add UV4L-MJPEG webcam support
Signed-off-by: Stefan Dej <meteyou@gmail.com>
This commit is contained in:
parent
76727a82dc
commit
97c06c3061
@ -151,7 +151,7 @@
|
|||||||
</v-row>
|
</v-row>
|
||||||
</v-col>
|
</v-col>
|
||||||
<v-col class="col-12 col-sm-6 text-center" align-self="center">
|
<v-col class="col-12 col-sm-6 text-center" align-self="center">
|
||||||
<vue-load-image v-if="['mjpegstreamer', 'mjpegstreamer-adaptive'].includes(dialog.service)">
|
<vue-load-image v-if="['mjpegstreamer', 'mjpegstreamer-adaptive', 'uv4l-mjpeg'].includes(dialog.service)">
|
||||||
<img slot="image" :src="dialog.url" alt="Preview" :style="webcamStyle" class="webcamImage" />
|
<img slot="image" :src="dialog.url" alt="Preview" :style="webcamStyle" class="webcamImage" />
|
||||||
<v-progress-circular slot="preloader" indeterminate color="primary"></v-progress-circular>
|
<v-progress-circular slot="preloader" indeterminate color="primary"></v-progress-circular>
|
||||||
<template slot="error">
|
<template slot="error">
|
||||||
@ -231,6 +231,7 @@ export default {
|
|||||||
serviceItems: [
|
serviceItems: [
|
||||||
{ value: "mjpegstreamer", text: this.$t("Settings.WebcamPanel.Mjpegstreamer")},
|
{ value: "mjpegstreamer", text: this.$t("Settings.WebcamPanel.Mjpegstreamer")},
|
||||||
{ value: "mjpegstreamer-adaptive", text: this.$t("Settings.WebcamPanel.MjpegstreamerAdaptive") },
|
{ value: "mjpegstreamer-adaptive", text: this.$t("Settings.WebcamPanel.MjpegstreamerAdaptive") },
|
||||||
|
{ value: "uv4l-mjpeg", text: this.$t("Settings.WebcamPanel.Uv4lMjpeg") },
|
||||||
{ value: "ipstream", text: this.$t("Settings.WebcamPanel.Ipstream") },
|
{ value: "ipstream", text: this.$t("Settings.WebcamPanel.Ipstream") },
|
||||||
],
|
],
|
||||||
};
|
};
|
||||||
|
@ -55,6 +55,9 @@
|
|||||||
<template v-else-if="'service' in this.currentCam && this.currentCam.service === 'mjpegstreamer-adaptive'">
|
<template v-else-if="'service' in this.currentCam && this.currentCam.service === 'mjpegstreamer-adaptive'">
|
||||||
<webcam-mjpegstreamer-adaptive :cam-settings="this.currentCam"></webcam-mjpegstreamer-adaptive>
|
<webcam-mjpegstreamer-adaptive :cam-settings="this.currentCam"></webcam-mjpegstreamer-adaptive>
|
||||||
</template>
|
</template>
|
||||||
|
<template v-else-if="'service' in this.currentCam && this.currentCam.service === 'uv4l-mjpeg'">
|
||||||
|
<webcam-uv4l-mjpeg :cam-settings="this.currentCam"></webcam-uv4l-mjpeg>
|
||||||
|
</template>
|
||||||
<template v-else-if="'service' in this.currentCam && this.currentCam.service === 'ipstream'">
|
<template v-else-if="'service' in this.currentCam && this.currentCam.service === 'ipstream'">
|
||||||
<webcam-ipstreamer :cam-settings="this.currentCam"></webcam-ipstreamer>
|
<webcam-ipstreamer :cam-settings="this.currentCam"></webcam-ipstreamer>
|
||||||
</template>
|
</template>
|
||||||
@ -71,6 +74,7 @@
|
|||||||
import Mjpegstreamer from "@/components/webcams/Mjpegstreamer"
|
import Mjpegstreamer from "@/components/webcams/Mjpegstreamer"
|
||||||
import MjpegstreamerAdaptive from "@/components/webcams/MjpegstreamerAdaptive"
|
import MjpegstreamerAdaptive from "@/components/webcams/MjpegstreamerAdaptive"
|
||||||
import Ipstreamer from "@/components/webcams/Ipstreamer"
|
import Ipstreamer from "@/components/webcams/Ipstreamer"
|
||||||
|
import Uv4lMjpeg from "@/components/webcams/Uv4lMjpeg"
|
||||||
import WebcamGrid from "@/components/webcams/WebcamGrid"
|
import WebcamGrid from "@/components/webcams/WebcamGrid"
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
@ -78,6 +82,7 @@
|
|||||||
'webcam-mjpegstreamer': Mjpegstreamer,
|
'webcam-mjpegstreamer': Mjpegstreamer,
|
||||||
'webcam-mjpegstreamer-adaptive': MjpegstreamerAdaptive,
|
'webcam-mjpegstreamer-adaptive': MjpegstreamerAdaptive,
|
||||||
'webcam-ipstreamer': Ipstreamer,
|
'webcam-ipstreamer': Ipstreamer,
|
||||||
|
'webcam-uv4l-mjpeg': Uv4lMjpeg,
|
||||||
'webcam-grid': WebcamGrid,
|
'webcam-grid': WebcamGrid,
|
||||||
},
|
},
|
||||||
data: function() {
|
data: function() {
|
||||||
@ -109,8 +114,8 @@
|
|||||||
icon: "mdi-view-grid",
|
icon: "mdi-view-grid",
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
const currentCam = this.webcams.find(webcam => webcam.name === this.currentCamName)
|
const currentCam = this.webcams.findIndex(webcam => webcam.name === this.currentCamName)
|
||||||
if (currentCam) return currentCam
|
if (currentCam !== -1) return this.webcams[currentCam]
|
||||||
}
|
}
|
||||||
|
|
||||||
return {}
|
return {}
|
||||||
|
66
src/components/webcams/Uv4lMjpeg.vue
Normal file
66
src/components/webcams/Uv4lMjpeg.vue
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
<style>
|
||||||
|
.webcamImage {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<vue-load-image v-observe-visibility="visibilityChanged">
|
||||||
|
<img slot="image" :src="url" alt="Preview" :style="webcamStyle" class="webcamImage" />
|
||||||
|
<div slot="preloader" class="text-center py-5">
|
||||||
|
<v-progress-circular indeterminate color="primary"></v-progress-circular>
|
||||||
|
</div>
|
||||||
|
<div slot="error" class="text-center py-5">
|
||||||
|
<v-icon x-large>mdi-webcam-off</v-icon>
|
||||||
|
<div class="subtitle-1 mt-2">{{ $t('Settings.WebcamPanel.UrlNotAvailable') }}</div>
|
||||||
|
</div>
|
||||||
|
</vue-load-image>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import VueLoadImage from "vue-load-image"
|
||||||
|
|
||||||
|
export default {
|
||||||
|
components: {
|
||||||
|
'vue-load-image': VueLoadImage
|
||||||
|
},
|
||||||
|
data: function() {
|
||||||
|
return {
|
||||||
|
isVisible: true,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
props: {
|
||||||
|
camSettings: Object,
|
||||||
|
printerUrl: {
|
||||||
|
type: String,
|
||||||
|
default: null
|
||||||
|
}
|
||||||
|
},
|
||||||
|
created: function () {
|
||||||
|
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
url() {
|
||||||
|
const baseUrl = this.camSettings.url
|
||||||
|
const hostUrl = new URL(this.printerUrl === null ? document.URL : this.printerUrl)
|
||||||
|
|
||||||
|
const url = new URL(baseUrl, hostUrl.origin)
|
||||||
|
|
||||||
|
return decodeURIComponent(url.toString())
|
||||||
|
},
|
||||||
|
webcamStyle() {
|
||||||
|
let transforms = ""
|
||||||
|
if ('flipX' in this.camSettings && this.camSettings.flipX) transforms += " scaleX(-1)"
|
||||||
|
if ('flipX' in this.camSettings && this.camSettings.flipY) transforms += " scaleY(-1)"
|
||||||
|
if (transforms.trimLeft().length) return { transform: transforms.trimLeft() }
|
||||||
|
|
||||||
|
return ""
|
||||||
|
},
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
visibilityChanged(isVisible) {
|
||||||
|
this.isVisible = isVisible
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
@ -16,6 +16,9 @@
|
|||||||
<template v-else-if="'service' in webcam && webcam.service === 'mjpegstreamer-adaptive'">
|
<template v-else-if="'service' in webcam && webcam.service === 'mjpegstreamer-adaptive'">
|
||||||
<webcam-mjpegstreamer-adaptive :cam-settings="webcam"></webcam-mjpegstreamer-adaptive>
|
<webcam-mjpegstreamer-adaptive :cam-settings="webcam"></webcam-mjpegstreamer-adaptive>
|
||||||
</template>
|
</template>
|
||||||
|
<template v-else-if="'service' in webcam && webcam.service === 'uv4l-mjpeg'">
|
||||||
|
<webcam-uv4l-mjpeg :cam-settings="webcam"></webcam-uv4l-mjpeg>
|
||||||
|
</template>
|
||||||
<template v-else-if="'service' in webcam && webcam.service === 'ipstream'">
|
<template v-else-if="'service' in webcam && webcam.service === 'ipstream'">
|
||||||
<webcam-ipstreamer :cam-settings="webcam"></webcam-ipstreamer>
|
<webcam-ipstreamer :cam-settings="webcam"></webcam-ipstreamer>
|
||||||
</template>
|
</template>
|
||||||
@ -30,6 +33,7 @@
|
|||||||
<script>
|
<script>
|
||||||
import Mjpegstreamer from "@/components/webcams/Mjpegstreamer"
|
import Mjpegstreamer from "@/components/webcams/Mjpegstreamer"
|
||||||
import MjpegstreamerAdaptive from "@/components/webcams/MjpegstreamerAdaptive"
|
import MjpegstreamerAdaptive from "@/components/webcams/MjpegstreamerAdaptive"
|
||||||
|
import Uv4lMjpeg from "@/components/webcams/Uv4lMjpeg"
|
||||||
import Ipstreamer from "@/components/webcams/Ipstreamer"
|
import Ipstreamer from "@/components/webcams/Ipstreamer"
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
@ -41,6 +45,7 @@
|
|||||||
components: {
|
components: {
|
||||||
'webcam-mjpegstreamer': Mjpegstreamer,
|
'webcam-mjpegstreamer': Mjpegstreamer,
|
||||||
'webcam-mjpegstreamer-adaptive': MjpegstreamerAdaptive,
|
'webcam-mjpegstreamer-adaptive': MjpegstreamerAdaptive,
|
||||||
|
'webcam-uv4l-mjpeg': Uv4lMjpeg,
|
||||||
'webcam-ipstreamer': Ipstreamer,
|
'webcam-ipstreamer': Ipstreamer,
|
||||||
},
|
},
|
||||||
props: {
|
props: {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user