๋ด ๋น๋์ค ๋ฏธ๋ฆฌ๋ณด๊ธฐ๊ฐ ๋ด๋ณด๋ด๊ธฐ ๊ฒฐ๊ณผ์ ๋ค๋ฅธ ์ด์
๋น๋์ค ํธ์ง๊ธฐ๋ ์์ฑ๋ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค. ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ ์ ๋ช ํ๊ณ , ์๋ง์ ์ฌ์ฉ์๊ฐ ๋๋๊ทธํ ์ ํํ ์์น์ ์์ผ๋ฉฐ, ํ์๋ผ์ธ์ ๋ถ๋๋ฝ๊ฒ ์คํฌ๋ฝ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ค๊ฐ ์ฌ์ฉ์๊ฐ ๋ด๋ณด๋ด๊ธฐ(Export)๋ฅผ ๋๋ฅด๋ฉด ์๋ง์ด ์๋ฑํ ์์น์, ์๋ฑํ ํฌ๊ธฐ๋ก ๋ํ๋๋ฉฐ, ๋๋ก๋ ๊ฐ์ฅ์๋ฆฌ์์ ์์ ํ ์๋ ค ๋์ต๋๋ค. ์๋ฌด๊ฒ๋ ์ถฉ๋ํ์ง ์์๊ณ , ๋ก๊ทธ์ ์ค๋ฅ๋ ์์ต๋๋ค. ๋ฏธ๋ฆฌ๋ณด๊ธฐ์ ํ์ผ์ด ๋จ์ํ ์ผ์นํ์ง ์์ ๋ฟ์ ๋๋ค.
์ด๊ฒ์ ๋ชจ๋ ๋น๋์ค ํธ์ง๊ธฐ์์ ๊ฐ์ฅ ํํ ๋ฒ๊ทธ์ด๋ฉฐ, ๋ ๋๋ง ๋ฌธ์ ๋ผ๊ธฐ๋ณด๋ค๋ ๋ฐ์ดํฐ ๋ชจ๋ธ๋ง ๋ฌธ์ ์ ๋๋ค. ์๋์์๋ ์ด ๋ฒ๊ทธ๋ฅผ ๋ฐ์ํ์ง ์๊ฒ ํ๋ ํ ๊ฐ์ง ์ต๊ด, ํ๋ฉด ๋น์จ์์ ํ๋ ์์ ์ฌ๋ฐ๋ฅด๊ฒ ํฌ๊ธฐ ์กฐ์ ํ๋ ๋ฐฉ๋ฒ, ๊ทธ๋ฆฌ๊ณ ์ ๊ฐ ํด๋ํฐ์์๋ ๋๋๊ทธ๋ฅผ ๋น ๋ฅด๊ฒ ์ ์งํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํฉ๋๋ค. ์ด ์์ด๋์ด๋ ๋ชจ๋ ์ธ์ด๋ UI ํ๋ ์์ํฌ์ ์ ์ฉ๋ฉ๋๋ค.
ํ๋ฉด ๋น์จ์ ํํ์ด๊ณ , ํด์๋๋ ํฌ๊ธฐ์ ๋๋ค
๋๋ถ๋ถ์ ํ๋ ์ ๋ฒ๊ทธ๋ ์ฌ๊ธฐ์ ์์๋ฉ๋๋ค. ํ๋ฉด ๋น์จ(Aspect ratio)์ ํ๋ ์์ ํํ๋ง์ ์ค๋ช ํฉ๋๋ค. 9:16์ ์ธ๋กํ์ด๊ณ , 16:9๋ ๊ฐ๋กํ์ ๋๋ค. ํด์๋(Resolution)๋ 1080x1920๊ณผ ๊ฐ์ด ํฝ์ ๋จ์์ ํฌ๊ธฐ๋ฅผ ์ค๋ช ํฉ๋๋ค. ํ๋์ ํํ๋ ์ฌ๋ฌ ํฌ๊ธฐ๋ฅผ ์ง์ํ๋ฏ๋ก, ์ด ๋ ๊ฐ์ ๊ฒฐ์ฝ ์๋ก ๋ฐ๊ฟ ์ฌ์ฉํ ์ ์์ต๋๋ค.
| ํ๋ฉด ๋น์จ | ์ซ์ ๊ฐ | ์ผ๋ฐ์ ์ธ ์ฉ๋ |
| 16:9 | 1.78 | YouTube, ๊ฐ๋กํ ์น |
| 9:16 | 0.56 | Reels, TikTok, Shorts |
| 1:1 | 1.00 | ์ ์ฌ๊ฐํ ํผ๋ ๊ฒ์๋ฌผ |
| 4:5 | 0.80 | ์ธ๋กํ ํผ๋ ๊ฒ์๋ฌผ |
๋น์จ์ ์ผ๋ฐ ํ ์คํธ๋ก ์ ์ฅํ๊ณ ๊ณ์ฐํ ๋๋ง ์ซ์๋ก ๋ณํํ์ธ์. ๋ด๋ณด๋ด๊ธฐ(export)์ ๋ชฉํ ๋์ด๋ฅผ ์ ์ฅํ ๋ค์, ๋น์จ์์ ๋๋น๋ฅผ ๋์ถํ๊ณ , ์ธ์ฝ๋์ ๋๋ฌํ๊ธฐ ์ ์ ๋ ์ซ์๋ฅผ ๋ชจ๋ ์ง์๋ก ๋ง๋์ธ์. ํ์ ์น์๋ ์์ธ๋ก ๋ง์ ๋ด๋ณด๋ด๊ธฐ ์คํจ์ ์กฐ์ฉํ ์์ธ์ ๋๋ค.
height = width / ratioToNumber(ratio) // sizing the preview box
function widthFromHeight(ratio, height): raw = height * ratioToNumber(ratio) return makeEven(round(raw)) // encoders require even sides
// 9:16 at 1080 tall -> 608 x 1080// 16:9 at 1080 tall -> 1920 x 1080
์์น๋ ํฝ์ ์ด ์๋ ๋ถ์๋ก ์ ์ฅํ์ธ์
ํธ์ง๊ธฐ๋ ์ธ ๊ฐ์ง ๋ค๋ฅธ ํฌ๊ธฐ์ ์ธ ๊ฐ์ง ์ธ๊ณ์ ์กด์ฌํฉ๋๋ค: ์ ์ฅ๋ ๋ฌธ์, ํ๋ฉด ๋ฏธ๋ฆฌ๋ณด๊ธฐ, ๊ทธ๋ฆฌ๊ณ ๋ด๋ณด๋ด์ง ํ์ผ์ ๋๋ค. ๋ฌธ์๋ ์ ์ผํ ์ง์ค์ ์์ฒ์ด๋ฉฐ, ๋ค๋ฅธ ๋ ๊ฐ์ง๋ ๋จ์ง ๋ค๋ฅธ ์ค์ผ์ผ๋ก ๋ ๋๋ง๋ ๊ฒ์ผ ๋ฟ์ ๋๋ค.
Project -> Clip (source, trim, filters) -> Overlay (text / sticker)
Document Preview renderer Export renderer x = 0.5, y = 0.9 --> x * 360 px --> x * 1080 px --> MP4 | ^ ^ +------------------------+------------------------+ ํ๋์ ์ ์ฅ๋ ๋ถ์, ํ๋์ ๊ณต์, ๋ ๊ฐ์ง ํฌ๊ธฐ
540 ํฝ์ ์ ์ ์ฅํ๋ฉด ๊ทธ ์ซ์๋ ์ธก์ ๋ ๊ธฐ๊ธฐ์์๋ง ์ฌ๋ฐ๋ฆ ๋๋ค. 0.5๋ฅผ ์ ์ฅํ๋ฉด, ์ด๋ ๋ชจ๋ ํฌ๊ธฐ์์ ์์ํ "์ํ ์ค์"์ ์๋ฏธํฉ๋๋ค. ๋ชจ๋ธ์ ๋ชจ๋ ์์น, ์คํ์ ๋ฐ ์ค์ผ์ผ์ 0๊ณผ 1 ์ฌ์ด์ ๋ถ์์ฌ์ผ ํฉ๋๋ค.
type Overlay { x: number // ๊ฐ๋ก 0.0-1.0 (0.5 = ์ค์) y: number // ์ธ๋ก 0.0-1.0 (0.9 = ๊ฑฐ์ ํ๋จ) scale: number // 1.0 = ๋ณดํต ํฌ๊ธฐ rotation: number // ๊ฐ๋ startTimeMs: number // ๋ํ๋๋ ์๊ฐ endTimeMs: number // ์ฌ๋ผ์ง๋ ์๊ฐ}
๊ทธ๋ฌ๋ฉด ๋ด๋ณด๋ด๊ธฐ(Export)๋ ๊ฑฐ์ ์ง๋ฃจํด์ง๋๋ฐ, ์ด๊ฒ์ด ํต์ฌ์
๋๋ค. ๋ ๋๋ฌ๋ ๋ฏธ๋ฆฌ๋ณด๊ธฐ์ ๋์ผํ ๊ณต์์ ๋ ํฐ ์น์(multiplier)๋ก ์ฌ์ฉํฉ๋๋ค: px = overlay.x * exportWidth. FFmpeg๋ ํ๋ ์ ์์ฒด๋ฅผ ์ฒ๋ฆฌํ๋ฉฐ, ์ค์ ์ ๋ ฌ ํํ์ (ow-iw)/2์ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๊ฐ ๋ ํฐ๋ฐ์ค๋ฅผ ๋ง๋๋ ๋ฐ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๋์ผํ ์ฐ์ ์
๋๋ค. ์ ์ฅ๋ ๊ฐ์ด ๋ณ๊ฒฝ๋์ง ์์๊ธฐ ๋๋ฌธ์, ์๋ง์ ์ ํํ ์ฌ๋ฐ๋ฅธ ์์น์ ๋์
๋๋ค.
ffmpeg -i input.mp4 \ -vf "scale=1080:1920:force_original_aspect_ratio=decrease,\ pad=1080:1920:(ow-iw)/2:(oh-ih)/2:0xD3D3D3" \ -c:v libx264 -crf 23 -pix_fmt yuv420p -c:a aac output.mp4
๋จ์ผ ํจ์ค๋ก ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๊ทธ๋ฆฌ๊ธฐ
ํด๋ํฐ, ํ๋ธ๋ฆฟ, ํฌ๊ธฐ ์กฐ์ ๋ ๋ฐ์คํฌํฑ ์ฐฝ์ ๋ชจ๋ ๋ค๋ฅธ ํฌ๊ธฐ๋ฅผ ์ ๊ณตํ๋ฏ๋ก, ๋ฏธ๋ฆฌ๋ณด๊ธฐ ์์๋ฅผ ํ๋์ฝ๋ฉํ๋ ๋์ ๋ฐํ์์ ์ธก์ ํ์ธ์. ๊ฐ ์ค๋ฒ๋ ์ด๋ฅผ ๋ณ๋์ UI ์์๋ก ๋ง์ดํธํ๋ ๋์ , ๋จ์ผ ์บ๋ฒ์ค ํจ์ค๋ก ๋ชจ๋ ์ค๋ฒ๋ ์ด๋ฅผ ๊ทธ๋ฆฌ์ธ์. ๋จ์ผ ํจ์ค๋ ์๊ฐ๋ฝ์ด ์์ง์ด๋ ๋์ ๋ถ๋๋ฌ์์ ์ ์งํฉ๋๋ค.
๋ ๊ฐ์ง ๊ท์น์ ๋ฃจํ๋ฅผ ์ ์งํ๊ฒ ์ ์งํฉ๋๋ค. ์๊ฐ ๋ฒ์ ๋ฐ์ ์ค๋ฒ๋ ์ด๋ ๊ฑด๋๋ฐ๊ณ , ํญ์ save()์ restore()๋ฅผ ์ง์ง์ด ์ฌ์ฉํด์ ํ ํญ๋ชฉ์ ๋ณํ์ด ๋ค์ ํญ๋ชฉ์ผ๋ก ์์ด ๋๊ฐ์ง ์๋๋ก ํ์ธ์.
function drawPreview(canvas, overlays, currentTime, box): for each overlay in overlays: if currentTime < overlay.startTimeMs: ๊ฑด๋๋ฐ๊ธฐ if currentTime > overlay.endTimeMs: ๊ฑด๋๋ฐ๊ธฐ
px = overlay.x * box.width // ํต์ฌ ๊ณต์ py = overlay.y * box.height
canvas.save() canvas.move(px, py) canvas.rotate(overlay.rotation) canvas.resize(overlay.scale) canvas.drawText(overlay.content) canvas.restore() // ์ ๋ ์ ํ ์ฌํญ์ด ์๋
๋ ๋จ๊ณ ์ํ๋ก ๋๋๊ทธ๋ฅผ ๋ถ๋๋ฝ๊ฒ ์ ์งํ๊ธฐ
๋๋๊ทธํ๋ ์๊ฐ๋ฝ์ ์ด๋น ์ฝ 60๊ฐ์ ์์น๋ฅผ ๋ณด๊ณ ํฉ๋๋ค. ๊ฐ๊ฐ์ด ํ๋ก์ ํธ ์ ์ฅ์์ ๊ธฐ๋ก๋๋ค๋ฉด, ์ด๋น 60๋ฒ์ ์ ํจ์ฑ ๊ฒ์ฌ, ์์์ฑ ๋ฐ ์ ์ฒด ์ํ ์ฌ๊ตฌ์ฑ์ ๋ํ ๋น์ฉ์ ์ง๋ถํด์ผ ํ๋ฉฐ, ๋๋๊ทธ๋ ๋์ ๋๊ฒ ๋๊น๋๋ค. ๋์ ์์ ์ ๋ ๋จ๊ณ๋ก ๋๋์ธ์:
- 1๋จ๊ณ, ์ผ์์ (ephemeral): ์๊ฐ๋ฝ์ด ํ์ฌ ์๋ ์์น๋ฅผ ์ ์ฅํ๋ ์์
liveDrag๋งต์ ๋๋ค. ๋ชจ๋ ์ด๋ ์ ์ด๋ฅผ ์ ๋ฐ์ดํธํ๊ณ ์บ๋ฒ์ค๋ฅผ ๋ค์ ๊ทธ๋ฆฝ๋๋ค. ๋ค๋ฅธ ์ด๋ค ๊ฒ๋ ์คํ๋์ง ์์ต๋๋ค. - 2๋จ๊ณ, ์๊ตฌ์ (durable): ๋๋๊ทธ๊ฐ ๋๋๋ฉด ์ต์ข
๋ถ์๋ฅผ ํ๋ก์ ํธ ๋ชจ๋ธ์ ์ค๋ฒ๋ ์ด์ ์ปค๋ฐํ๊ณ ,
liveDragํญ๋ชฉ์ ์ง์ฐ๋ฉฐ, ํ๋์ ์คํ ์ทจ์(undo) ๋จ๊ณ๋ฅผ ๊ธฐ๋กํฉ๋๋ค.
์ด์ ์ ํ๋ ์ ์๋๋ฅผ ๋์ด์ญ๋๋ค. ๋๋๊ทธ๊ฐ ์๋ฐฑ ๊ฐ ๋์ ํ๋์ ํญ๋ชฉ์ ์์ฑํ๋ฏ๋ก ์คํ ์ทจ์(Undo) ๊ธฐ๋ก์ ์ ์ฉํ๊ฒ ์ ์ง๋๋ฉฐ, ์๋ ์ ์ฅ์ ๋์คํฌ ๊ณผ๋ถํ๋ฅผ ๋ฐฉ์งํฉ๋๋ค. ์ด๊ฒ์ด Figma์ Canva๊ฐ ์ง์ ์กฐ์์ ๋ฐ์์ ์ผ๋ก ์ ์งํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
์ค์ ์ฌ๋ก
MicrocosmWorks์์๋ ๋ด๋ณด๋ด๊ธฐ ์ ์๋ง์ด ๋ฐ๋ฆฌ๋ ๋จํธ ๋น๋์ค ํธ์ง๊ธฐ๋ฅผ ๋ค๋ฃจ์์ต๋๋ค. ํ์ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ์บ๋ฒ์ค์์ ์ง์ ์ฝ์ ์ฅ์น ํฝ์ ๋ก ์ค๋ฒ๋ ์ด ์์น๋ฅผ ์ ์งํ๊ธฐ ๋๋ฌธ์, ์์ ํด๋ํฐ์์ ์์ฑ๋ ์๋ง์ 1080p ํ์ผ์์ ๋๊ฒ ์์นํ๊ณ ์๊ฒ ๋ํ๋ฌ์ผ๋ฉฐ, ํ๋ฉด ๋น์จ์ ์ ํํ๋ฉด ์ผ๋ถ ์ค๋ฒ๋ ์ด๊ฐ ํ๋ ์์ ์์ ํ ๋ฒ์ด๋๊ฒ ๋์์ต๋๋ค.
์ ํฌ๋ ๋ชจ๋ธ์ ์ ๊ทํ๋ 0-1 ์ขํ๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ๊ณ , ๋ ๋ ๋๋ฌ๊ฐ ๋จ์ผ '๋ถ์ ๊ณฑํ๊ธฐ ํฌ๊ธฐ' ํฌํผ๋ฅผ ๊ณต์ ํ๋๋ก ํ์ผ๋ฉฐ, ์ ์ฅ๋ ๋น์จ์์ ํ์๋ ์ง์ ์ถ๋ ฅ ์น์๋ฅผ ๊ฐ์ ํ์ต๋๋ค. ๋ฏธ๋ฆฌ๋ณด๊ธฐ์ ๋ด๋ณด๋ด๊ธฐ๋ ๋ชจ๋ ํ ์คํธ ์ฅ์น์์ ์ผ์นํ์ต๋๋ค. ๋๋๊ทธ ์ปค๋ฐ์ ๋๋๊ทธ ๋์ผ๋ก ์ด๋ํจ์ผ๋ก์จ ์ ์ฌ์ Android ํ๋์จ์ด์์ ์ฌ์ฉ์๋ค์ด ๋ณด๊ณ ํ๋ ์ง์ฐ์ ์์ด์ต๋๋ค. ์ด๋ฌํ ๋จํธ ๋น๋์ค ๋ฐ ํธ์ง ์์ ์ด ์ด๋ค ์ข ๋ฅ์ธ์ง ํ๋ก์ ํธ ํฌํธํด๋ฆฌ์ค์์ ํ์ธํ ์ ์์ต๋๋ค.
๊ฒฐ๋ก
๋ฏธ๋ฆฌ๋ณด๊ธฐ์ ๋ด๋ณด๋ด๊ธฐ๋ ํ๋์ ๋ฌธ์์ ๋ํ ๋ ๊ฐ์ง ๋ ๋๋ง์ด๋ฏ๋ก, ๊ทธ๋ค์๊ฒ ํ๋์ ์ง์ค์ ์์ฒ์ ์ ๊ณตํ์ธ์. ์์น๋ ๋ถ์๋ก ์ ์ฅํ๊ณ , ๋ ๋ ๋๋ฌ์์ ๋์ผํ '๋ถ์ ๊ณฑํ๊ธฐ ํฌ๊ธฐ' ๊ณต์์ ์ฌ์ฉํ๋ฉฐ, ํ๋ฉด ๋น์จ์์ ๋๋น๋ฅผ ๋์ถํ๊ณ , ์น์๋ฅผ ์ง์๋ก ์ ์งํ๋ฉฐ, ์๊ฐ๋ฝ์ด ๋ค๋ ธ์ ๋๋ง ๋๋๊ทธ ๋ณ๊ฒฝ ์ฌํญ์ ์ปค๋ฐํ์ธ์. ์ด ๋ค์ฏ ๊ฐ์ง ์ต๊ด์ ๋ฒ๊ทธ๊ฐ ์์ฑ๋๊ธฐ ์ ์ ์ ์ฒด ๋ฒ๊ทธ ๋ฒ์ฃผ๋ฅผ ์ ๊ฑฐํฉ๋๋ค.
์ธํฐ๋ํฐ๋ธ ๋ทฐ์ ์ต์ข ํ์ผ์ด ์ผ์นํ๋ ๋ฏธ๋์ด ์์ง์ ๊ตฌ์ถํ๋ ๊ฒ์ MicrocosmWorks์ ๋น๋์ค ๋ฐ ์คํธ๋ฆฌ๋ฐ ์์ง๋์ด๋ง ์์ ์ ํต์ฌ ์ด์ ์ ๋๋ค.
๋น๋์ค ๋๋ ์ฝํ ์ธ ํธ์ง๊ธฐ๋ฅผ ์ถ์ํ ์์ ์ด๋ฉฐ ๋ฏธ๋ฆฌ๋ณด๊ธฐ์ ๋ด๋ณด๋ด๊ธฐ ๊ฒฐ๊ณผ๊ฐ ์ค์ ๋ก ์ผ์นํ๊ธฐ๋ฅผ ์ํ์ญ๋๊น? ์ ํฌ๋ ๋จํธ ํธ์ง ๋๊ตฌ์์ ์ด์ ๋๊ฐ์ ์ ํ์ ๋ฒ๊ทธ๋ฅผ ํด๊ฒฐํ์ต๋๋ค. ์ ํฌ ์์ง๋์ด๋ง ํ์ ๋ฌธ์ํ์ธ์ โ
์ ํฌ ํ์ ๋ ๋ง์ ๊ธ ์ฝ๊ธฐ
1. ๋ค์ํ ๋น๋์ค ํด์๋์ ๋ง์ถฐ ์ฑ๋ ๋ก๊ณ ์ต์ ํํ๊ธฐ
2. ์ ์ ์ฌ์ง ์ฐ๊ณ ์์ฌ ๊ธฐ๋กํ๊ธฐ: ์ปดํจํฐ ๋น์ ์์ ํ์ดํ๋ผ์ธ
3. ๋ค์ํ ๋น๋์ค ํด์๋์ ๋ง์ถฐ ์ฑ๋ ๋ก๊ณ ์ต์ ํํ๊ธฐ

