워터마크에 대한 요구조건이 있었다.
1. videoJS에 워터마크 넣어주세요.
2. 워터마크는 아래 그림처럼 9군데 중 하나를 백오피스에서 설정하면 그 위치에 고정돼야 해요. (원래는 5군데였는데 또 바꿈)
3. 반응형이 되도록 항상 그 위치에 있게 해주세요.(이것도 바뀐 요구사항 ㅎ)
player.dynamicWatermark({
elementId: "unique_id",
watermarkText: `${userId}`,
changeDuration: 1000000,
cssText:
"display: inline-block; color: grey; background-color: transparent; font-size: 1rem;
z-index: 9999; position: absolute;
@media only screen and (max-width: 992px){ color: red; }", //이게 안됨
});
const videoHeight = player.currentHeight();
const videoWidth = player.currentWidth();
setInterval(() => {
if (player.currentDimension("width") <= 800) {
player.dynamicWatermark({
elementId: "unique_id",
watermarkText: `${userId}`,
changeDuration: 1000000, // time interval to change watermark position
cssText:
"display: inline-block; color: red; background-color: transparent; font-size: 1rem; z-index: 9999; position: absolute; @media only screen and (max-width: 992px){ color: red; }",
});
} else {
player.dynamicWatermark({
elementId: "unique_id",
watermarkText: `${userId}`,
changeDuration: 1000000, // time interval to change watermark position
cssText:
"display: inline-block; color: grey; background-color: transparent; font-size: 1rem; z-index: 9999; position: absolute; @media only screen and (max-width: 992px){ color: red; }",
});
}
}, 5000);
import videojs, { VideoJsPlayer } from "video.js";
var window = require("global/window");
function _interopDefaultLegacy(e: any) {
return e && typeof e === "object" && "default" in e ? e : { default: e };
}
const WatermarkLocationName = {
TOP_LEFT: "TOP_LEFT",
TOP_CENTER: "TOP_CENTER",
TOP_RIGHT: "TOP_RIGHT",
MID_LEFT: "MID_LEFT",
MID_CENTER: "MID_CENTER",
MID_RIGHT: "MID_RIGHT",
BOTTOM_LEFT: "BOTTOM_LEFT",
BOTTOM_CENTER: "BOTTOM_CENTER",
BOTTOM_RIGHT: "BOTTOM_RIGHT",
};
const videojs__default = /*#__PURE__*/ _interopDefaultLegacy(videojs);
const window__default = /*#__PURE__*/ _interopDefaultLegacy(window);
const dom = videojs__default["default"].dom || videojs__default["default"];
const playerCustomWatermark = (
player: VideoJsPlayer,
userId: string,
watermarkLocation: string
) => {
//워터마크 div 생성
function createWatermarkElement() {
const el = dom.createEl(
"div",
{},
{
id: userId,
}
);
applyCssStyles(el);
return el;
}
//CSS 추가
function applyCssStyles(el: HTMLDivElement) {
el.innerHTML = userId;
el.style.cssText =
"display: inline-block; color: grey; background-color: transparent; font-size: 1rem; z-index: 9999; position: absolute;";
}
//워터마크 위치
function setWatermarkLocation() {
let watermarkElement =
window__default["default"].document.getElementById(userId);
if (!watermarkElement) {
watermarkElement = createWatermarkElement();
player.el().appendChild(watermarkElement);
}
switch (true) {
case watermarkLocation === WatermarkLocationName.TOP_LEFT:
watermarkElement.style.top = "10%";
watermarkElement.style.left = "10%";
break;
case watermarkLocation === WatermarkLocationName.TOP_CENTER:
watermarkElement.style.top = "10%";
watermarkElement.style.left = "50%";
watermarkElement.style.right = "50%";
break;
case watermarkLocation === WatermarkLocationName.TOP_RIGHT:
// watermarkElement.style.fontSize = "12px";
watermarkElement.style.top = "10%";
watermarkElement.style.right = "10%";
break;
case watermarkLocation === WatermarkLocationName.MID_LEFT:
watermarkElement.style.top = "50%";
watermarkElement.style.left = "10%";
break;
case watermarkLocation === WatermarkLocationName.MID_CENTER:
watermarkElement.style.top = "50%";
watermarkElement.style.left = "50%";
watermarkElement.style.right = "50%";
break;
case watermarkLocation === WatermarkLocationName.MID_RIGHT:
watermarkElement.style.top = "50%";
watermarkElement.style.right = "10%";
break;
case watermarkLocation === WatermarkLocationName.BOTTOM_LEFT:
watermarkElement.style.bottom = "10%";
watermarkElement.style.left = "10%";
break;
case watermarkLocation === WatermarkLocationName.BOTTOM_CENTER:
watermarkElement.style.bottom = "10%";
watermarkElement.style.left = "50%";
watermarkElement.style.right = "50%";
break;
case watermarkLocation === WatermarkLocationName.BOTTOM_RIGHT:
watermarkElement.style.bottom = "10%";
watermarkElement.style.right = "10%";
break;
default:
break;
}
}
return setWatermarkLocation();
};
export default playerCustomWatermark;
import videojs, { VideoJsPlayer } from "video.js";
var window = require("global/window");
function _interopDefaultLegacy(e: any) {
return e && typeof e === "object" && "default" in e ? e : { default: e };
}
const WatermarkLocationName = {
TOP_LEFT: "TOP_LEFT",
TOP_CENTER: "TOP_CENTER",
TOP_RIGHT: "TOP_RIGHT",
MID_LEFT: "MID_LEFT",
MID_CENTER: "MID_CENTER",
MID_RIGHT: "MID_RIGHT",
BOTTOM_LEFT: "BOTTOM_LEFT",
BOTTOM_CENTER: "BOTTOM_CENTER",
BOTTOM_RIGHT: "BOTTOM_RIGHT",
};
const locationStyles = {
[WatermarkLocationName.TOP_LEFT]: { top: "10%", left: "10%" },
[WatermarkLocationName.TOP_CENTER]: {
top: "10%",
left: "50%",
right: "50%",
},
[WatermarkLocationName.TOP_RIGHT]: { top: "10%", right: "10%" },
[WatermarkLocationName.MID_LEFT]: { top: "50%", left: "10%" },
[WatermarkLocationName.MID_CENTER]: {
top: "50%",
left: "50%",
right: "50%",
},
[WatermarkLocationName.MID_RIGHT]: { top: "50%", right: "10%" },
[WatermarkLocationName.BOTTOM_LEFT]: { bottom: "10%", left: "10%" },
[WatermarkLocationName.BOTTOM_CENTER]: {
bottom: "10%",
left: "50%",
right: "50%",
},
[WatermarkLocationName.BOTTOM_RIGHT]: { bottom: "10%", right: "10%" },
};
const videojs__default = /*#__PURE__*/ _interopDefaultLegacy(videojs);
const window__default = /*#__PURE__*/ _interopDefaultLegacy(window);
const dom = videojs__default["default"].dom || videojs__default["default"];
const playerCustomWatermark = (
player: VideoJsPlayer,
userId: string,
watermarkLocation: string
) => {
//워터마크 div 생성
function createWatermarkElement() {
const el = dom.createEl(
"div",
{},
{
id: userId,
}
);
applyCssStyles(el);
return el;
}
//CSS 추가
function applyCssStyles(el: HTMLDivElement) {
el.innerHTML = userId;
el.style.cssText =
"display: inline-block; color: grey; background-color: transparent; font-size: 1rem; z-index: 9999; position: absolute;";
}
//워터마크 위치
function setWatermarkLocation() {
let watermarkElement =
window__default["default"].document.getElementById(userId);
if (!watermarkElement) {
watermarkElement = createWatermarkElement();
player.el().appendChild(watermarkElement);
}
const style = locationStyles[watermarkLocation];
if (style) {
Object.assign(watermarkElement.style, style);
}
}
return setWatermarkLocation();
};
export default playerCustomWatermark;
워터마크가 모바일 풀스크린 세로일 때 비디오 안에 들어가지 않는다.
풀스크린
세로일 때
→ VodPlayerWrapper에서 가로 세로를 감지하는 함수를 작성한 후, 변화된 값을 전달한다면?
워터마크가 IOS
풀스크린 세로일 때 비디오 안에 들어가지 않는다.
import { useState, useEffect, MutableRefObject, useRef } from "react";
import { useRecoilValue } from "recoil";
import videojs, { VideoJsPlayer } from "video.js";
import { fullscreenValue } from "../../../../shared/atoms";
var window = require("global/window");
function _interopDefaultLegacy(e: any) {
return e && typeof e === "object" && "default" in e ? e : { default: e };
}
const WatermarkLocationName = {
TOP_LEFT: "TOP_LEFT",
TOP_CENTER: "TOP_CENTER",
TOP_RIGHT: "TOP_RIGHT",
MID_LEFT: "MID_LEFT",
MID_CENTER: "MID_CENTER",
MID_RIGHT: "MID_RIGHT",
BOTTOM_LEFT: "BOTTOM_LEFT",
BOTTOM_CENTER: "BOTTOM_CENTER",
BOTTOM_RIGHT: "BOTTOM_RIGHT",
};
//기본 위치 설정
const locationStyles = {
[WatermarkLocationName.TOP_LEFT]: {
top: "calc(50% - 30%)",
left: "calc(20%)",
},
[WatermarkLocationName.TOP_CENTER]: {
top: "calc(50% - 30%)",
left: "calc(50%)",
},
[WatermarkLocationName.TOP_RIGHT]: {
top: "calc(50% - 30%)",
left: "calc(50% + 20%)",
},
[WatermarkLocationName.MID_LEFT]: {
top: "calc(50%)",
left: "calc(20%)",
},
[WatermarkLocationName.MID_CENTER]: {
top: "calc(50%)",
left: "calc(50%)",
},
[WatermarkLocationName.MID_RIGHT]: {
top: "calc(50%)",
left: "calc(50% + 30%)",
},
[WatermarkLocationName.BOTTOM_LEFT]: {
top: "calc(50% + 30%)",
left: "calc(10%)",
},
[WatermarkLocationName.BOTTOM_CENTER]: {
top: "calc(50% + 30%)",
left: "calc(50%)",
},
[WatermarkLocationName.BOTTOM_RIGHT]: {
top: "calc(50% + 30%)",
left: "calc(50% + 30%)",
},
};
const videojs__default = /*#__PURE__*/ _interopDefaultLegacy(videojs);
const window__default = /*#__PURE__*/ _interopDefaultLegacy(window);
const dom = videojs__default["default"].dom || videojs__default["default"];
export const usePlayerCustomWatermark = (
playerRef: MutableRefObject<VideoJsPlayer | null>,
userId: string,
watermarkLocation: string
) => {
const [watermarkElement, setWatermarkElement] =
useState<HTMLDivElement | null>(null);
const isFullscreen = useRecoilValue(fullscreenValue);
const player = playerRef?.current;
useEffect(() => {
if (!player || !userId) {
return;
}
function createWatermarkElement() {
const el = dom.createEl(
"div",
{},
{
id: userId,
}
);
applyCssStyles(el);
return el;
}
//CSS 추가
function applyCssStyles(el: HTMLDivElement) {
el.innerHTML = userId;
el.style.cssText =
"display: inline-block; color: grey; background-color: transparent; font-size: 1rem; z-index: 9999; position: absolute;";
}
//워터마크 위치 업데이트
function updateWatermarkStyle() {
const watermarkElement =
window__default["default"].document.getElementById(userId);
if (!watermarkElement) {
return;
}
const windowWidth = window.innerWidth;
const windowHeight = window.innerHeight;
if (player?.isFullscreen() && windowWidth > windowHeight) {
locationStyles[WatermarkLocationName.TOP_LEFT].top = "calc(50% - 40%)";
locationStyles[WatermarkLocationName.TOP_CENTER].top =
"calc(50% - 40%)";
locationStyles[WatermarkLocationName.TOP_RIGHT].top = "calc(50% - 40%)";
} else if (player?.isFullscreen() && windowWidth < windowHeight) {
locationStyles[WatermarkLocationName.TOP_LEFT].top = "calc(50% - 10%)";
locationStyles[WatermarkLocationName.TOP_CENTER].top =
"calc(50% - 10%)";
locationStyles[WatermarkLocationName.TOP_RIGHT].top = "calc(50% - 10%)";
} else {
locationStyles[WatermarkLocationName.TOP_LEFT].top = "calc(50% - 40%)";
locationStyles[WatermarkLocationName.TOP_CENTER].top =
"calc(50% - 40%)";
locationStyles[WatermarkLocationName.TOP_RIGHT].top = "calc(50% - 40%)";
}
const style = locationStyles[watermarkLocation];
if (style) {
Object.assign(watermarkElement.style, style);
}
}
function setWatermarkLocation() {
if (!watermarkElement) {
const newWatermarkElement = createWatermarkElement();
player?.el().appendChild(newWatermarkElement);
setWatermarkElement(newWatermarkElement);
}
updateWatermarkStyle();
}
const handleResize = () => {
updateWatermarkStyle();
};
window.addEventListener("resize", handleResize);
setWatermarkLocation();
return () => {
window.removeEventListener("resize", handleResize);
if (watermarkElement) {
// player?.el().removeChild(watermarkElement);
}
};
}, [player, userId, watermarkLocation, watermarkElement, isFullscreen]);
return watermarkElement;
};