- ์ค์๊ฐ ๋น๋์ค ์คํธ๋ฆฌ๋ฐ์ผ๋ก ๊ฐ์ ์ถ๋ก ์ ๊ฒฐ๊ณผ๋ฅผ ์ ์ ์์ต๋๋ค.
- ํ๋ณตํ ํ์ ์ด ์บก์ณ๋์ด ์ฌ์ง์ผ๋ก ํ์ธํ ์ ์์ต๋๋ค.
- ์ฌ์ง์ ์งง์ ๋ฉ๋ชจ๋ฅผ ์ ์ด png๋ก ์ ์ฅํ ์ ์์ต๋๋ค.
Happy Things๋ ์๋ฉด ์ธ์์ ํตํด ์ฌ๋์ ๊ฐ์ ์ ์ถ๋ก ํ์ฌ, ๊ทธ ์๊ฐ์ ์ฌ์ง์ผ๋ก ์ ๊ณตํด์ฃผ๋ ์น ์ดํ๋ฆฌ์ผ์ด์ ์ ๋๋ค. ์์ฒด ๊ฐ์ ์ถ๋ก ๋ชจ๋ธ์ ๊ฐ๋ฐํ์ฌ, ๋ชจ๋ธ์ด ํ๋ณตํ ํ์ ์ ์ค์๊ฐ์ผ๋ก ์บก์ณํ์ฌ, ์ฌ์ง์ผ๋ก ์ ๊ณตํฉ๋๋ค. ์ ๊ณต๋ฐ์ ์ฌ์ง์ ๋ค์ด๋ก๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉด์ ์ด๋ ค์ ๋ ์ฑ๋ฆฐ์ง๋ ํฌ๊ฒ 3๊ฐ์ง๊ฐ ์์์ต๋๋ค.
- ์์ฒด ๊ฐ์ ์ถ๋ก ๋ชจ๋ธ์ ์ด๋ป๊ฒ ๋ง๋ค๊ฒ์ธ๊ฐ?
- ์ค์๊ฐ ์คํธ๋ฆฌ๋ฐ ํ๊ฒฝ์์ 3๊ฐ์ง ์์ ์ ์ด๋ป๊ฒ ๋ณ๋ ฌ์ ์ผ๋ก ์คํ์ํฌ ๊ฒ์ธ๊ฐ?
- ํฌ๋ก์ค ๋ธ๋ผ์ฐ์ง์ ์ํ safari ๋ฌธ์ ํด๊ฒฐ ์ฌ์
๋จธ์ ๋ฌ๋์ ํ๊ธฐ ์ํด์๋ 3๊ฐ์ง ํฐ ๋จ๊ณ๊ฐ ์์ต๋๋ค.
- ๊ณผ๊ฑฐ ๋ฐ์ดํฐ ์์ง
- ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ
- ๋ฐ์ดํฐ๋ก ๋ชจ๋ธ์ ํ์ต
๊ฐ์ฅ ๋จผ์ ๊ฐ์ ๋ณ๋ก ๊ตฌ๋ณ๋์ด ์๋ ๊ณผ๊ฑฐ ๋ฐ์ดํฐ๋ฅผ ์์งํด์ผ ํ์ต๋๋ค. ์ผ๊ตด์ด 48x48ํฝ์
๊ทธ๋ ์ด์ค์ผ์ผ ์ด๋ฏธ์ง๋ก ๊ตฌ์ฑ๋์ด ์์ด ์๋ ๋ฐ์ดํฐ์
fer2013์ ์ด์ฉํ์ฌ ๋ฐ์ดํฐ ์์ง์ ํ์์ต๋๋ค.
.jpg๋ก ๋์ด ์๋ ๋ฐ์ดํฐ์ ์ ๋ชจ๋ธ์ ํ์ต ์ํค๊ธฐ ์ํด์๋ ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ๊ฐ ํ์ํ์ต๋๋ค. ์ด๋ฏธ์ง ์ผ๊ตด ์ธ์์ ํตํด ์๋ฉด ๊ทผ์ก์ ์์น๋ก ์ธก์ ํ ์ ์๋ MediaPipe์ Face-landmark-detection ๋ชจ๋ธ์ ํตํด 3D๋ก ์ธ์ํ ์๋ฉด ๊ทผ์ก์ ์์ง์ ์ ๋๋ฅผ ์์นํ ์ํฌ ์ ์์์ต๋๋ค.
[
{
"index": 25,
"score": 0.845664918422699,
"categoryName": "jawOpen",
"displayName": ""
},
{
"index": 4,
"score": 0.48291221261024475,
"categoryName": "browOuterUpLeft",
"displayName": ""
},
{
"index": 18,
"score": 0.31452351808547974,
"categoryName": "eyeLookUpRight",
"displayName": ""
},
{
"index": 17,
"score": 0.29944589734077454,
"categoryName": "eyeLookUpLeft",
"displayName": ""
},
//...์ค๋ต
]
์ ์ฒ๋ฆฌ๋ ๋ฐ์ดํฐ๋ฅผ ์ง๋ ํ์ต์ผ๋ก ๋ฅ๋จธ์ ๋ฌ๋์ ์ํค๊ธฐ ์ํด์๋ label์ ๋ถ์ฌ์ค์ผ ํ์ต๋๋ค. label์ ํด๋น ๋ฐ์ดํฐ๊ฐ ํ๋ณตํ ์ด๋ฏธ์ง์ธ์ง, ํ๋ณตํ์ง ์์ ์ด๋ฏธ์ง์ธ์ง ๋ชจ๋ธ ํ์ต์ ๊ตฌ๋ณํ ์ ์๋ ์ญํ ์ ํฉ๋๋ค.
์ง๋ ํ์ต์ด๋? ์ ๋ ฅ๊ณผ ํ๊น์ ์ ๋ฌํ์ฌ ๋ชจ๋ธ์ ํ๋ จํ ๋ค์ ์๋ก์ด ๋ฐ์ดํฐ๋ฅผ ์์ธกํ๋ ๋ฐ ํ์ฉํ๋ค. k-์ต๊ทผ์ ์ด์์ด ์ง๋ ํ์ต ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
//ํ๋ณตํ ์ด๋ฏธ์ง ๋ผ๋ฒจ๋ง = 1
1,
0.04288517311215401,0.09924527257680893,0.0024865891318768263,7.495935392398678e-7,0.0000015387073517558747,0.2613745927810669,0.1912066638469696,0.4886472225189209,0.254801481962204,0.004974926356226206,0.003475902369245887,0.011440315283834934,0.6184675693511963,0.6213760375976562
//ํ๋ณตํ์ง ์์ ์ด๋ฏธ์ง ๋ผ๋ฒจ๋ง = 0
0,
0.0005167833296582103,0.00033727806294336915,0.47885823249816895,4.2532121824478963e-7,2.177084184040723e-7,0.008147920481860638,0.02306659333407879,0.038605958223342896,0.045772310346364975,0.031849455088377,0.04954182356595993,0.005695571657270193,0.0000036304211334936554,0.0000025047413600987056
์์ ์๋ ๋ฐ์ดํฐ ์์์ฒ๋ผ ํ๋ณตํ ์ด๋ฏธ์ง ๋ฐ์ดํฐ์ธ ๊ฒฝ์ฐ 1์ ๋ผ๋ฒจ๋ง์ผ๋ก ๋ถ์ด๊ณ , ํ๋ณตํ์ง ์์ ์ด๋ฏธ์ง ๋ฐ์ดํฐ์ธ ๊ฒฝ์ฐ 0์ผ๋ก ๋ฐ์ดํฐ ๋ผ๋ฒจ๋ง์ ํด์ฃผ์์ต๋๋ค.
์ ์ฒ๋ฆฌ๋ ๋ฐ์ดํฐ๋ค์ ํ์ต ์ํฌ ๊ณผ์ ์์ tensorflow๋ ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ธ์ ํ์ต ์ํค๊ธฐ ์ํด์๋ tensor๋ผ๋ ๋ฐ์ดํฐ ํฌ๋ฉง์ผ๋ก ๋ชจ๋ธ์ ํ์ต ์ํฌ ์ ์๋ค๋ ์ฌ์ค์ ์๊ฒ ๋์์ต๋๋ค. ๋ฐ์ดํฐ ๋ณํ์ ์ ๊ณตํด์ฃผ๋ Danfojs๋ฅผ ํตํด .csvํ์ผ์ tensor ๋ฐ์ดํฐ ํฌ๋ฉง์ผ๋ก ๋ณํํ์ฌ ๋ชจ๋ธ์ ํ์ต ์ํฌ ์ ์์์ต๋๋ค. ๋ฐ์ดํฐ ํ์ต ๊ฒฐ๊ณผ, ์ฝ 80% ํ์ต ์ ํ๋๋ฅผ ๊ฐ์ง ๊ฐ์ ์ถ๋ก ๋ชจ๋ธ์ ๊ฐ๋ฐํ ์ ์์์ต๋๋ค.
์ค์๊ฐ์ผ๋ก ์ผ๊ตด์ด ์คํธ๋ฆฌ๋ฐ ๋๋ ํ๊ฒฝ์์ ์คํ๋์ด์ผ ํ 3๊ฐ์ง ์์ ์ด ์์์ต๋๋ค.
- Mediapipe๋ฅผ ํตํ 3D ์ผ๊ตด ์ธ์ ๋ฐ ์ผ๊ตด ์ธ์ ๋ง์คํฌ ์์ฐ๊ธฐ
- ๊ฐ์ ์ถ๋ก ๋ชจ๋ธ์ ํตํ ๊ฐ์ ์ถ๋ก
- ๊ฐ์ ์ถ๋ก ์, ํ๋ณตํ ์ผ๊ตด์ผ ์ ์ฌ์ฉ์ ์ผ๊ตด ์บก์ณ
์ด ์ธ๊ฐ์ง ์์ ์ ์ค์๊ฐ ์คํธ๋ฆฌ๋ฐ ํ๊ฒฝ์์ ๋ณ๋ ฌ์ ์ผ๋ก ์คํํด์ผ ํ์ต๋๋ค. ๋ณ๋ ฌ์ ์ผ๋ก ์ธ๊ฐ์ง ์์ ์ ์ํํ๊ธฐ ์ํด์๋ ๋ชจ๋ ์์ ์ด ํ๋์ ํ๋ ์ ์์์ ๋ค ๋๋์ผ ํ์ต๋๋ค. ๋๋ถ๋ถ์ ํ๋ ๋์คํ๋ ์ด๋ ์ด๋น 60ํ๋ ์์ผ๋ก ๊ฐฑ์ ๋๋ฏ๋ก, ๋๋ต 16ms ์์ ์ธ๊ฐ์ง ์์ ์ด ๋ชจ๋ ์คํ๋์ด์ผ ํ์ต๋๋ค. ๊ทธ๋์ ํ๋์ ํ๋ ์ ์์์ ํด๊ฒฐํ ์ ์๋ ์ฝ๋ ์คํ ์๊ฐ ์ต์ ํ๋ฅผ ์ค์ ์ผ๋ก ๋๊ณ ์์ ํ์์ต๋๋ค.
์ค์๊ฐ์ผ๋ก ์ธ ๊ฐ์ง ์์
์ ๋์์ ํ๊ธฐ ์ํด์ ์ ํํ ์ ์๋ ๋ฐฉ๋ฒ์ requestAnimationFrame, setTimeout ๋๊ฐ์ง๊ฐ ์์์ต๋๋ค.
rAF๋ฅผ ์ฌ์ฉํ์๋, ์ฝ 16.7ms๋ก ํ๋ ์์ด ๊ท์น์ ์ผ๋ก ๋ ๋๋ง ๋๊ณ ์๊ณ , setTimeout์ ์คํํ์๋๋ ์ฝ 16~50ms๋ก ๋ถ๊ท์น์ ์ผ๋ก ํ๋ ์ ๋ ๋๋ง์ด ๋์์ต๋๋ค.
async function predictWebcam() {
//...
let startTimeMs = performance.now();
const results = await faceLandmarker.detectForVideo(video, startTimeMs);
//...
if (!lastTime.current || currentTime - lastTime.current >= delay) {
lastTime.current = currentTime;
//...
if (webcamRunning) {
//requestAnimationFrame ์ฌ์ฉ
//๋ธ๋ผ์ฐ์ ๊ฐ ๋ฆฌํ์ธํธ๋ ์ค๋น๊ฐ ๋๋๋ฉด ์ฝ๋ฐฑ ํจ์ ์คํ
const animationFrameId = window.requestAnimationFrame(predictWebcam);
setAnimationId(animationFrameId);
}
} else {
if (webcamRunning) {
const animationFrameId = window.requestAnimationFrame(predictWebcam);
setAnimationId(animationFrameId);
}
}
async function predictWebcam() {
//...
let startTimeMs = performance.now();
const results = await faceLandmarker.detectForVideo(video, startTimeMs);
//...
if (!lastTime.current || currentTime - lastTime.current >= delay) {
lastTime.current = currentTime;
//...
if (webcamRunning) {
//setTimeout์ ์ด์ฉ
// 16ms ์ง์ฐ ํ ์คํ
const timeoutId = setTimeout(predictWebcam, 16);
setAnimationId(timeoutId);
}
} else {
if (webcamRunning) {
const timeoutId = setTimeout(predictWebcam, 16);
setAnimationId(timeoutId);
}
}
}
requestAnimationFrame์ ์ฌ์ฉํ์๋, ํ๋ ์ ๋ ๋๋ง ์ฃผ๊ธฐ
setTimeout์ ์ฌ์ฉํ์๋, ํ๋ ์ ๋ ๋๋ง ์ฃผ๊ธฐ
์ด๋ requestAnimationFrame๊ณผ setTimeout์ ๋์ ์ฐจ์ด์์ ์ผ์ด๋๋ ํ์์ด๋ผ๋ ์ฌ์ค์ ์๊ฒ ๋์์ต๋๋ค.
๋ฐฉ๋ฒ | ํน์ง |
---|---|
requestAnimationFrame | - ๋ค์ํ ๋๋ฐ์ด์ค์์ ํด๋น ๋ธ๋ผ์ฐ์ ์ ๋ฆฌํ์ธํธ ์ฃผ๊ธฐ์ ๋ง๊ฒ ์ฝ๋ฐฑ์ ์์ฝํ๋ค. - ์ฌ์ฉ์์ ๋๋ฐ์ด์ค ์ฑ๋ฅ๊ณผ ๋ฐฐํฐ๋ฆฌ ์๋ช ์ ๊ณ ๋ คํ๋ค - ๋ธ๋ผ์ฐ์ ๊ฐ ๋นํ์ฑํ ๋๋ฉด ์ฝ๋ฐฑ์ด ์ค๋จ๋๋ค. (๋ฆฌ์์ค ์ ์ฝ) |
setTimeout | - ์ ํด์ง ์๊ฐ ๊ฐ๊ฒฉ์ผ๋ก ์คํ. => ๋ธ๋ผ์ฐ์ ๋ ๋๋ง ์ฃผ๊ธฐ์ ๋๊ธฐํ ๋์ง ์๋๋ค. - ๋ธ๋ผ์ฐ์ ํ์ฑ ์ฌ๋ถ์ ์๊ด์์ด ์ง์ ๋ ์๊ฐ ๊ฐ๊ฒฉ๋๋ก ์คํ์ด ๋๋ค. (๋ฆฌ์์ค ๋ญ๋น) - ๋ค๋ฅธ ์์ ์ํ์ผ๋ก ์ฝ๋ฐฑ ํจ์ ์คํ์ด ์ง์ฐ๋๋ฉด, ํ๋ ์ ๋๋์ด ์ผ์ด๋๊ณ , ์ด๋ ํ๋ฉด ๋ฒ๋ฒ ๊ฑฐ๋ฆผ์ ์ด๋ํ๋ค. |
requestAnimationFrame์ ๋ธ๋ผ์ฐ์ ํ๋ ์ ๋ ๋๋ง ์ฃผ๊ธฐ์ ๋ง์ถฐ ์ฝ๋ฐฑ์ ์์ฝํ๊ณ , ๋ฆฌ์์ค ์ ์ฝ์ ํ ์ ์์ต๋๋ค. ๋ฌด์๋ณด๋ค ๋ค์ํ ๋๋ฐ์ด์ค์์ ์๋์ด ๊ฐ๋ฅํด์ผ ํ๋ ํ๋ก์ ํธ ํน์ฑ์, ๋ธ๋ผ์ฐ์ ์ ๋ง์ถฐ ์ฝ๋ฐฑ์ ์์ฝํ๋ค๋ ์ ์์ requestAnimationFrame์ด setTimeout๋ณด๋ค ์ด ํ๋ก์ ํธ์ ์ ํฉํ๋ค๊ณ ํ๋จํ์์ต๋๋ค.
requestAnimationFrame์ ํตํด ์ผ๊ตด ์ธ์ ๋ฐ ๊ฐ์ ์ถ๋ก ์ ๋ธ๋ผ์ฐ์ ์ ํ๋ ์์ ๋ง์ถฐ ์คํํ ์ ์์์ต๋๋ค. ํ์ง๋ง, ์ฌ์ฉ์ ์ผ๊ตด์ ์บก์ณํด์ฃผ๋๋ฐ์ ๋ค๋ฅธ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค. ๋ชจ๋ ํ๋ ์์์ ์บก์ณ๋ฅผ ์งํํ๋ ํ๋ ์ ๋ ๋๋ง ์ฃผ๊ธฐ๊ฐ 15-20ms์์ 15-33ms๋ก ๊ธธ์ด์ก์ต๋๋ค. ์ด๋ ํ๋ ์ ๋ ๋๋ง ์ฃผ๊ธฐ์ ๋ถ๊ท์น์ฑ์ ๊ฐ์ ธ์ค๊ณ , ๊ฒฐ๊ตญ ์ผ๊ตด ์ธ์์ด ๋ถ๋๋ฝ์ง ์๊ฒ ์ด๋ฃจ์ด์ง๋ ๊ฒฐ๊ณผ๋ฅผ ์ด๋ํ์ต๋๋ค.
์ด๋ฐ ์ํฉ์ ๋ฐฉ์งํ๊ธฐ ์ํด ์ผ์ ํ ์๊ฐ ๊ฐ๊ฒฉ์ ๋๊ณ ์บก์ณ๋ฅผ ํ๋ ๋ฐฉ๋ฒ์ ๋ํด ๊ณ ๋ฏผํด๋ณด์์ต๋๋ค. ์ผ์ ์๊ฐ ๊ฐ๊ฒฉ์ ๋๊ธฐ ์ํด์ requestAnimationFrame์์๋ performance.now๋ฅผ ์ฌ์ฉํ์์ต๋๋ค. performance.now()๋ ์ด์ ํ๋ ์๊ณผ ํ์ฌ ํ๋ ์์ ์๊ฐ์ฐจ๋ฅผ ์ ํํ๊ฒ ๊ธฐ๋กํ์ฌ ์ผ์ ์๊ฐ์ด ์ง๋ํ์, capture ๋ก์ง์ด ์๋ํ๋๋ก timestamp๋ฅผ ๋์ ํ์์ต๋๋ค.
const currentTime = performance.now();
const delay = 500;
//currentTime - lastTime์ด delay๋งํผ ๋์์๋, ์บก์ณ ์งํ
if (!lastTime.current || currentTime - lastTime.current >= delay) {
lastTime.current = currentTime;
// ์บก์ณ ๋ก์ง
if (webcamRunning) {
const animationFrameId = window.requestAnimationFrame(predictWebcam);
setAnimationId(animationFrameId);
}
} else {
if (webcamRunning) {
const animationFrameId = window.requestAnimationFrame(predictWebcam);
setAnimationId(animationFrameId);
}
}
Note
ํ๋ ์ ํญ์ ๋
ธ๋์ ๋น๊ธ์ด ์ณ์ ์๋ ์์ญ์ ํ๋ ์์ด ๊ทธ๋ ค์ง์ง ์์๋ค๋ ํ์์ด๋ค.
timestamp๋ฅผ ์ฌ์ฉํ์ง ์์์ ํ๋ ์ ๋๋์ด ์ผ์ด๋จ
timestamp๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ ์ ๋๋์ด ์๊ธฐ์ง ์์
์นด๋ฉ๋ผ ๊ถํ์ ์ป๊ธฐ ์ํด MediaDevices.getUserMedia()๋ฅผ ํตํด ๋ฏธ๋์ด ์ ๋ ฅ ์ฌ์ฉ ํ๊ฐ๋ฅผ ์์ฒญํ ์ ์์์ต๋๋ค. ํ์ง๋ง Chrome์ด๋ MicorSoft Edge์์๋ ์นด๋ฉ๋ผ ๊ถํ ์์ฒญ์ ํ ์ ์์์ง๋ง, safari์์๋ ์ค๋ฅ๊ฐ ์๊ฒผ์ต๋๋ค
๋ค๋ฅธ ๋ธ๋ผ์ฐ์ ์๋ ๋ค๋ฅด๊ฒ safari๋ MediaDevices.getUserMedia()๋ฅผ undefined๋ฅผ ๋ฐํํ์์ต๋๋ค. ์ด๋ MediaDevices.getUserMedia()๋ฅผ ์ฌ์ฉํ์ง ๋ชปํ๊ฒ ํ๋ ์ ์ฑ ๋๋ฌธ์ธ๊ฒ์ ์๊ฒ ๋์์ต๋๋ค. HTTPS, file:/// URL ์ฒด๊ณ๋ฅผ ์ฌ์ฉํ์ฌ ๋ก๋๋ ํ์ด์ง ๋๋ ๋ก์ปฌ ํธ์คํธ์์ ๋ก๋๋ ํ์ด์ง๊ฐ ์๋๋ฉด MediaDevices.getUserMedia()๊ฐ ๋ฐํํ๋ ํ๋ก๋ฏธ์ค๋ฅผ ๊ฑฐ๋ถํฉ๋๋ค. ํ์ง๋ง safari์์๋ localhost๋ ์์ธ๊ฐ ์๋์์ต๋๋ค. safari์์๋ ๊ฐ๋ฐ ํ๊ฒฝ์์๋ HTTPS๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฉด MediaDevices.getUserMedia()๋ฅผ ๋ฐํ ๋ฐ์ ์ ์๊ธฐ์ ๋ก์ปฌ์์ HTTPS๋ฅผ ์ฌ์ฉํ ์ ์๋ @vitejs/plugin-basic-ssl๋ฅผ ์ฌ์ฉํ์ฌ ํด๊ฒฐํ์์ต๋๋ค.
๋ชจ๋ฐ์ผ ํ๊ฒฝ์์ video๊ฐ ์ ์ฒด ํ๋ฉด์ผ๋ก ์ปค์ง๋ฉด์ ์๋ฉด ์ธ์ ๋ง์คํฌ๊ฐ ์์์ง์ง ์๋ ๋ฌธ์ ๊ฐ ์๊ฒผ์ต๋๋ค. ์ ์ฒด ํ๋ฉด์์ ๋์ค๋ฉด ๋ผ์ด๋ธ ์คํธ๋ฆฌ๋ฐ์ด ๋ ์ด์ ๋์๊ฐ์ง ์๊ณ , ์๋ฉด ์ธ์ ๋ง์คํฌ๊ฐ ๋ฉ์ถฐ์๋ ๋ชจ์ต์ ๋ณผ ์ ์์์ต๋๋ค.
์ด๋ ios์ ๋ฌธ์ ๋ผ๋ ์ฌ์ค์ ์๊ฒ ๋์์ต๋๋ค. webkit์์ ๋ฐํํ New <video>
Policies for iOS์ ํตํด, ๊ณผ๊ฑฐ์ ios์์์ video ํ๊ทธ์ ๋ํ ๋ณํ๋ฅผ ์๊ฒ ๋์์ต๋๋ค. ์ฌ๋ฌ ๋ธ๋ก๊ทธ ๊ธ์์ video ํ๊ทธ์ ์ฌ์์ ์ํด์๋ ์ฌ์ฉ์ ์ ์ค์ฒ, ์ฆ eventListener์ ๋์์ด ํ์ํ๋ค๊ณ ํ์ต๋๋ค. ํ์ง๋ง New <video>
Policies for iOS์์ ๋ช
์ํ๊ธธ ios10 ์ดํ๋ก ๋ฌด์ video ์์์ ๋ํ ์ ์ ์ ์ค์ฒ ์๊ตฌ ์ฌํญ์ด ์ํ๋์๋ค๊ณ ํฉ๋๋ค. ๋ํ, ๋ฌด์ video์ ๊ฒฝ์ฐ autoplay๋ฅผ ํ์ฉํ๋๋ก ๋ณ๊ฒฝ๋์์ต๋๋ค.
๊ฒฐ๊ตญ video ํ๊ทธ์ playsinline ์์ฑ ์ถ๊ฐ๋ฅผ ํตํด ์ธ๋ผ์ธ์ผ๋ก ์ฌ์ํ ์ ์์ผ๋ฉฐ, ์ฌ์์ด ์์๋ ๋ ์๋์ผ๋ก ์ ์ฒดํ๋ฉด ๋ชจ๋๋ก ๋ค์ด๊ฐ๋ ํ์์ ํด๊ฒฐํ์์ต๋๋ค.
ํ๋ก์ ํธ ๊ธฐ๊ฐ: 2023.08.07 ~ 2023.09.07 /