Nouveau player video du game display
This commit is contained in:
121
VApp/src/components/VideoPlayer.vue
Normal file
121
VApp/src/components/VideoPlayer.vue
Normal file
@@ -0,0 +1,121 @@
|
|||||||
|
<template>
|
||||||
|
<v-container v-show="gamehiding === false" class="player_video_div">
|
||||||
|
<video
|
||||||
|
ref="videoJsPlayer"
|
||||||
|
class="video-js player_video"
|
||||||
|
controls
|
||||||
|
></video>
|
||||||
|
</v-container>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import { ref, onMounted, onBeforeUnmount } from 'vue';
|
||||||
|
import videojs from 'video.js';
|
||||||
|
import 'video.js/dist/video-js.css';
|
||||||
|
import Mysteryland_h264 from '@/quizz/Quizz-1/festival/Mysteryland_h264.mp4';
|
||||||
|
import { subscribeToTopic } from '@/services/mqttService';
|
||||||
|
let gamehiding = ref(true);
|
||||||
|
|
||||||
|
let player = ref(null);
|
||||||
|
const videoOptions = {
|
||||||
|
autoplay: false,
|
||||||
|
controls: false,
|
||||||
|
preload: 'auto',
|
||||||
|
fluid: true,
|
||||||
|
loop: false,
|
||||||
|
volume: 0,
|
||||||
|
sources: [{ src: Mysteryland_h264, type: 'video/mp4' }],
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleMessage = (topic, message) => {
|
||||||
|
console.log(topic, message)
|
||||||
|
if (topic === "/display/media") {
|
||||||
|
switch (message) {
|
||||||
|
case "BOX_BEAT.mp4":
|
||||||
|
changeVideoSource("BOX_BEAT.mp4")
|
||||||
|
break;
|
||||||
|
case "DARK_VALLEY.mp4":
|
||||||
|
changeVideoSource("DARK_VALLEY.mp4")
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (topic === "/display/control") {
|
||||||
|
switch (message) {
|
||||||
|
case "play":
|
||||||
|
gamehiding.value = false;
|
||||||
|
console.log("▶️ Lecture de la vidéo !");
|
||||||
|
player.value.play().catch((error) => {
|
||||||
|
console.error("Erreur de lecture :", error);
|
||||||
|
});
|
||||||
|
break;
|
||||||
|
case "pause":
|
||||||
|
gamehiding.value = true;
|
||||||
|
console.log("⏸️ Pause de la vidéo !");
|
||||||
|
player.value.pause();
|
||||||
|
break;
|
||||||
|
case "hide":
|
||||||
|
console.log("🛑 Cacher la vidéo (implémentation à venir)");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
const changeVideoSource = (relativePath) => {
|
||||||
|
try {
|
||||||
|
const fullPath = new URL(`../quizz/Quizz-1/festival/${relativePath}`, import.meta.url).href;
|
||||||
|
|
||||||
|
if (player.value) {
|
||||||
|
if (relativePath.includes("mp4")){
|
||||||
|
player.value.src({ src: fullPath, type: 'video/mp4' });
|
||||||
|
}
|
||||||
|
if (relativePath.includes(".jpg")){
|
||||||
|
player.value.src({ src: fullPath, type: 'image/jpeg' });
|
||||||
|
}
|
||||||
|
player.value.load();
|
||||||
|
player.value.play().catch((err) => console.error('Erreur lecture :', err));
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error('❌ Erreur lors du chargement de la vidéo :', error);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// --- Lifecycle
|
||||||
|
onMounted(() => {
|
||||||
|
player.value = videojs(
|
||||||
|
document.querySelector('.video-js'),
|
||||||
|
videoOptions,
|
||||||
|
() => {
|
||||||
|
console.log('🎥 Video player ready');
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
subscribeToTopic('#', (topic, message) => {
|
||||||
|
handleMessage(topic, message);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
onBeforeUnmount(() => {
|
||||||
|
if (player) {
|
||||||
|
player.dispose();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
.player_video_div {
|
||||||
|
margin-top: 40px;
|
||||||
|
width: calc(100vw - 20%);
|
||||||
|
height: calc(100vh - 20%);
|
||||||
|
border-radius: 20px !important;
|
||||||
|
}
|
||||||
|
.player_video {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
max-width: 100vw;
|
||||||
|
max-height: 100vh;
|
||||||
|
border-radius: 25px !important;
|
||||||
|
}
|
||||||
|
.vjs-tech{
|
||||||
|
border-radius: 25px;
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
Reference in New Issue
Block a user