diff --git a/package-lock.json b/package-lock.json index bd8b92ca..4e98a090 100644 --- a/package-lock.json +++ b/package-lock.json @@ -27,6 +27,7 @@ "echarts": "^5.2.2", "echarts-gl": "^2.0.8", "hls.js": "^1.3.3", + "jmuxer": "^2.0.5", "js-sha256": "^0.9.0", "lodash.kebabcase": "^4.1.1", "lodash.throttle": "^4.1.1", @@ -54,6 +55,7 @@ "@intlify/vite-plugin-vue-i18n": "^2.5.0", "@mdi/js": "^7.0.0", "@types/file-saver": "^2.0.5", + "@types/jmuxer": "^2.0.3", "@types/lodash.kebabcase": "^4.1.6", "@types/lodash.throttle": "^4.1.6", "@types/semver": "^7.3.8", @@ -2800,6 +2802,15 @@ "integrity": "sha512-zv9kNf3keYegP5oThGLaPk8E081DFDuwfqjtiTzm6PoxChdJ1raSuADf2YGCVIyrSynLrgc8JWv296s7Q7pQSQ==", "dev": true }, + "node_modules/@types/jmuxer": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/jmuxer/-/jmuxer-2.0.3.tgz", + "integrity": "sha512-jRwZXuPbNRG8wTfJT7gjpZm72EaMzvN3oG7zbFWdW8+OHJmxAhLyqycTd/0GtZ/P8OjKXa1cbyKxQg6coXlERg==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/json-schema": { "version": "7.0.11", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", @@ -6778,6 +6789,11 @@ "node": ">=8" } }, + "node_modules/jmuxer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/jmuxer/-/jmuxer-2.0.5.tgz", + "integrity": "sha512-4qjXl8JS138WyCZZoOYwXq/qVrHcE0UIpt2lMtGyq2wuBSPMNSzP1K2CEWSrwAMgjZ9jD7Btc0SxMkiLIhoHsg==" + }, "node_modules/joi": { "version": "17.6.2", "resolved": "https://registry.npmjs.org/joi/-/joi-17.6.2.tgz", @@ -12032,6 +12048,15 @@ "integrity": "sha512-zv9kNf3keYegP5oThGLaPk8E081DFDuwfqjtiTzm6PoxChdJ1raSuADf2YGCVIyrSynLrgc8JWv296s7Q7pQSQ==", "dev": true }, + "@types/jmuxer": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/jmuxer/-/jmuxer-2.0.3.tgz", + "integrity": "sha512-jRwZXuPbNRG8wTfJT7gjpZm72EaMzvN3oG7zbFWdW8+OHJmxAhLyqycTd/0GtZ/P8OjKXa1cbyKxQg6coXlERg==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/json-schema": { "version": "7.0.11", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", @@ -14837,6 +14862,11 @@ } } }, + "jmuxer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/jmuxer/-/jmuxer-2.0.5.tgz", + "integrity": "sha512-4qjXl8JS138WyCZZoOYwXq/qVrHcE0UIpt2lMtGyq2wuBSPMNSzP1K2CEWSrwAMgjZ9jD7Btc0SxMkiLIhoHsg==" + }, "joi": { "version": "17.6.2", "resolved": "https://registry.npmjs.org/joi/-/joi-17.6.2.tgz", diff --git a/package.json b/package.json index 99c06e6c..f7e9fad7 100644 --- a/package.json +++ b/package.json @@ -42,6 +42,7 @@ "echarts": "^5.2.2", "echarts-gl": "^2.0.8", "hls.js": "^1.3.3", + "jmuxer": "^2.0.5", "js-sha256": "^0.9.0", "lodash.kebabcase": "^4.1.1", "lodash.throttle": "^4.1.1", @@ -69,6 +70,7 @@ "@intlify/vite-plugin-vue-i18n": "^2.5.0", "@mdi/js": "^7.0.0", "@types/file-saver": "^2.0.5", + "@types/jmuxer": "^2.0.3", "@types/lodash.kebabcase": "^4.1.6", "@types/lodash.throttle": "^4.1.6", "@types/semver": "^7.3.8", diff --git a/src/components/panels/WebcamPanel.vue b/src/components/panels/WebcamPanel.vue index e28549e2..b2f3fb5c 100644 --- a/src/components/panels/WebcamPanel.vue +++ b/src/components/panels/WebcamPanel.vue @@ -60,6 +60,9 @@ + @@ -81,6 +84,7 @@ import MjpegstreamerAdaptive from '@/components/webcams/MjpegstreamerAdaptive.vu import Hlsstreamer from '@/components/webcams/Hlsstreamer.vue' import Ipstreamer from '@/components/webcams/Ipstreamer.vue' import Uv4lMjpeg from '@/components/webcams/Uv4lMjpeg.vue' +import JMuxerStream from '@/components/webcams/JMuxerStream.vue' import WebrtcCameraStreamer from '@/components/webcams/WebrtcCameraStreamer.vue' import WebcamGrid from '@/components/webcams/WebcamGrid.vue' import Component from 'vue-class-component' @@ -99,6 +103,7 @@ import WebcamMixin from '@/components/mixins/webcam' 'webcam-ipstreamer': Ipstreamer, 'webcam-hlsstreamer': Hlsstreamer, 'webcam-uv4l-mjpeg': Uv4lMjpeg, + 'webcam-jmuxer-stream': JMuxerStream, 'webcam-webrtc-camerastreamer': WebrtcCameraStreamer, 'webcam-grid': WebcamGrid, }, diff --git a/src/components/settings/SettingsWebcamsTab.vue b/src/components/settings/SettingsWebcamsTab.vue index 3ae0eb26..d836de75 100644 --- a/src/components/settings/SettingsWebcamsTab.vue +++ b/src/components/settings/SettingsWebcamsTab.vue @@ -131,7 +131,7 @@ attach> - + + @@ -228,6 +231,7 @@ import MjpegstreamerAdaptive from '@/components/webcams/MjpegstreamerAdaptive.vu import Uv4lMjpeg from '@/components/webcams/Uv4lMjpeg.vue' import WebrtcCameraStreamer from '@/components/webcams/WebrtcCameraStreamer.vue' import Ipstreamer from '@/components/webcams/Ipstreamer.vue' +import JMuxerStream from '@/components/webcams/JMuxerStream.vue' import { mdiMenuDown, mdiDelete, mdiPencil, mdiWebcam } from '@mdi/js' import WebcamMixin from '@/components/mixins/webcam' import { FileStateFile } from '@/store/files/types' @@ -257,6 +261,7 @@ interface webcamForm { 'webcam-ipstreamer': Ipstreamer, 'webcam-webrtc-camerastreamer': WebrtcCameraStreamer, 'webcam-hlsstreamer': Hlsstreamer, + 'webcam-jmuxer-stream': JMuxerStream, }, }) export default class SettingsWebcamsTab extends Mixins(BaseMixin, WebcamMixin) { @@ -322,6 +327,7 @@ export default class SettingsWebcamsTab extends Mixins(BaseMixin, WebcamMixin) { { value: 'ipstream', text: this.$t('Settings.WebcamsTab.Ipstream') }, { value: 'webrtc-camerastreamer', text: this.$t('Settings.WebcamsTab.WebrtcCameraStreamer') }, { value: 'hlsstream', text: this.$t('Settings.WebcamsTab.Hlsstream') }, + { value: 'jmuxer-stream', text: this.$t('Settings.WebcamsTab.JMuxerStream') }, ] } diff --git a/src/components/webcams/JMuxerStream.vue b/src/components/webcams/JMuxerStream.vue new file mode 100644 index 00000000..9323ae0b --- /dev/null +++ b/src/components/webcams/JMuxerStream.vue @@ -0,0 +1,114 @@ + + + + + diff --git a/src/components/webcams/WebcamGrid.vue b/src/components/webcams/WebcamGrid.vue index 8c333abe..044436a7 100644 --- a/src/components/webcams/WebcamGrid.vue +++ b/src/components/webcams/WebcamGrid.vue @@ -22,6 +22,9 @@ + @@ -38,6 +41,7 @@ import MjpegstreamerAdaptive from '@/components/webcams/MjpegstreamerAdaptive.vu import Uv4lMjpeg from '@/components/webcams/Uv4lMjpeg.vue' import Ipstreamer from '@/components/webcams/Ipstreamer.vue' import Hlsstreamer from '@/components/webcams/Hlsstreamer.vue' +import JMuxerStream from '@/components/webcams/JMuxerStream.vue' import WebrtcCameraStreamer from '@/components/webcams/WebrtcCameraStreamer.vue' import { GuiWebcamStateWebcam } from '@/store/gui/webcams/types' @@ -48,6 +52,7 @@ import { GuiWebcamStateWebcam } from '@/store/gui/webcams/types' 'webcam-uv4l-mjpeg': Uv4lMjpeg, 'webcam-ipstreamer': Ipstreamer, 'webcam-hlsstreamer': Hlsstreamer, + 'webcam-jmuxer-stream': JMuxerStream, 'webcam-webrtc-camerastreamer': WebrtcCameraStreamer, }, }) diff --git a/src/locales/da.json b/src/locales/da.json index 50312c64..fcc163a7 100644 --- a/src/locales/da.json +++ b/src/locales/da.json @@ -1055,6 +1055,7 @@ "Hlsstream": "HLS Stream", "Mjpegstreamer": "MJPEG-Streamer", "MjpegstreamerAdaptive": "Adaptiv MJPEG-Streamer (eksperimental)", + "JMuxerStream": "Rå h264 stream (jmuxer)", "Name": "Navn", "NameAlreadyExists": "Navnet bruges allerede", "Required": "Krævet", diff --git a/src/locales/de.json b/src/locales/de.json index 13a71d41..76755026 100644 --- a/src/locales/de.json +++ b/src/locales/de.json @@ -1058,6 +1058,7 @@ "Ipstream": "IP Kamera", "Mjpegstreamer": "MJPEG-Streamer", "MjpegstreamerAdaptive": "Adaptive MJPEG-Streamer (experimental)", + "JMuxerStream": "Roher h264 stream (jmuxer)", "Name": "Name", "NameAlreadyExists": "Name existiert bereits", "Required": "benötigt", diff --git a/src/locales/en.json b/src/locales/en.json index 68b2e04c..d9067161 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -1065,6 +1065,7 @@ "Hlsstream": "HLS Stream", "Mjpegstreamer": "MJPEG-Streamer", "MjpegstreamerAdaptive": "Adaptive MJPEG-Streamer (experimental)", + "JMuxerStream": "Raw h264 stream (jmuxer)", "Name": "Name", "NameAlreadyExists": "Name already exists", "Required": "required",