WebCodecs API๋ฅผ ์ฌ์ฉํ ๋น๋์ค ํ๋ ์ ์ฒ๋ฆฌ ์ต์ ํ์ ๋ํ ์ข ํฉ ๊ฐ์ด๋์ ๋๋ค. ์ฑ๋ฅ ํฅ์, ์ง์ฐ ์๊ฐ ๊ฐ์, ์ด๋ฏธ์ง ํ์ง ๊ฐ์ ๊ธฐ์ ์ ๋ค๋ฃน๋๋ค.
WebCodecs VideoFrame ์ฒ๋ฆฌ ์์ง: ํ๋ ์ ์ฒ๋ฆฌ ์ต์ ํ
WebCodecs API๋ ์น ๊ธฐ๋ฐ ๋น๋์ค ์ฒ๋ฆฌ์ ํ๋ช ์ ์ผ์ผํค๊ณ ์์ผ๋ฉฐ, ๊ฐ๋ฐ์๊ฐ ๋ธ๋ผ์ฐ์ ๋ด์์ ์ง์ ๋ฎ์ ์์ค์ ๋น๋์ค ๋ฐ ์ค๋์ค ์ฝ๋ฑ์ ์ก์ธ์คํ ์ ์๋๋ก ํฉ๋๋ค. ์ด ๊ธฐ๋ฅ์ ์ค์๊ฐ ๋น๋์ค ํธ์ง, ์คํธ๋ฆฌ๋ฐ ๋ฐ ๊ณ ๊ธ ๋ฏธ๋์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ํ ํฅ๋ฏธ๋ก์ด ๊ฐ๋ฅ์ฑ์ ์ด์ด์ค๋๋ค. ๊ทธ๋ฌ๋ WebCodecs๋ฅผ ์ฌ์ฉํ์ฌ ์ต์ ์ ์ฑ๋ฅ์ ์ป์ผ๋ ค๋ฉด ์ํคํ ์ฒ์ ๋ํ ๊น์ ์ดํด์ ํ๋ ์ ์ฒ๋ฆฌ ์ต์ ํ ๊ธฐ์ ์ ๋ํ ์ธ์ฌํ ์ฃผ์๊ฐ ํ์ํฉ๋๋ค.
WebCodecs API ๋ฐ VideoFrame ๊ฐ์ฒด ์ดํด
์ต์ ํ ์ ๋ต์ ์ดํด๋ณด๊ธฐ ์ ์ WebCodecs API์ ํต์ฌ ๊ตฌ์ฑ ์์, ํนํ VideoFrame
๊ฐ์ฒด๋ฅผ ๊ฐ๋ตํ๊ฒ ๋ณต์ตํด ๋ณด๊ฒ ์ต๋๋ค.
- VideoDecoder: ์ธ์ฝ๋ฉ๋ ๋น๋์ค ์คํธ๋ฆผ์
VideoFrame
๊ฐ์ฒด๋ก ๋์ฝ๋ฉํฉ๋๋ค. - VideoEncoder:
VideoFrame
๊ฐ์ฒด๋ฅผ ์ธ์ฝ๋ฉ๋ ๋น๋์ค ์คํธ๋ฆผ์ผ๋ก ์ธ์ฝ๋ฉํฉ๋๋ค. - VideoFrame: ๋จ์ผ ๋น๋์ค ํ๋ ์์ ๋ํ๋ด๋ฉฐ ์์ ํฝ์ ๋ฐ์ดํฐ์ ๋ํ ์ก์ธ์ค๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ฌ๊ธฐ์์ ์ฒ๋ฆฌ์ ๋ง๋ฒ์ด ์ผ์ด๋ฉ๋๋ค.
VideoFrame
๊ฐ์ฒด์๋ ํ๋ ์์ ํฌ๊ธฐ, ํ์, ํ์์คํฌํ ๋ฐ ํฝ์
๋ฐ์ดํฐ๋ฅผ ํฌํจํ์ฌ ํ๋ ์์ ๋ํ ํ์ ์ ๋ณด๊ฐ ํฌํจ๋์ด ์์ต๋๋ค. ์ด ํฝ์
๋ฐ์ดํฐ์ ํจ์จ์ ์ผ๋ก ์ก์ธ์คํ๊ณ ์กฐ์ํ๋ ๊ฒ์ด ์ต์ ์ ์ฑ๋ฅ์ ๋งค์ฐ ์ค์ํฉ๋๋ค.
์ฃผ์ ์ต์ ํ ์ ๋ต
WebCodecs๋ฅผ ์ฌ์ฉํ ๋น๋์ค ํ๋ ์ ์ฒ๋ฆฌ ์ต์ ํ์๋ ๋ช ๊ฐ์ง ์ฃผ์ ์ ๋ต์ด ์์ต๋๋ค. ๊ฐ ์ ๋ต์ ์์ธํ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
1. ๋ฐ์ดํฐ ๋ณต์ฌ ์ต์ํ
๋ฐ์ดํฐ ๋ณต์ฌ๋ ๋น๋์ค ์ฒ๋ฆฌ์์ ์ค์ํ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ๋๋ค. ํฝ์ ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํ ๋๋ง๋ค ์ค๋ฒํค๋๊ฐ ๋ฐ์ํฉ๋๋ค. ๋ฐ๋ผ์ ๋ถํ์ํ ๋ณต์ฌ๋ฅผ ์ต์ํํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ค์ํฉ๋๋ค.
VideoFrame.copyTo()
๋ฅผ ์ฌ์ฉํ ์ง์ ์ก์ธ์ค
VideoFrame.copyTo()
๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ํ๋ ์์ ๋ฐ์ดํฐ๋ฅผ BufferSource
(์: ArrayBuffer
, TypedArray
)์ ํจ์จ์ ์ผ๋ก ๋ณต์ฌํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด ๋ฉ์๋์กฐ์ฐจ๋ ๋ณต์ฌ๋ฅผ ํฌํจํฉ๋๋ค. ๋ณต์ฌ๋ฅผ ์ต์ํํ๊ธฐ ์ํด ๋ค์ ๋ฐฉ๋ฒ์ ๊ณ ๋ คํ์ญ์์ค.
- ์ ์๋ฆฌ ์ฒ๋ฆฌ: ๊ฐ๋ฅํ ๊ฒฝ์ฐ ๋์
BufferSource
๋ด์ ๋ฐ์ดํฐ์ ์ง์ ์ฒ๋ฆฌ๋ฅผ ์ํํฉ๋๋ค. ์ค๊ฐ ๋ณต์ฌ๋ณธ์ ๋ง๋ค์ง ๋ง์ญ์์ค. - ๋ทฐ ์์ฑ: ์ ์ฒด ๋ฒํผ๋ฅผ ๋ณต์ฌํ๋ ๋์ ๊ธฐ๋ณธ ๋ฒํผ์ ํน์ ์์ญ์ ๊ฐ๋ฆฌํค๋ ํ์ํ๋ ๋ฐฐ์ด ๋ทฐ(์:
Uint8Array
,Float32Array
)๋ฅผ ๋ง๋ญ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ ์ฒด ๋ณต์ฌ๋ณธ์ ๋ง๋ค์ง ์๊ณ ๋ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์์ : VideoFrame
์ ๋ฐ๊ธฐ ์กฐ์ ์ ์ ์ฉํ๋ ๊ฒ์ ๊ณ ๋ คํด ๋ณด์ญ์์ค.
async function adjustBrightness(frame, brightness) {
const width = frame.codedWidth;
const height = frame.codedHeight;
const format = frame.format; // e.g., 'RGBA'
const data = new Uint8Array(width * height * 4); // Assuming RGBA format
frame.copyTo(data);
for (let i = 0; i < data.length; i += 4) {
data[i] = Math.min(255, data[i] + brightness); // Red
data[i + 1] = Math.min(255, data[i + 1] + brightness); // Green
data[i + 2] = Math.min(255, data[i + 2] + brightness); // Blue
}
// Create a new VideoFrame from the modified data
const newFrame = new VideoFrame(data, {
codedWidth: width,
codedHeight: height,
format: format,
timestamp: frame.timestamp,
});
frame.close(); // Release the original frame
return newFrame;
}
์ด ์์ ๋ ๊ธฐ๋ฅ์ ์ด์ง๋ง ํฝ์ ๋ฐ์ดํฐ์ ์ ์ฒด ๋ณต์ฌ๋ณธ์ ํฌํจํฉ๋๋ค. ํฐ ํ๋ ์์ ๊ฒฝ์ฐ ์๋๊ฐ ๋๋ฆด ์ ์์ต๋๋ค. ์ด ๋ณต์ฌ๋ฅผ ์ ์ฌ์ ์ผ๋ก ํผํ๊ธฐ ์ํด WebAssembly ๋๋ GPU ๊ธฐ๋ฐ ์ฒ๋ฆฌ(๋์ค์ ์ค๋ช )๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ณ ๋ คํด ๋ณด์ญ์์ค.
2. ์ฑ๋ฅ์ ์ค์ํ ์์ ์ WebAssembly ํ์ฉ
JavaScript๋ ๋ค์ฌ๋ค๋ฅํ์ง๋ง ๊ณ์ฐ ์ง์ฝ์ ์ธ ์์ ์๋ ๋๋ฆด ์ ์์ต๋๋ค. WebAssembly(Wasm)๋ ๊ฑฐ์ ๋ค์ดํฐ๋ธ ์ฑ๋ฅ์ ๋์์ ์ ๊ณตํฉ๋๋ค. C++ ๋๋ Rust์ ๊ฐ์ ์ธ์ด๋ก ํ๋ ์ ์ฒ๋ฆฌ ๋ก์ง์ ์์ฑํ๊ณ Wasm์ผ๋ก ์ปดํ์ผํ๋ฉด ์๋นํ ์๋ ํฅ์์ ์ป์ ์ ์์ต๋๋ค.
WebCodecs์ Wasm ํตํฉ
VideoFrame
์ ์์ ํฝ์
๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌ๋ฅผ ์ํด Wasm ๋ชจ๋์ ์ ๋ฌํ ๋ค์ ์ฒ๋ฆฌ๋ ๋ฐ์ดํฐ์์ ์ VideoFrame
์ ๋ง๋ค ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๊ณ์ฐ ๋น์ฉ์ด ๋ง์ด ๋๋ ์์
์ Wasm์ผ๋ก ์คํ๋ก๋ํ๋ ๋์์ WebCodecs API์ ํธ๋ฆฌํจ์ ํ์ฉํ ์ ์์ต๋๋ค.
์์ : ์ด๋ฏธ์ง ์ปจ๋ณผ๋ฃจ์ (ํ๋ฆผ, ์ ๋ช ํ๊ฒ ํ๊ธฐ, ๊ฐ์ฅ์๋ฆฌ ๊ฐ์ง)์ Wasm์ ์ ํฉํ ํ๋ณด์ ๋๋ค. ๋ค์์ ๊ฐ๋ ์ ๊ฐ์์ ๋๋ค.
- ์ปจ๋ณผ๋ฃจ์ ์์ ์ ์ํํ๋ Wasm ๋ชจ๋์ ๋ง๋ญ๋๋ค. ์ด ๋ชจ๋์ ํฝ์ ๋ฐ์ดํฐ, ๋๋น, ๋์ด ๋ฐ ์ปจ๋ณผ๋ฃจ์ ์ปค๋์ ๋ํ ํฌ์ธํฐ๋ฅผ ์ ๋ ฅ์ผ๋ก ํ์ฉํฉ๋๋ค.
- JavaScript์์
copyTo()
๋ฅผ ์ฌ์ฉํ์ฌVideoFrame
์์ ํฝ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ต๋๋ค. - ํฝ์ ๋ฐ์ดํฐ๋ฅผ ๋ณด๊ดํ๊ธฐ ์ํด Wasm ๋ชจ๋์ ์ ํ ๋ฉ๋ชจ๋ฆฌ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํฉ๋๋ค.
- JavaScript์์ Wasm ๋ชจ๋์ ๋ฉ๋ชจ๋ฆฌ๋ก ํฝ์ ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํฉ๋๋ค.
- ์ปจ๋ณผ๋ฃจ์ ์ ์ํํ๊ธฐ ์ํด Wasm ํจ์๋ฅผ ํธ์ถํฉ๋๋ค.
- ์ฒ๋ฆฌ๋ ํฝ์ ๋ฐ์ดํฐ๋ฅผ Wasm ๋ชจ๋์ ๋ฉ๋ชจ๋ฆฌ์์ JavaScript๋ก ๋ค์ ๋ณต์ฌํฉ๋๋ค.
- ์ฒ๋ฆฌ๋ ๋ฐ์ดํฐ์์ ์
VideoFrame
์ ๋ง๋ญ๋๋ค.
์ฃผ์ ์ฌํญ: Wasm๊ณผ ์ํธ ์์ฉํ๋ ค๋ฉด ๋ฉ๋ชจ๋ฆฌ ํ ๋น ๋ฐ ๋ฐ์ดํฐ ์ ์ก์ ๋ํ ์ฝ๊ฐ์ ์ค๋ฒํค๋๊ฐ ํ์ํฉ๋๋ค. Wasm์ ์ฑ๋ฅ ํฅ์์ด ์ด ์ค๋ฒํค๋๋ณด๋ค ํฐ์ง ํ์ธํ๊ธฐ ์ํด ์ฝ๋๋ฅผ ํ๋กํ์ผ๋งํ๋ ๊ฒ์ด ํ์์ ์ ๋๋ค. Emscripten๊ณผ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ฉด C++ ์ฝ๋๋ฅผ Wasm์ผ๋ก ์ปดํ์ผํ๋ ํ๋ก์ธ์ค๋ฅผ ํฌ๊ฒ ๊ฐ์ํํ ์ ์์ต๋๋ค.
3. SIMD(Single Instruction, Multiple Data)์ ํ ํ์ฉ
SIMD๋ ๋จ์ผ ๋ช ๋ น์ผ๋ก ์ฌ๋ฌ ๋ฐ์ดํฐ ์ง์ ์์ ๋์์ ์๋ํ ์ ์๋ ๋ณ๋ ฌ ์ฒ๋ฆฌ ์ ํ์ ๋๋ค. ์ต์ CPU์๋ ์ด๋ฏธ์ง ์ฒ๋ฆฌ์ ๊ฐ์ด ๋ฐ์ดํฐ ๋ฐฐ์ด์ ๋ํ ๋ฐ๋ณต์ ์ธ ์์ ์ ํฌํจํ๋ ์์ ์ ํฌ๊ฒ ๊ฐ์ํํ ์ ์๋ SIMD ๋ช ๋ น์ด ์์ต๋๋ค. WebAssembly๋ Wasm SIMD ์ ์์ ํตํด SIMD๋ฅผ ์ง์ํฉ๋๋ค.
ํฝ์ ์์ค ์์ ์ SIMD ์ฌ์ฉ
SIMD๋ ์์ ๋ณํ, ํํฐ๋ง ๋ฐ ๋ธ๋ ๋ฉ๊ณผ ๊ฐ์ ํฝ์ ์์ค ์์ ์ ํนํ ์ ํฉํฉ๋๋ค. SIMD ๋ช ๋ น์ ํ์ฉํ๋๋ก ํ๋ ์ ์ฒ๋ฆฌ ๋ก์ง์ ๋ค์ ์์ฑํ๋ฉด ์๋นํ ์ฑ๋ฅ ํฅ์์ ์ป์ ์ ์์ต๋๋ค.
์์ : ์ด๋ฏธ์ง๋ฅผ RGB์์ ํ์์กฐ๋ก ๋ณํํฉ๋๋ค.
์์งํ JavaScript ๊ตฌํ์ ๊ฐ ํฝ์
์ ๋ฐ๋ณตํ๊ณ gray = 0.299 * red + 0.587 * green + 0.114 * blue
์ ๊ฐ์ ๊ณต์์ ์ฌ์ฉํ์ฌ ํ์์กฐ ๊ฐ์ ๊ณ์ฐํ ์ ์์ต๋๋ค.
SIMD ๊ตฌํ์ ์ฌ๋ฌ ํฝ์ ์ ๋์์ ์ฒ๋ฆฌํ์ฌ ํ์ํ ๋ช ๋ น ์๋ฅผ ํฌ๊ฒ ์ค์ ๋๋ค. SIMD.js์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(๊ธฐ๋ณธ์ ์ผ๋ก ๋ณดํธ์ ์ผ๋ก ์ง์๋์ง ์๊ณ Wasm SIMD๋ก ๋์ฒด๋จ)๋ JavaScript์์ SIMD ๋ช ๋ น์ผ๋ก ์์ ํ๊ธฐ ์ํ ์ถ์ํ๋ฅผ ์ ๊ณตํ๊ฑฐ๋ Wasm SIMD ๋ด์ฅ ํจ์๋ฅผ ์ง์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ Wasm SIMD ๋ด์ฅ ํจ์๋ฅผ ์ง์ ์ฌ์ฉํ๋ ค๋ฉด ์ผ๋ฐ์ ์ผ๋ก C++ ๋๋ Rust์ ๊ฐ์ ์ธ์ด๋ก ์ฒ๋ฆฌ ๋ก์ง์ ์์ฑํ๊ณ Wasm์ผ๋ก ์ปดํ์ผํด์ผ ํฉ๋๋ค.
4. ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ฅผ ์ํด GPU ํ์ฉ
GPU(Graphics Processing Unit)๋ ๊ทธ๋ํฝ ๋ฐ ์ด๋ฏธ์ง ์ฒ๋ฆฌ์ ์ต์ ํ๋ ๊ณ ๋๋ก ๋ณ๋ ฌ ํ๋ก์ธ์์ ๋๋ค. ํ๋ ์ ์ฒ๋ฆฌ ์์ ์ GPU๋ก ์คํ๋ก๋ํ๋ฉด ํนํ ๋ณต์กํ ์์ ์ ๊ฒฝ์ฐ ์๋นํ ์ฑ๋ฅ ํฅ์์ ์ป์ ์ ์์ต๋๋ค.
WebGPU ๋ฐ VideoFrame ํตํฉ
WebGPU๋ ์น ๋ธ๋ผ์ฐ์ ์์ GPU์ ๋ํ ์ก์ธ์ค๋ฅผ ์ ๊ณตํ๋ ์ต์ ๊ทธ๋ํฝ API์
๋๋ค. WebCodecs VideoFrame
๊ฐ์ฒด์์ ์ง์ ํตํฉ์ ์ฌ์ ํ ์งํํ๊ณ ์์ง๋ง VideoFrame
์์ WebGPU ํ
์ค์ฒ๋ก ํฝ์
๋ฐ์ดํฐ๋ฅผ ์ ์กํ๊ณ ์
ฐ์ด๋๋ฅผ ์ฌ์ฉํ์ฌ ์ฒ๋ฆฌ๋ฅผ ์ํํ ์ ์์ต๋๋ค.
๊ฐ๋ ์ ์ํฌํ๋ก:
VideoFrame
๊ณผ ๋์ผํ ํฌ๊ธฐ ๋ฐ ํ์์ผ๋ก WebGPU ํ ์ค์ฒ๋ฅผ ๋ง๋ญ๋๋ค.VideoFrame
์์ WebGPU ํ ์ค์ฒ๋ก ํฝ์ ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ๋ณต์ฌ ๋ช ๋ น์ ์ฌ์ฉํฉ๋๋ค.- ์ํ๋ ํ๋ ์ ์ฒ๋ฆฌ ์์ ์ ์ํํ๋ WebGPU ์ ฐ์ด๋ ํ๋ก๊ทธ๋จ์ ์์ฑํฉ๋๋ค.
- ํ ์ค์ฒ๋ฅผ ์ ๋ ฅ์ผ๋ก ์ฌ์ฉํ์ฌ GPU์์ ์ ฐ์ด๋ ํ๋ก๊ทธ๋จ์ ์คํํฉ๋๋ค.
- ์ถ๋ ฅ ํ ์ค์ฒ์์ ์ฒ๋ฆฌ๋ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ต๋๋ค.
- ์ฒ๋ฆฌ๋ ๋ฐ์ดํฐ์์ ์
VideoFrame
์ ๋ง๋ญ๋๋ค.
์ฅ์ :
- ๋๊ท๋ชจ ๋ณ๋ ฌ ์ฒ๋ฆฌ: GPU๋ ์์ฒ ๊ฐ์ ํฝ์ ์ ๋์์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
- ํ๋์จ์ด ๊ฐ์: ๋ง์ ์ด๋ฏธ์ง ์ฒ๋ฆฌ ์์ ์ด GPU์์ ํ๋์จ์ด ๊ฐ์๋ฉ๋๋ค.
๋จ์ :
- ๋ณต์ก์ฑ: WebGPU๋ ๋น๊ต์ ๋ณต์กํ API์ ๋๋ค.
- ๋ฐ์ดํฐ ์ ์ก ์ค๋ฒํค๋: CPU์ GPU ๊ฐ์ ๋ฐ์ดํฐ ์ ์ก์ ๋ณ๋ชฉ ํ์์ด ๋ ์ ์์ต๋๋ค.
Canvas 2D API
WebGPU๋งํผ ๊ฐ๋ ฅํ์ง๋ ์์ง๋ง Canvas 2D API๋ฅผ ์ฌ์ฉํ์ฌ ๋ ๊ฐ๋จํ ํ๋ ์ ์ฒ๋ฆฌ ์์
์ ์ํํ ์ ์์ต๋๋ค. VideoFrame
์ Canvas์ ๊ทธ๋ฆฌ๊ณ getImageData()
๋ฅผ ์ฌ์ฉํ์ฌ ํฝ์
๋ฐ์ดํฐ์ ์ก์ธ์คํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด ์ ๊ทผ ๋ฐฉ์์ ์ข
์ข
์์์ ๋ฐ์ดํฐ ๋ณต์ฌ๋ฅผ ํฌํจํ๋ฉฐ ๊น๋ค๋ก์ด ์ ํ๋ฆฌ์ผ์ด์
์ ๊ฐ์ฅ ์ ํฉํ ์ต์
์ด ์๋ ์ ์์ต๋๋ค.
5. ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ์ต์ ํ
ํจ์จ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ฐฉ์งํ๊ณ ๊ฐ๋น์ง ์์ง ์ค๋ฒํค๋๋ฅผ ์ต์ํํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค. VideoFrame
๊ฐ์ฒด ๋ฐ ๊ธฐํ ๋ฆฌ์์ค๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ํด์ ํ๋ ๊ฒ์ ์ํํ ์ฑ๋ฅ์ ์ ์งํ๋ ๋ฐ ํ์์ ์
๋๋ค.
VideoFrame
๊ฐ์ฒด ํด์
VideoFrame
๊ฐ์ฒด๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋นํฉ๋๋ค. VideoFrame
์์
์ด ์๋ฃ๋๋ฉด close()
๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ๋ฆฌ์์ค๋ฅผ ํด์ ํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
์์ :
// Process the frame
const processedFrame = await processFrame(frame);
// Release the original frame
frame.close();
// Use the processed frame
// ...
// Release the processed frame when done
processedFrame.close();
VideoFrame
๊ฐ์ฒด๋ฅผ ํด์ ํ์ง ๋ชปํ๋ฉด ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ๋ฉ๋ชจ๋ฆฌ ๋์ ๋ฐ ์ฑ๋ฅ ์ ํ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
๊ฐ์ฒด ํ๋ง
VideoFrame
๊ฐ์ฒด๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ๋ง๋ค๊ณ ์ญ์ ํ๋ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ฒฝ์ฐ ๊ฐ์ฒด ํ๋ง์ ์ ์ฉํ ์ต์ ํ ๊ธฐ์ ์ด ๋ ์ ์์ต๋๋ค. ๋งค๋ฒ ์ฒ์๋ถํฐ ์ VideoFrame
๊ฐ์ฒด๋ฅผ ๋ง๋๋ ๋์ ๋ฏธ๋ฆฌ ํ ๋น๋ ๊ฐ์ฒด ํ์ ์ ์งํ๊ณ ์ฌ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๊ฐ์ฒด ์์ฑ ๋ฐ ๊ฐ๋น์ง ์์ง๊ณผ ๊ด๋ จ๋ ์ค๋ฒํค๋๋ฅผ ์ค์ผ ์ ์์ต๋๋ค.
6. ์ฌ๋ฐ๋ฅธ ๋น๋์ค ํ์ ๋ฐ ์ฝ๋ฑ ์ ํ
๋น๋์ค ํ์ ๋ฐ ์ฝ๋ฑ ์ ํ์ ์ฑ๋ฅ์ ํฐ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค. ์ผ๋ถ ์ฝ๋ฑ์ ๋ค๋ฅธ ์ฝ๋ฑ๋ณด๋ค ๋์ฝ๋ฉ ๋ฐ ์ธ์ฝ๋ฉํ๋ ๋ฐ ๊ณ์ฐ ๋น์ฉ์ด ๋ ๋ง์ด ๋ญ๋๋ค. ๋ค์ ์์๋ฅผ ๊ณ ๋ คํ์ญ์์ค.
- ์ฝ๋ฑ ๋ณต์ก์ฑ: ๋ ๊ฐ๋จํ ์ฝ๋ฑ(์: VP8)์ ์ผ๋ฐ์ ์ผ๋ก ๋ ๋ณต์กํ ์ฝ๋ฑ(์: AV1)๋ณด๋ค ์ ์ ์ฒ๋ฆฌ ๋ฅ๋ ฅ์ ํ์๋ก ํฉ๋๋ค.
- ํ๋์จ์ด ๊ฐ์: ์ผ๋ถ ์ฝ๋ฑ์ ํน์ ์ฅ์น์์ ํ๋์จ์ด ๊ฐ์๋์ด ์๋นํ ์ฑ๋ฅ ํฅ์์ผ๋ก ์ด์ด์ง ์ ์์ต๋๋ค.
- ํธํ์ฑ: ์ ํํ ์ฝ๋ฑ์ด ๋์ ๋ธ๋ผ์ฐ์ ๋ฐ ์ฅ์น์์ ๋๋ฆฌ ์ง์๋๋์ง ํ์ธํฉ๋๋ค.
- ํฌ๋ก๋ง ์๋ธ์ํ๋ง: ํฌ๋ก๋ง ์๋ธ์ํ๋ง(์: YUV420)์ด ์๋ ํ์์ ์๋ธ์ํ๋ง์ด ์๋ ํ์(์: YUV444)๋ณด๋ค ์ ์ ๋ฉ๋ชจ๋ฆฌ ๋ฐ ๋์ญํญ์ด ํ์ํฉ๋๋ค. ์ด ์ ์ถฉ์ ์ด๋ฏธ์ง ํ์ง์ ์ํฅ์ ๋ฏธ์น๋ฉฐ ๋์ญํญ์ด ์ ํ๋ ์๋๋ฆฌ์ค์์ ์์ ํ ๋ ์ข ์ข ์ค์ํ ์์์ ๋๋ค.
7. ์ธ์ฝ๋ฉ ๋ฐ ๋์ฝ๋ฉ ๋งค๊ฐ๋ณ์ ์ต์ ํ
์ธ์ฝ๋ฉ ๋ฐ ๋์ฝ๋ฉ ํ๋ก์ธ์ค๋ ๋ค์ํ ๋งค๊ฐ๋ณ์๋ฅผ ์กฐ์ ํ์ฌ ๋ฏธ์ธ ์กฐ์ ํ ์ ์์ต๋๋ค. ๋ค์์ ๊ณ ๋ คํ์ญ์์ค.
- ํด์๋: ํด์๋๊ฐ ๋ฎ์์๋ก ํ์ํ ์ฒ๋ฆฌ ๋ฅ๋ ฅ์ด ์ค์ด๋ญ๋๋ค. ๊ณ ํด์๋๊ฐ ํ์๊ฐ ์๋ ๊ฒฝ์ฐ ์ฒ๋ฆฌํ๊ธฐ ์ ์ ๋น๋์ค๋ฅผ ์ถ์ํ๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค.
- ํ๋ ์ ์๋: ํ๋ ์ ์๋๊ฐ ๋ฎ์์๋ก ์ด๋น ์ฒ๋ฆฌํด์ผ ํ๋ ํ๋ ์ ์๊ฐ ์ค์ด๋ญ๋๋ค.
- ๋นํธ ์ ์ก๋ฅ : ๋นํธ ์ ์ก๋ฅ ์ด ๋ฎ์์๋ก ํ์ผ ํฌ๊ธฐ๊ฐ ์์์ง์ง๋ง ์ด๋ฏธ์ง ํ์ง์ด ์ ํ๋ ์๋ ์์ต๋๋ค.
- ํคํ๋ ์ ๊ฐ๊ฒฉ: ํคํ๋ ์ ๊ฐ๊ฒฉ์ ์กฐ์ ํ๋ฉด ์ธ์ฝ๋ฉ ์ฑ๋ฅ๊ณผ ํ์ ๊ธฐ๋ฅ์ ๋ชจ๋ ์ํฅ์ ์ค ์ ์์ต๋๋ค.
๋ค์ํ ๋งค๊ฐ๋ณ์ ์ค์ ์ ์คํํ์ฌ ํน์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ํ ์ฑ๋ฅ๊ณผ ํ์ง ๊ฐ์ ์ต์ ์ ๊ท ํ์ ์ฐพ์ผ์ญ์์ค.
8. ๋น๋๊ธฐ ์์ ๋ฐ ์์ ์ ์ค๋ ๋
ํ๋ ์ ์ฒ๋ฆฌ๋ ๊ณ์ฐ ์ง์ฝ์ ์ผ ์ ์์ผ๋ฉฐ ์ฃผ ์ค๋ ๋๋ฅผ ์ฐจ๋จํ์ฌ ์ฌ์ฉ์ ๊ฒฝํ์ด ๋๋ ค์ง ์ ์์ต๋๋ค. ์ด๋ฅผ ๋ฐฉ์งํ๋ ค๋ฉด async/await
๋๋ Web Workers๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ ์ ์ฒ๋ฆฌ ์์
์ ๋น๋๊ธฐ์ ์ผ๋ก ์ํํ์ญ์์ค.
๋ฐฑ๊ทธ๋ผ์ด๋ ์ฒ๋ฆฌ๋ฅผ ์ํ Web Workers
Web Workers๋ฅผ ์ฌ์ฉํ๋ฉด ๋ณ๋์ ์ค๋ ๋์์ JavaScript ์ฝ๋๋ฅผ ์คํํ์ฌ ์ฃผ ์ค๋ ๋๋ฅผ ์ฐจ๋จํ์ง ์๋๋ก ํ ์ ์์ต๋๋ค. ํ๋ ์ ์ฒ๋ฆฌ ์์ ์ Web Worker๋ก ์คํ๋ก๋ํ๊ณ ๋ฉ์์ง ์ ๋ฌ์ ์ฌ์ฉํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ์ฃผ ์ค๋ ๋๋ก ๋ค์ ์ ๋ฌํ ์ ์์ต๋๋ค.
์์ :
- ํ๋ ์ ์ฒ๋ฆฌ๋ฅผ ์ํํ๋ Web Worker ์คํฌ๋ฆฝํธ๋ฅผ ๋ง๋ญ๋๋ค.
- ์ฃผ ์ค๋ ๋์์ ์ Web Worker ์ธ์คํด์ค๋ฅผ ๋ง๋ญ๋๋ค.
postMessage()
๋ฅผ ์ฌ์ฉํ์ฌVideoFrame
๋ฐ์ดํฐ๋ฅผ Web Worker์ ์ ๋ฌํฉ๋๋ค.- Web Worker์์ ํ๋ ์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ์ฃผ ์ค๋ ๋๋ก ๋ค์ ๊ฒ์ํฉ๋๋ค.
- ์ฃผ ์ค๋ ๋์์ ๊ฒฐ๊ณผ๋ฅผ ์ฒ๋ฆฌํ๊ณ UI๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค.
๊ณ ๋ ค ์ฌํญ: ์ฃผ ์ค๋ ๋์ Web Workers ๊ฐ์ ๋ฐ์ดํฐ ์ ์ก์ ์ค๋ฒํค๋๋ฅผ ๋ฐ์์ํฌ ์ ์์ต๋๋ค. ์ ์ก ๊ฐ๋ฅํ ๊ฐ์ฒด(์: ArrayBuffer
)๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฐ์ดํฐ ๋ณต์ฌ๋ฅผ ํผํ์ฌ ์ด ์ค๋ฒํค๋๋ฅผ ์ต์ํํ ์ ์์ต๋๋ค. ์ ์ก ๊ฐ๋ฅํ ๊ฐ์ฒด๋ ๊ธฐ๋ณธ ๋ฐ์ดํฐ์ ์์ ๊ถ์ "์ ์ก"ํ๋ฏ๋ก ์๋ ์ปจํ
์คํธ๋ ๋ ์ด์ ๋ฐ์ดํฐ์ ์ก์ธ์คํ ์ ์์ต๋๋ค.
9. ํ๋กํ์ผ๋ง ๋ฐ ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง
์ฝ๋๋ฅผ ํ๋กํ์ผ๋งํ๋ ๊ฒ์ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ์๋ณํ๊ณ ์ต์ ํ ๋ ธ๋ ฅ์ ํจ๊ณผ๋ฅผ ์ธก์ ํ๋ ๋ฐ ํ์์ ์ ๋๋ค. ๋ธ๋ผ์ฐ์ ๊ฐ๋ฐ์ ๋๊ตฌ(์: Chrome DevTools, Firefox ๊ฐ๋ฐ์ ๋๊ตฌ)๋ฅผ ์ฌ์ฉํ์ฌ JavaScript ์ฝ๋ ๋ฐ WebAssembly ๋ชจ๋์ ํ๋กํ์ผ๋งํฉ๋๋ค. ๋ค์์ ์ฃผ์ํ์ญ์์ค.
- CPU ์ฌ์ฉ๋: ์๋นํ ์์ CPU ์๊ฐ์ ์๋นํ๋ ํจ์๋ฅผ ์๋ณํฉ๋๋ค.
- ๋ฉ๋ชจ๋ฆฌ ํ ๋น: ๋ฉ๋ชจ๋ฆฌ ํ ๋น ๋ฐ ํ ๋น ํด์ ํจํด์ ์ถ์ ํ์ฌ ์ ์ฌ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ์๋ณํฉ๋๋ค.
- ํ๋ ์ ๋ ๋๋ง ์๊ฐ: ๊ฐ ํ๋ ์์ ์ฒ๋ฆฌํ๊ณ ๋ ๋๋งํ๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ์ธก์ ํฉ๋๋ค.
์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ์ ๊ธฐ์ ์ผ๋ก ๋ชจ๋ํฐ๋งํ๊ณ ํ๋กํ์ผ๋ง ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ต์ ํ ์ ๋ต์ ๋ฐ๋ณตํฉ๋๋ค.
์ค์ ์์ ๋ฐ ์ฌ์ฉ ์ฌ๋ก
WebCodecs API ๋ฐ ํ๋ ์ ์ฒ๋ฆฌ ์ต์ ํ ๊ธฐ์ ์ ๊ด๋ฒ์ํ ์ฌ์ฉ ์ฌ๋ก์ ์ ์ฉํ ์ ์์ต๋๋ค.
- ์ค์๊ฐ ๋น๋์ค ํธ์ง: ์ค์๊ฐ์ผ๋ก ๋น๋์ค ์คํธ๋ฆผ์ ํํฐ, ํจ๊ณผ ๋ฐ ์ ํ์ ์ ์ฉํฉ๋๋ค.
- ๋น๋์ค ํ์: ๋ฎ์ ์ง์ฐ ์๊ฐ ํต์ ์ ์ํด ๋น๋์ค ์ธ์ฝ๋ฉ ๋ฐ ๋์ฝ๋ฉ์ ์ต์ ํํฉ๋๋ค.
- ์ฆ๊ฐ ํ์ค(AR) ๋ฐ ๊ฐ์ ํ์ค(VR): ์ถ์ , ์ธ์ ๋ฐ ๋ ๋๋ง์ ์ํด ๋น๋์ค ํ๋ ์์ ์ฒ๋ฆฌํฉ๋๋ค.
- ๋ผ์ด๋ธ ์คํธ๋ฆฌ๋ฐ: ์ ์ธ๊ณ ์์ฒญ์์๊ฒ ๋น๋์ค ์ฝํ ์ธ ๋ฅผ ์ธ์ฝ๋ฉํ๊ณ ์คํธ๋ฆฌ๋ฐํฉ๋๋ค. ์ต์ ํ๋ ์ด๋ฌํ ์์คํ ์ ํ์ฅ์ฑ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ต๋๋ค.
- ๋จธ์ ๋ฌ๋: ๋จธ์ ๋ฌ๋ ๋ชจ๋ธ(์: ๊ฐ์ฒด ๊ฐ์ง, ์ผ๊ตด ์ธ์)์ ์ํด ๋น๋์ค ํ๋ ์์ ์ ์ฒ๋ฆฌํฉ๋๋ค.
- ๋ฏธ๋์ด ํธ๋์ค์ฝ๋ฉ: ๋น๋์ค ํ์ผ์ ํ ํ์์์ ๋ค๋ฅธ ํ์์ผ๋ก ๋ณํํฉ๋๋ค.
์์ : ๊ธ๋ก๋ฒ ํ์ ํ์ ํ๋ซํผ
์ ์ธ๊ณ์ ๋ถ์ฐ๋ ํ์์ ์ฌ์ฉํ๋ ํ์ ํ์ ํ๋ซํผ์ ์์ํด ๋ณด์ญ์์ค. ๋์ญํญ์ด ์ ํ๋ ์ง์ญ์ ์ฌ์ฉ์๋ ๋น๋์ค ํ์ง์ด ์ ํ๋๊ฑฐ๋ ์ง์ฐ์ด ๋ฐ์ํ ์ ์์ต๋๋ค. WebCodecs์ ์์์ ์ค๋ช ํ ๊ธฐ์ ์ ์ฌ์ฉํ์ฌ ๋น๋์ค ์ธ์ฝ๋ฉ ๋ฐ ๋์ฝ๋ฉ ํ๋ก์ธ์ค๋ฅผ ์ต์ ํํจ์ผ๋ก์จ ํ๋ซํผ์ ๋คํธ์ํฌ ์กฐ๊ฑด์ ๊ธฐ๋ฐ์ผ๋ก ๋น๋์ค ๋งค๊ฐ๋ณ์(ํด์๋, ํ๋ ์ ์๋, ๋นํธ ์ ์ก๋ฅ )๋ฅผ ๋์ ์ผ๋ก ์กฐ์ ํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ์์น ๋๋ ๋คํธ์ํฌ ์ฐ๊ฒฐ์ ๊ด๊ณ์์ด ๋ชจ๋ ์ฌ์ฉ์๋ฅผ ์ํ ์ํํ๊ณ ์์ ์ ์ธ ํ์ ํ์ ํ๊ฒฝ์ ๋ณด์ฅํฉ๋๋ค.
๊ฒฐ๋ก
WebCodecs API๋ ์น ๊ธฐ๋ฐ ๋น๋์ค ์ฒ๋ฆฌ๋ฅผ ์ํ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ๊ธฐ๋ณธ ์ํคํ ์ฒ๋ฅผ ์ดํดํ๊ณ ์ด ๊ฐ์ด๋์์ ์ค๋ช ํ ์ต์ ํ ์ ๋ต์ ์ ์ฉํ๋ฉด ์ ์ฌ๋ ฅ์ ์ต๋ํ ๋ฐํํ๊ณ ๊ณ ์ฑ๋ฅ ์ค์๊ฐ ๋ฏธ๋์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ์ ์์ต๋๋ค. ์ฝ๋๋ฅผ ํ๋กํ์ผ๋งํ๊ณ , ๋ค์ํ ๊ธฐ์ ์ ์คํํ๊ณ , ์ต์ ์ ๊ฒฐ๊ณผ๋ฅผ ์ป๊ธฐ ์ํด ์ง์์ ์ผ๋ก ๋ฐ๋ณตํ๋ ๊ฒ์ ์์ง ๋ง์ญ์์ค. ์น ๊ธฐ๋ฐ ๋น๋์ค์ ๋ฏธ๋๊ฐ ์ฌ๊ธฐ์ ์์ผ๋ฉฐ WebCodecs์ ์ํด ๊ตฌ๋๋ฉ๋๋ค.