๋น๋์ค ํธ์ง๊ธฐ๋ฅผ ๊ฐ๋ฐํ๋ ๊ฐ๋ฐ์๋ค์๊ฒ ํํ ํจ์ ์ "๋ด๋ณด๋ด๊ธฐ" ๋ฒํผ์ ๋ผ์ด๋ธ ๋ฏธ๋ฆฌ๋ณด๊ธฐ์ ์ ์ฅ ์์ ์ฒ๋ผ ์ทจ๊ธํ๋ ๊ฒ์ ๋๋ค. ๋ผ์ด๋ธ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ ์ค์๊ฐ ์๋๋ฅผ ์ํด ์๊ฒฉํ๊ฒ ๊ตฌ์ถ๋ ์ ํด์๋ GPU ๊ทผ์ฌ์น์ ๋๋ค. ํด๋น ํ๋ฉด ๋ณด๊ธฐ๋ฅผ ์บก์ฒํ๊ฑฐ๋ ๋ นํํ๋ ค๊ณ ํ๋ฉด ์ ์ฌ์ ๊ธฐ๊ธฐ์์ ํ๋ฆฟํ ํ์ผ, ์ ๋ ฌ๋์ง ์์ ์ค๋ฒ๋ ์ด, ๊ทธ๋ฆฌ๊ณ ์๋ฆฌ ์๋ ์ถฉ๋์ด ๋ฐ์ํฉ๋๋ค.
๋ด๋ณด๋ด๊ธฐ๋ ์์ ํ ๋ณ๊ฐ์ ์์คํ ์ ๋๋ค. ์๋ณธ ์์ค ํ์ผ์์ ๋น๋์ค๋ฅผ ํ๋ ์ ๋จ์๋ก ์๋ฒฝํ๊ฒ ์ฌ๊ตฌ์ฑํ๋ ํ์ ์ ํ์ดํ๋ผ์ธ์ ๋๋ค. ์ด ๊ฐ์ด๋์์๋ FFmpeg์ ์ฌ์ฉํ์ฌ ์ํฐํ๋ผ์ด์ฆ๊ธ ๋ด๋ณด๋ด๊ธฐ ํ์ดํ๋ผ์ธ์ ๊ตฌ์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์ธ ๊ฒ์ ๋๋ค. ์ด๋ฌํ ์ํคํ ์ฒ ์์น์ ์ดํดํจ์ผ๋ก์จ ์ ํ๋ฆฌ์ผ์ด์ UI๋ฅผ ๋ฉ์ถ์ง ์๊ณ ์ ๋ช ํ๊ณ ํ ํด์๋์ ๋น๋์ค ๋ด๋ณด๋ด๊ธฐ๋ฅผ ์ ๊ณตํ ์ ์์ต๋๋ค.
์ํคํ ์ฒ: ๋ฏธ๋ฆฌ๋ณด๊ธฐ vs ๋ด๋ณด๋ด๊ธฐ ํ์ดํ๋ผ์ธ
์ ๋ขฐํ ์ ์๋ ๋ฏธ๋์ด ์์ง์ ๊ตฌ์ถํ๋ ค๋ฉด ๋ํํ ๋ณด๊ธฐ์ ๋ด๋ณด๋ด๊ธฐ ์ปดํ์ผ์ ๋ถ๋ฆฌํด์ผ ํฉ๋๋ค. ํธ์ง๊ธฐ๋ ์๋๋ฅผ ์ํด ํ๋ ์ ์ ํ๋๋ฅผ ํฌ์ํ์ฌ, ํฐ์น ์ํธ์์ฉ์ด ๋ฐ์์ ์ผ๋ก ๋๊ปด์ง๋๋ก ์ ํด์๋ GPU ํจ์ค๋ฅผ ๋ ๋๋งํฉ๋๋ค. ๋ด๋ณด๋ด๊ธฐ ํ์ดํ๋ผ์ธ์ ์ฆ๊ฐ์ ์ธ ์๋๋ฅผ ์ ํ๋์ ๋ง๋ฐ๊ฟ, ๋ชจ๋ ํ๋ ์์ ์ธ์ฝ๋๋ฅผ ํตํด ์๊ฒฉํ๊ฒ ์ฒ๋ฆฌํ์ฌ ์๊ตฌ์ ์ธ .mp4 ํ์ผ์ ์์ฑํฉ๋๋ค.
| ํ๋ผ๋ฏธํฐ | ๋ผ์ด๋ธ ํธ์ง๊ธฐ (๋ฏธ๋ฆฌ๋ณด๊ธฐ) | ๋ด๋ณด๋ด๊ธฐ ์๋น์ค (ํ์ดํ๋ผ์ธ) |
| ๋ชฉํ | ๋น ๋ฅด๊ฒ ๋ณด๊ธฐ ์ข๊ฒ (60 FPS) | ์ ํํ๊ณ ์ต์ข ์ ์ด์ด์ผ ํจ |
| ์คํ | UI ์ค๋ ๋์์ ๋ํํ | ํค๋๋ฆฌ์ค ๋ฐฑ๊ทธ๋ผ์ด๋ ํ๋ก์ธ์ค |
| ํด์๋ | ์บ๋ฒ์ค ํฌ๊ธฐ (์: 360p) | ํ ํด์๋ (1080p / 4K) |
| ํ๋ ์ ์ฒ๋ฆฌ | UI ์๋๋ฅผ ์ํด ํ๋ ์ ๋๋กญ | ๋ชจ๋ ํ๋ ์์ ์ธ์ฝ๋ฉ |
๋ด๋ณด๋ด๊ธฐ ์์ง์ ๋ ๋ฆฝ์ ์ธ ์ํคํ ์ฒ๋ก ์ทจ๊ธํ๋ฉด ๋ค ๊ฐ์ง ๋ช ํํ ๊ธฐ์ ์ ๊ธฐ๋ฅ์ ์ป์ ์ ์์ต๋๋ค.
- ์์ ๋ณด์ฅ: ์์ ์ ์๊ฒฉํ ์ ํ ์์๋ก ์คํ๋ฉ๋๋ค.
- ์ ์งํ ์งํ๋ฅ : ๊ฐ์ง ํ์ด๋จธ ๋์ ์๋ฃ๋ ํ๋ ์ ์๋ฅผ ์ฌ์ฉํ์ฌ ์งํ๋ฅ ์ ์ ํํ๊ฒ ์ถ์ ํฉ๋๋ค.
- ์ค๋ฅ ๊ฒฉ๋ฆฌ: ๋ฏธ๋์ด ์ฒ๋ฆฌ ์ค๋จ ์ ์ ํํ ๋จ๊ณ ์คํจ ์ง์ ์ ์ฐพ์๋ ๋๋ค.
- ์์ฐ ์ฌ์ฌ์ฉ: ๋ชจ๋ ๋ค์ด์ค๋ ์์ค ํด๋ฆฝ์ ๊ฑธ์ณ ๊ท ์ผํ ์ฒ๋ฆฌ ๊ท์น์ ์ ์ฉํฉ๋๋ค.
6๋จ๊ณ ๋ด๋ณด๋ด๊ธฐ ํ์ดํ๋ผ์ธ ๋ถ์
ํ๋ก๋์ ๋ด๋ณด๋ด๊ธฐ ์๋น์ค๋ ์๋ณธ ๋ฏธ๋์ด ํด๋ฆฝ์ ๋ช ํํ 6๋จ๊ณ ์ํฌํ๋ก์ฐ๋ฅผ ํตํด ๋ผ์ฐํ ํฉ๋๋ค.
์ํคํ ์ฒ ํ๋ฆ๋
Raw Clips โ Stage 0: Prepare โ Stage 1: Transform โ Stage 2: Filters โ Stage 3: Overlays โ Stage 4: Audio โ Stage 5: Merge โ Final MP4
Stage 0 (์ค๋น): ํ๋ก์ ํธ ์์ฐ์ ๊ฒ์ฆํ๊ณ , ์์ ์ฉ ์์ ๋๋ ํฐ๋ฆฌ๋ฅผ ์์ฑํ๋ฉฐ, ffprobe๋ฅผ ์ฌ์ฉํ์ฌ ์ค์ ๋ฏธ๋์ด ์ง์ ์๊ฐ์ ์กฐ์ฌํฉ๋๋ค.
Stage 1 (๋ณํ): ์๋ณธ ๋ฏธ๋์ด๋ฅผ ๋์ ์ข ํก๋น(์: 1080ร1920)๋ก ์ค์ผ์ผ๋งํ๊ณ ํจ๋ฉํ๋ฉฐ, ์ง์ ํฝ์ ํฌ๊ธฐ๋ฅผ ๊ฐ์ ์ ์ฉํฉ๋๋ค.
Stage 2 (ํํฐ): ์์ ์กฐ์ , ๋๋น ์กฐ์ ๋๋ 3D LUT ํ๋ฆฌ์ ์ ๋น๋์ค ํ๋ ์์ ์ต๊ณ ํ์ง๋ก ์ง์ ์ ์ฉํฉ๋๋ค.
Stage 3 (์ค๋ฒ๋ ์ด): ํ ์คํธ๋ ์คํฐ์ปค๋ฅผ ํฌ๋ช PNG๋ก ๋ ๋๋งํ๊ณ , ์ถ๋ ฅ ํฌ๊ธฐ์ ๋ํ ์๋์ ์ธ ๋ถ์ ์ขํ(x = fraction * exportWidth)๋ฅผ ํตํด ์์น๋ฅผ ์ง์ ํฉ๋๋ค.
Stage 4 (์ค๋์ค): ์ํ ๋ ์ดํธ(48kHz)๋ฅผ ์ ๊ทํํ๊ณ , ๊ฒ์ธ ๋ ๋ฒจ์ ์กฐ์ ํ๋ฉฐ, ๋ณ๋์ ๋ฐฐ๊ฒฝ ์์ ํธ๋์ ํด๋ฆฝ ์ค๋์ค์ ๋ฏน์ฑํฉ๋๋ค.
Stage 5 (๋ณํฉ & ์ ์ฅ): ๋ณํ๋ ๋ชจ๋ ๋ฏธ๋์ด ์ธ๊ทธ๋จผํธ๋ฅผ ํตํฉ ์ปจํ ์ด๋๋ก ์ฐ๊ฒฐํ๊ณ ์ต์ข MP4๋ฅผ ์๊ตฌ ์ ์ฅ์๋ก ์ด๋ํฉ๋๋ค.
๊ฐ ํ์ดํ๋ผ์ธ ๋จ๊ณ๋ณ ์ค์ FFmpeg ๋ช ๋ น์ด
Stage 0 & 1: ํธ๋ฆฌ๋ฐ, ์ค์ผ์ผ๋ง ๋ฐ ํจ๋ฉ
๋น ๋ฅธ ํ์์ ์ํด ํญ์ ์ ๋ ฅ ๊ฒฝ๋ก ์์ ํ์ ํ๋๊ทธ(-ss, -to)๋ฅผ ๋ฐฐ์นํ์ญ์์ค. ์ฅ์น ํธํ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด ์ง์ ํ๋ ์ ํฌ๊ธฐ์ ๋ฒ์ฉ yuv420p ํฝ์ ํ์์ ๊ฐ์ ์ ์ฉํ์ญ์์ค.
์ค์ผ์ผ๋ง ๋ฐ ๋ ํฐ๋ฐ์ฑ ์์ ์ค์ :
ffmpeg -ss 00:00:03 -to 00:00:09 -i clip.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 -preset medium -pix_fmt yuv420p out.mp4
Stage 2 & 3: ์์ ๊ทธ๋ ์ด๋ฉ ๋ฐ ๋ถ์ ์ค๋ฒ๋ ์ด
ํ๋ฉด ๋น์จ(y = H * 0.9)๊ณผ ํ์๋ผ์ธ ํ์ ๋ฒ์ ๊ท์น(between(t,2,5))์ ์ฌ์ฉํ์ฌ ์์ ์ดํ๋ผ์ด์ ํํฐ๋ฅผ ์ ์ฉํ๊ณ ๊ทธ๋ํฝ ์ค๋ฒ๋ ์ด๋ฅผ ๋ฐฐ์นํ์ญ์์ค.
์์ ์กฐ์ ๋ฐ ๊ทธ๋ํฝ ์ค๋ฒ๋ ์ด ์์ ์ค์ :
ffmpeg -i video.mp4 -i caption.png \ -filter_complex "[0:v]eq=contrast=1.1:saturation=1.2[bg];\ [bg][1:v]overlay=x=(W-w)/2:y=H*0.9:enable='between(t,2,5)'[v]" \ -map "[v]" -c:v libx264 -pix_fmt yuv420p with_caption.mp4
Stage 4, 5, & ๋จ์ผ ํจ์ค ์ต์ ํ
๋ถํ์ํ ์ค๊ฐ ์ฌ์ธ์ฝ๋ฉ์ผ๋ก ์ธํ ํ์ง ์์ค์ ํผํ๊ธฐ ์ํด ๋ณํ, ์ค๋ฒ๋ ์ด ๋ฐ ์ค๋์ค ๋ฏน์ฑ ์์ ์ ๋จ์ผ -filter_complex ์คํ ํจ์ค๋ก ๊ฒฐํฉํ์ญ์์ค.
์์ ํ ๋จ์ผ ํจ์ค ๋ด๋ณด๋ด๊ธฐ ํ์ดํ๋ผ์ธ ์์ ์ค์ :
ffmpeg -i clip.mp4 -i caption.png -i music.mp3 \ -filter_complex "\ [0:v]scale=1080:1920:force_original_aspect_ratio=decrease,\ pad=1080:1920:(ow-iw)/2:(oh-ih)/2:0xD3D3D3,\ eq=contrast=1.1[bg];\ [bg][1:v]overlay=x=(W-w)/2:y=H*0.9:enable='between(t,2,5)'[v];\ [0:a]volume=0.6[a0];[2:a]volume=0.9[a1];\ [a0][a1]amix=inputs=2:duration=first[aout]" \ -map "[v]" -map "[aout]" \ -c:v libx264 -crf 23 -preset medium -pix_fmt yuv420p \ -c:a aac -b:a 192k -movflags +faststart -y clip_final.mp4
๊ฐ๋ณ ํด๋ฆฝ์ด ์ผ์นํ๋ ํ๋ ์ ๋ ์ดํธ, ์ข ํก๋น ๋ฐ ์ฝ๋ฑ์ ๊ณต์ ํ๋ฉด, ์ฌ์ธ์ฝ๋ฉ ์์ด concat demuxer๋ฅผ ์ฌ์ฉํ์ฌ ์ฆ์ ๋ณํฉํ์ญ์์ค.
์คํธ๋ฆผ ์ฐ๊ฒฐ ์์ ์ค์ :
ffmpeg -f concat -safe 0 -i files.txt -c copy final.mp4
๋ผ์ด๋ธ ํธ์ง๊ธฐ๊ฐ ๊ฐ๊ณผํ๋ 5๊ฐ์ง ํ์ดํ๋ผ์ธ ํ์ค
FFmpeg ๋ฐ์ด๋๋ฆฌ๋ฅผ ํธ์ถํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋๋ฅผ ์์ฑํ ๋, ํ์ดํ๋ผ์ธ์ ๋ค์ ๋ค์ฏ ๊ฐ์ง ์์ธ ์ํฉ์ ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค.
- ์ ๋์ ํ์ ์ฑ: ๋ฐ๋ณต์ ์ธ ์คํ ์ ๋ฐ์ ๊ฑธ์ณ ๋์ผํ ์ถ๋ ฅ ํ์ผ์ ์์ฑํ๊ธฐ ์ํด ํ๋ ์ ๋๋กญ์ ์ ๊ฑฐํฉ๋๋ค.
- ํค๋๋ฆฌ์ค ์คํ: ํ๋ฉด ๋ ๋๋ง ํฌ์ปค์ค๋ฅผ ์๊ตฌํ์ง ์๊ณ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ค๋ ๋์์ ๋ฏธ๋์ด๋ฅผ ๊น๋ํ๊ฒ ์ฒ๋ฆฌํฉ๋๋ค.
- ์ฝ๋ฑ ์ ์ฝ ์กฐ๊ฑด: ์ง์ ํฝ์ ๊ฒฝ๊ณ ํฌ๊ธฐ(์: ํ์ ๋๋น ์๋ฅด๊ธฐ)์ ๊ฐ์ ์๊ฒฉํ ์ธ์ฝ๋ฉ ๊ท์น์ ์ฒ๋ฆฌํฉ๋๋ค.
- ์์ ์ทจ์ ๋ฐ ์ ๋ฆฌ: ์ค๊ฐ ์์ ํ์ผ์ ์ ๊ฑฐํ๊ณ ์ฌ์ฉ์ ์ทจ์๋ฅผ ์ฐ์ํ๊ฒ ์ฒ๋ฆฌํ์ฌ ์ ์ฅ ๊ณต๊ฐ ๊ณผ๋ถํ๋ฅผ ๋ฐฉ์งํฉ๋๋ค.
- ์ค์ ์งํ๋ฅ ์๊ฒฉ ์ธก์ : FFmpeg -progress pipe:1 ํต๊ณ(out_time_ms)๋ฅผ ํ์ฑํ์ฌ ์ถ์ ์น ๋์ ์ ํํ ์งํ๋ฅ ๋ฐ๋ฅผ ๊ตฌ๋ํฉ๋๋ค.
์ค์ ์ํฉ / ์์
MicrocosmWorks์์, ์ ํฌ๋ ํ ๋น๋์ค ํธ์ง ํ๋ซํผ์ด ๋ชจ๋ฐ์ผ ๊ธฐ๊ธฐ์์ ๋ฐ์ํ๋ ์ฆ์ ๋ด๋ณด๋ด๊ธฐ ์ถฉ๋, ๋ฉ๋ชจ๋ฆฌ ๋์ ๋ฐ ์ ๋ ฌ๋์ง ์์ ์บก์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋๋ก ๋์์ต๋๋ค. ๊ทธ๋ค์ ์๋ ์ํคํ ์ฒ๋ ๋ผ์ด๋ธ UI ๋ฏธ๋ฆฌ๋ณด๊ธฐ์์ ์บ๋ฒ์ค ํ๋ ์์ ์ง์ ๋ นํํ๋ ค๊ณ ์๋ํ์ต๋๋ค.
์ ํฌ๋ ์ด ์ ๊ทผ ๋ฐฉ์์ ๋ ๋ฆฝ๋ ๋ฐฑ๊ทธ๋ผ์ด๋ FFmpeg ํ์ดํ๋ผ์ธ์ผ๋ก ๋์ฒดํ์ต๋๋ค. ํ๋์ฝ๋ฉ๋ ํฝ์ ์ขํ๋ฅผ ์ ๊ทํ๋ ๋ถ์ ๋ฒกํฐ๋ก ๋ณํํ๊ณ , ์๊ฒฉํ ์ ๊ณต๊ฐ ๋ณํ์ ๊ฐ์ ํ๋ฉฐ, ์ธ์ฝ๋ฉ์ ๋ฉ์ธ UI ์ค๋ ๋๋ก๋ถํฐ ๋ถ๋ฆฌํจ์ผ๋ก์จ, ๋ด๋ณด๋ด๊ธฐ ์คํจ๋ฅผ ์์ ํ ์ ๊ฑฐํ์ต๋๋ค. ์ฌ์ฉ์๋ค์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ต์ํํ ์ํ์์๋ ๋น๋์ค๊ฐ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์ํํ๊ฒ ์ปดํ์ผ๋๋๋ก ํ ์ ์์์ต๋๋ค.
๊ฒฐ๋ก
๋น๋์ค ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ ๊ฐ๋ฒผ์ด ์ค์ผ์น์ธ ๋ฐ๋ฉด, ๋ด๋ณด๋ด๊ธฐ ํ์ดํ๋ผ์ธ์ ์ต์ข ๊ทธ๋ฆผ์ ๋๋ค. ๋ด๋ณด๋ด๊ธฐ ์๋น์ค๋ฅผ ๋ ๋ฆฝ์ ์ธ ๋ค๋จ๊ณ FFmpeg ํ์ดํ๋ผ์ธ์ผ๋ก ๊ตฌ์ถํ๋ฉด ํ๋ ์ ๋จ์์ ์๋ฒฝํ ํ์ง, ํ์ ์ ์ธ ์์ฐ ์ ๋ ฌ, ๊ทธ๋ฆฌ๊ณ ๋ชจ๋ ์ฅ์น์์ ์ถฉ๋ ์๋ ๋ ๋๋ง ์ฑ๋ฅ์ ๋ณด์ฅํฉ๋๋ค.
ํ์ฅ ๊ฐ๋ฅํ ๋ฏธ๋์ด ์ธํ๋ผ์ ๊ฒฌ๊ณ ํ ์๋ํ๋ ์ฒ๋ฆฌ ํ์ดํ๋ผ์ธ์ ์ค๊ณํ๋ ๊ฒ์ด MicrocosmWorks ์์ง๋์ด๋ง ์์ ์ ํต์ฌ ์ด์ ์ ๋๋ค.
๋น๋์ค ํธ์ง๊ธฐ๋ฅผ ๊ฐ๋ฐํ๊ณ ์๋๋ฐ ๋ด๋ณด๋ด๊ธฐ ์ถฉ๋, ํ๋ฆฟํ ๋ ๋๋ง ๋๋ ํ๋ ์ ๋๋ฆฌํํธ๊ฐ ๋ฐ์ํ๋์?
๊ทธ๊ฒ์ ๊ฑฐ์ ํญ์ FFmpeg ๋ฌธ์ ๊ฐ ์๋๋ผ ์ํคํ
์ฒ ๋ฌธ์ ์
๋๋ค. MicrocosmWorks์ ์์ง๋์ด๋ง ํ์ ํค๋๋ฆฌ์ค ๋ด๋ณด๋ด๊ธฐ ์๋น์ค๋ถํฐ ์ ์ํ ์คํธ๋ฆฌ๋ฐ ๋ฐ OTT ์ ๋ฌ์ ์ด๋ฅด๊ธฐ๊น์ง ํ๋ก๋์
๊ธ ๋น๋์ค ๋ฐ ๋ฏธ๋์ด ํ์ดํ๋ผ์ธ์ ๊ตฌ์ถํ์ฌ, ๊ทํ์ ์ฑ์ด UI๋ฅผ ๋ฉ์ถ์ง ์๊ณ ํ๋ ์ ๋จ์๋ก ์๋ฒฝํ ๋น๋์ค๋ฅผ ์ ๊ณตํ๋๋ก ํฉ๋๋ค. ๊ทํ์ ๋ด๋ณด๋ด๊ธฐ ์ํคํ
์ฒ์ ๋ํด ๋
ผ์ํ์๊ฑฐ๋ ์ ํฌ๊ฐ ๋ค๋ฅธ ํ์ ์ํด ์ด๋ป๊ฒ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋์ง ์ ํฌ์ ์์
์์ ํ์ธํด ๋ณด์ญ์์ค.
๋ค๋ฅธ ๋ธ๋ก๊ทธ
1. ๋ค์ํ ๋น๋์ค ํด์๋์ ๋ง์ถฐ ์ฑ๋ ๋ก๊ณ ์ต์ ํ
2. ํ ์ ์ ์ฐ๊ณ , ํ ๋ผ ๊ธฐ๋กํ๊ธฐ: ์ปดํจํฐ ๋น์ ์์ ํ์ดํ๋ผ์ธ
3. ๋ค์ํ ๋น๋์ค ํด์๋์ ๋ง์ถฐ ์ฑ๋ ๋ก๊ณ ์ต์ ํ

