๋น๋์ค ์๋ํ ํ์ดํ๋ผ์ธ์ ์ํ ๋ถ๋ฅ๋ FFmpeg ๋ช ๋ น์ด ๋ชจ์์ง์ ๋๋ค.
์์ ๋ง์ ์์ ์ ์๊ฐ์ ์ป๊ฑฐ๋, FFmpeg ๋ช ๋ น์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ฑฐ๋, ์๋ํ๋ ๋ฏธ๋์ด ์ฑ์์ ๋ค๋ฅธ ์ฌ๋๋ค์ด ๋ฌด์์ ๋ง๋ค๊ณ ์๋์ง ํ๊ตฌํ๋ ๋ฐ ์ฌ์ฉํ์ธ์.
-
GitHub์ MD ํ์ผ ์ ์ฒด ๋ณด๊ธฐ์์ ๊ฐ์ฅ ์ ๋ณด์ด๋ ๋ชฉ์ฐจ๋ฅผ ์ฌ์ฉํ์ฌ ๋ค๋ฃจ๋ ์ฃผ์ ์ฃผ์ ๋ค์ ํ์ํ์ธ์.
-
Ctrl + F๋ฅผ ์ฌ์ฉํ์ฌ ํ์ํ ๊ฒ์ ์ฐพ์ผ์ธ์. ๋ชจ๋ ๋ช ๋ น์ด, ํํฐ, ํ๋๊ทธ๊ฐ ๋ฌธ์ ์ ์ฒด์ ์ค๋ช ๋์ด ์์ต๋๋ค. ํน์ ์ค๋ช ์ด ๋ณด์ด์ง ์๋๋ค๋ฉด ์ด ๋ฌธ์์ ๋ค๋ฅธ ๊ณณ์ ์๋ค๋ ๋ป์ด๋ฏ๋ก ๊ฒ์ํ ์ ์์ต๋๋ค (์ฐพ์ ์ ์๋ค๋ฉด ์ด์๋ฅผ ์ด์ด์ฃผ์๋ฉด ์ฒ๋ฆฌํ๊ฒ ์ต๋๋ค).
-
๋ชจ๋ ์ํ ๋ช ๋ น์ด๋ ์จ๋ผ์ธ์ ์ ์ฅ๋ ์ํ ํ์ผ์ ์ฌ์ฉํ๋ฏ๋ก FFmpeg๊ฐ ๋ก์ปฌ๋ก ๋ค์ด๋ก๋ํ ์ ์์ด ๋ก์ปฌ ๋จธ์ ์์ ์ฆ์ ์คํํ ์ ์์ต๋๋ค.
-
๊ฐ ๋ช ๋ น์ด, ํํฐ, ํ๋๊ทธ, ํค์๋, ์ค๋ช ์ ์๋ณธ ์ฐธ์กฐ๋ฅผ ์ฒจ๋ถํ์ต๋๋ค. ์ด๋ฅผ ์ฌ์ฉํ์ฌ FFmpeg์ ์ผ๋ฐ์ ์ผ๋ก ๋น๋์ค ํ์์ ๋ ๊น์ด ํ๊ณ ๋ค ์ ์์ต๋๋ค. ์ผ๋ถ ๋ฐ๊ฒฌ์ฌํญ์ ์ ๊ฒ์ด๋ฉฐ, ์ด ๊ฒฝ์ฐ ์ฐธ์กฐ๋ฅผ ๋ช ์ํ์ง ์์์ต๋๋ค.
-
๊ณต๊ฐ์ ์ ์ฝํ๊ธฐ ์ํด ๋๋กญ๋ค์ด ํ์ดํ๋ฅผ ์ฌ์ฉํ์ต๋๋ค. ํด๋ฆญํ๋ฉด ๋ ์์ธํ ๋ด์ฉ์ ๋ณผ ์ ์์ต๋๋ค. ๋ธ๋ผ์ฐ์ ๋ ์ด๋ฌํ ์จ๊ฒจ์ง ์น์ ์ ํ ์คํธ๋ฅผ ๊ฒ์ํ์ฌ ํ์ํ ๋ ํ์ํ ์ ์์ต๋๋ค.
-
์ด ์นํธ์ํธ๋ฅผ ์ต๋ํ ํ์ฉํ๋ ค๋ฉด ์ข์ํ๋ LLM(๋๋ MCP ์๋ฒ๋ AI ์์ด์ ํธ)๊ณผ ํจ๊ป ์ฌ์ฉํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ต๋๋ค. ๋ช ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ต๋๋ค:
- ์ ์ฒด ํ ์คํธ๋ฅผ LLM์ ๋ณต์ฌํ์ฌ ์ฌ๊ธฐ์ ์ฐพ์ ๋ชจ๋ ์ ๋ณด๋ฅผ LLM์ด ์์ธํํ๋๋ก ํ์ธ์. ์ต์์ ๊ฒฐ๊ณผ๋ฅผ ์ํด MD ํ์ผ์ RAW ๋ฒ์ ์ ๋ณต์ฌํด์ผ ํฉ๋๋ค.
- ์ด ํ์ผ์ URL์ LLM์ ์ฐธ์กฐํ์ฌ ์์ธํํ๋๋ก ํ ์๋ ์์ต๋๋ค.
- ํน์ ๋ช ๋ น์ด์ ๊ด์ฌ์ด ์๋ค๋ฉด - LLM์ ๋ณต์ฌํ์ฌ ํน์ ์๊ตฌ์ฌํญ์ ๋ฐ๋ผ ์ด ๋ช ๋ น์ด๋ฅผ ๋ณ๊ฒฝํ๋๋ก LLM๊ณผ ์ฑํ ํ์ธ์.
- ์ด ๋ฌธ์์ ๊ทธ๊ฒ์ด ์ ๊ณตํ๋ ์ฐธ์กฐ ๋ด์์ ๋ชจ๋ ๋ช ๋ น์ด์ ๋ํด ํ์ํ ๋ชจ๋ ์ค๋ช ์ ์ฐพ์ ์ ์์ด์ผ ํฉ๋๋ค. ๊ทธ๋๋ ์ธ์ ๋ ์ง ๋ช ๋ น์ด๋ฅผ ์ฑํ ์ธํฐํ์ด์ค์ ๋ณต์ฌํ์ฌ LLM์ด ์์ธํ ์ค๋ช ํ๋๋ก ํ ์ ์์ต๋๋ค.
reddit์ ๋๊ตฐ๊ฐ๊ฐ ๋งํ ๊ฒ์ฒ๋ผ:
"gpt์๊ฒ ์ง๋ฌธํ ๋๋ง๋ค ๋๋ฌด๋ฅผ ํ์ด๋ค๋ ๊ฒ์ ์์ง๋ง, stackexchange์์ 10๋ ๋ ๋ต๋ณ๋ค์ ๋ค์ง๋ ๊ฒ๋ณด๋ค๋ ๋ซ๋ค"
์ด ํ์ผ ์์ ์ ์ต๋ํ ์ฝ๊ฒ ๋ง๋ค๊ธฐ ์ํด LLM์ ๊ฐ๋ฅํ ํ ๋ง์ด ์ฌ์ฉํ์ง๋ง, ๋ชจ๋ ๋ช ๋ น์ด์ ์ค๋ช ์ ์ ๊ฐ ์ง์ ํ ์คํธํ๊ณ ๊ฒ์ฆํ์ต๋๋ค. ๊ทธ ์ค ๋ง์ ๊ฒ๋ค์ GPT ์ด์ ์๋์ ์ฌ์ฉํ๋ ๊ฒ๋ค์ ๋๋ค - ์ ๊ฐ ์ผ๋ง๋ ๋์ด๋ฅผ ๋จน์ด๊ฐ๊ณ ์๋์ง๋ฅผ ๋ณด์ฌ์ฃผ๋ค์ (๐)
LLM์ ๋๋๋ก ์จ๋ผ์ธ์์ ์ฐพ๊ธฐ ์ด๋ ค์ด ์ ํ์ฑ๊ณผ ์ธ๋ถ ์ฌํญ์ ๋ํ ์ฃผ์๊ฐ ํ์ํ FFmpeg์์ ๋์น๋ ๋ถ๋ถ์ด ์์ต๋๋ค. ํนํ ๋ณต์กํ ํํฐ๋ฅผ ๋ค๋ฃฐ ๋ ๊ทธ๋ ์ต๋๋ค. ์ ๋ ์ด๋ฅผ ์ ๊ตํ ๊ฒ์ ๋ฐ ์์ฝ ์์ง์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ์ ์ข์ํฉ๋๋ค - ํน์ ์ธ๋ถ์ฌํญ๊ณผ ํค์๋๋ฅผ ์ง์ ํ ๋ค์ ์จ๋ผ์ธ์์ ๊ฒ์ฆํฉ๋๋ค.
๐ ๏ธ - ๐ ๏ธ๋ก ํ์๋ ์ ๋ชฉ๋ค์ LLM์ผ๋ก ์ฌ๋ฐ๋ฅธ ํด๊ฒฐ์ฑ ์ด๋ ์ค๋ช ์ ์ฐพ๊ธฐ ํนํ ์ด๋ ค์ ๊ฑฐ๋, LLM์ ์ ๋ขฐํ๊ธฐ์๋ ๋๋ฌด ์ค์ํ ๊ฒ๋ค์ด๋ฏ๋ก ์๋ ์ฐ๊ตฌ์ ์ํ์ฐฉ์ค๋ฅผ ํตํด ์์ ํ ๊ฒ๋ค์ ๋๋ค.
๊ธฐ์กด FFmpeg ๋ช ๋ น์ด๋ฅผ ์ต์ ํํ๋ ค๋ ๋ถ๋ค์ ๋ช ๋ น์ด ์ค์ ์น์ ๋ถํฐ ๊ฑด๋๋ฐ์ธ์.
-vf(-filter:v๋ ๋์ผ) ๋น๋์ค ํํฐ-af(-filter:a๋ ๋์ผ) ์ค๋์ค ํํฐfilter_complex๋ณตํฉ ํํฐ ๊ทธ๋ํ - ์ผ๋ฐ์ ์ธ ํํฐ๋ง์ ์ฌ์ฉ๋๋ฉฐ, ๋ชจ๋ ์คํธ๋ฆผ์์ ์ค๋์ค์ ๋น๋์ค๋ฅผ ๋ชจ๋ ์ ์ด
์ผ๋ฐ์ ์ธ ํํฐ ํค์๋ (์ซ์๋ฅผ ๋ณ๊ฒฝํ์ฌ ํ์ํ ์ธ๋ฑ์ค๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค):
[0]์ฒซ ๋ฒ์งธ ์ ๋ ฅ์ ๋ชจ๋ ์คํธ๋ฆผ ์ ํ (0 ๊ธฐ๋ฐ ์ธ๋ฑ์ค)[0:v]์ฒซ ๋ฒ์งธ ์ ๋ ฅ์ ๋น๋์ค ์คํธ๋ฆผ ์ ํ[1:a]๋ ๋ฒ์งธ ์ ๋ ฅ์ ์ค๋์ค ์คํธ๋ฆผ ์ ํ0:v:0์ฒซ ๋ฒ์งธ ์ ๋ ฅ, ์ฒซ ๋ฒ์งธ ๋น๋์ค ์คํธ๋ฆผ (0 ๊ธฐ๋ฐ ์ธ๋ฑ์ค)0:a:1์ฒซ ๋ฒ์งธ ์ ๋ ฅ, ๋ ๋ฒ์งธ ์ค๋์ค ์คํธ๋ฆผ (0 ๊ธฐ๋ฐ ์ธ๋ฑ์ค)[name]๋ช ๋ช ๋ ์คํธ๋ฆผ ์ ํ, ๋ณดํต-filter_complex์ ํจ๊ป ์ฌ์ฉ
-map [name] ์ถ๋ ฅ์ฉ ์คํธ๋ฆผ ์ ํ
ํํ์ ํ๊ฐ if, lte, gte ๋ฑ
-y ๊ธฐ์กด ํ์ผ์ด ์์ผ๋ฉด ์ถ๋ ฅ ํ์ผ์ ์๋์ผ๋ก ๋ฎ์ด์๋๋ค. ๋ฎ์ด์ฐ๊ธฐ ํ์ธ์ ํผํ๊ธฐ ์ํด ๋ชจ๋ FFmpeg ๋ช
๋ น์ด์ ์์ ๋ถ๋ถ์ ์ด ํ๋๊ทธ๋ฅผ ์ถ๊ฐํ์ธ์.
MP4๋ฅผ MKV๋ก ๋ฆฌ๋จน์ค:
ffmpeg -i https://storage.rendi.dev/sample/big_buck_bunny_720p_16sec.mp4 -c copy big_buck_bunny_720p_16sec.mkv
-c copy - ์๋ ์ฐธ์กฐ
MKV์ MP4: ๋ ๋ค ๋น๋์ค ์ปจํ ์ด๋์ด๋ฉฐ H264 ๋ฐ H265๋ก ์ธ์ฝ๋ฉ๋ ๋น๋์ค์ AAC ๋ฐ MP3๋ก ์ธ์ฝ๋ฉ๋ ์ค๋์ค๋ฅผ ์ ์ฅํ ์ ์์ต๋๋ค. ๋น๋์ค ํ์ง ์์ฒด๋ ์ปจํ ์ด๋ ํ์์ด ์๋๋ผ ๋น๋์ค ๋ฐ์ดํฐ๋ฅผ ์์ถํ๋ ๋ฐ ์ฌ์ฉ๋ ๋น๋์ค ์ฝ๋ฑ์ ์ํด ๊ฒฐ์ ๋ฉ๋๋ค.
MKV๋ ์ฌ๋ฌ ๋น๋์ค ์คํธ๋ฆผ์ ํฌํจํ ์ ์๊ณ , MP4๋ ๋ค์ํ ํ๋ซํผ๊ณผ ์ฅ์น์์ ๋ ๋๋ฆฌ ์ง์๋ฉ๋๋ค.
MP4๋ฅผ MOV๋ก ๋ฆฌ๋จน์ค:
ffmpeg -i https://storage.rendi.dev/sample/big_buck_bunny_720p_16sec.mp4 -c copy big_buck_bunny_720p_16sec.mov
MP4๋ฅผ AVI๋ก ์ธ์ฝ๋ฉ:
ffmpeg -i https://storage.rendi.dev/sample/big_buck_bunny_720p_16sec.mp4 big_buck_bunny_720p_16sec.avi
๋น๋์ค ์ธ์ฝ๋ฉ์ ๋ํ ์์ธํ ๋ด์ฉ์ ์๋ ์ฐธ์กฐ
๐ ๏ธ ์๋ณธ ์ข ํก๋น๋ฅผ ์ ์งํ๋ฉด์ ๋น๋์ค๋ฅผ 1080X1920์ผ๋ก ์ ์ค์ผ์ผํ๊ณ ํ์์ ๋ฐ๋ผ ๋น ๊ณต๊ฐ์ ์ฑ์ฐ๊ธฐ ์ํด ๊ฒ์ ํจ๋ฉ์ ์ถ๊ฐ:
ffmpeg -i https://storage.rendi.dev/sample/popeye_talking.mp4 -vf "scale=w=1080:h=1920:force_original_aspect_ratio=decrease,pad=1080:1920:(ow-iw)/2:(oh-ih)/2:color=black,setsar=1:1" output_resized_pad.mp4Scale ์ธ๋ถ์ฌํญ
scale=w=1080:h=1920:force_original_aspect_ratio=decrease ๋น๋์ค๋ฅผ 1080x1920 ๋ด๋ถ์ ๋ง๊ฒ ํฌ๊ธฐ ์กฐ์ ํ๋ฉฐ, ์ ๋ ฅ์ ์๋ณธ ์ข ํก๋น์ ๋ง์ถ๋ฉด์ ์ง์ ๋ ๋๋น์ ๋์ด์ ๊ฐ๊ฑฐ๋ ๊ทธ ์ดํ์ ์ถ๋ ฅ ์น์๋ก ์๋์ผ๋ก ์ถ์ํฉ๋๋ค. ์ด ๊ฒฝ์ฐ ํจ๋ฉ์ ์ถ๊ฐํ๊ธฐ ์ ์ ์ ๋ ฅ์ 1080X810์ผ๋ก ์ถ์ํฉ๋๋ค.
์๋ณธ ์ข
ํก๋น๋ฅผ ์ ์งํ๋ ๋ฐ ํ์ํ ๋์ด(๋๋ ๋๋น)์ ๋ํด ํ์คํ์ง ์๋ค๋ฉด scale=w=1080:h=-1์ ์ง์ ํ์ฌ FFmpeg๊ฐ ์ฌ๋ฐ๋ฅธ ๋์ด๋ฅผ ์ ํํ๋๋ก ํ ์ ์์ผ๋ฉฐ, ์๋ณธ ์ข
ํก๋น๋ฅผ ์ ์งํ๊ณ ์ต๋ ๋๋น๊ฐ 1080์ด ๋๋๋ก ๋ณด์ฅํฉ๋๋ค.
-2 ์ง์ scale=w=1080:h=-2๋ 2๋ก ๋๋์ด์ง๋ ์น์ ํฌ๊ธฐ๋ฅผ ์ฌ์ฉํ๋๋ก ๊ฐ์ ํฉ๋๋ค.
์ฌ๊ธฐ์๋ scale=w=-1:1920์ ์ฌ์ฉํ ์ ์๋ค๋ ์ ์ ์ฃผ์ํ์ธ์. ์ด๋ ๊ฒ ํ๋ฉด FFmpeg๊ฐ 1080๋ณด๋ค ํฐ ๋๋น๋ฅผ ์ ํํ๊ฒ ๋์ด 1080์ธ ์ถ๋ ฅ ๋๋น์ ์ถฉ๋ํ์ฌ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
3๊ฐ์ง ๊ฐ๋ฅํ ๊ฐ์ผ๋ก "force_original_aspect_ratio"๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌ์ฑํ ์ ์์ต๋๋ค:
|0| "disable" (๊ธฐ๋ณธ๊ฐ)
|1| "decrease": ํ์์ ๋ฐ๋ผ ์ถ๋ ฅ ์น์๋ฅผ ์๋์ผ๋ก ์ค์ ๋๋ค.
|2| "increase": ํ์์ ๋ฐ๋ผ ์ถ๋ ฅ ์น์๋ฅผ ์๋์ผ๋ก ๋๋ฆฝ๋๋ค.
Pad ์ธ๋ถ์ฌํญ
pad=1080:1920:(ow-iw)/2:(oh-ih)/2:color=black ํฌ๊ธฐ๊ฐ ์กฐ์ ๋ ๋น๋์ค๋ฅผ ์ค์์ ๋ฐฐ์นํ๊ณ ๋๋จธ์ง๋ฅผ ๊ฒ์ ํจ๋ฉ์ผ๋ก ์ฑ์๋๋ค. ๊ฐ์ width:height:x:y์ด๋ฉฐ x:y๋ ์ผ์ชฝ ์๋จ ๋ชจ์๋ฆฌ์
๋๋ค. ์์ ๊ฐ๋ ์ด๋ฏธ์ง๋ฅผ ์ค์์ ๋ฐฐ์นํ๋ฏ๋ก ์ ์ฌํ ํจ๊ณผ๋ฅผ ์ํด pad=1080:1920:-1:-1:color=black์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
setsar=1:1 ์ํ ์ข
ํก๋น - ์ถ๋ ฅ ํฝ์
์ด ํฝ์
๋น ์ ํํ 1x1๋ก ํ๋๋๋๋ก ๋ณด์ฅํฉ๋๋ค. 1 ๋๋ 1/1๋ก๋ ์ค์ ํ ์ ์์ผ๋ฉฐ - ์ด๋ค์ ๋ชจ๋ ๋์ผํฉ๋๋ค. ๊ฒฝ์ฐ์ ๋ฐ๋ผ FFmpeg๋ ๋น์จ ๋ณ๊ฒฝ์ ๋ณด์ํ๊ธฐ ์ํด ์ํ ์ข
ํก๋น๋ฅผ ์ค์ ํ ์ ์์ต๋๋ค. SAR 1:1์ ๋ช
์์ ์ผ๋ก ์ง์ ํ์ฌ ์๋๋๋ก ์๋ํ๋๋ก ๋ง๋ญ๋๋ค.
ํ๋์ FFmpeg ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ ๋์ผํ ์ ๋ ฅ ๋น๋์ค์์ ๋ ๊ฐ์ ํฌ๊ธฐ ์กฐ์ ๋ ๋น๋์ค๋ฅผ ์์ฑ - ํ๋๋ ๊ฐ๋กํ, ๋ค๋ฅธ ํ๋๋ ์ธ๋กํ. ์ธ๋กํ ๋น๋์ค์ ์๋จ์ ์ค๋ฒ๋ ์ด\๋ก๊ณ ๋ฅผ ์ถ๊ฐ:
ffmpeg -i https://storage.rendi.dev/sample/popeye_talking.mp4 -i https://storage.rendi.dev/sample/rendi_banner_white.png -filter_complex "[0:v]split=2[s0][s1];[s0]scale=w=1920:h=1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2:color=black,setsar=1:1[out1];[s1]scale=w=720:h=1280:force_original_aspect_ratio=decrease,pad=720:1280:(ow-iw)/2:(oh-ih)/2:color=black,setsar=1:1[s2];[s2][1]overlay=(main_w-overlay_w)/2:(main_w-overlay_w)/5[out2]" -map [out1] -map 0:a output_youtube.mp4 -map [out2] -map 0:a output_shorts.mp4์ ๊ฐ ์ง์์ ์ผ๋ก ์ฌ์ฉํ๋ ๋ ๊ฐ์ stackoverflow ์ ๋ณด ์์ค ๋งํฌ 1 ; ๋งํฌ 2
ffmpeg -i https://storage.rendi.dev/sample/popeye_talking.mp4 -ss 00:00:10 -to 00:00:25 output_trimmed.mp4
๋ ๋น ๋ฅธ ์๋ฅด๊ธฐ ๋ฐฉ๋ฒ์ด ์์ง๋ง ์ ํํ์ง ์๊ฑฐ๋ ๊ฒ์ ํ๋ ์์ด ์์ฑ๋ ์ ์์ต๋๋ค.
๊ณ ๊ธ ์ค๋ช ์ ์๋ ์ ๋ ฅ\์ถ๋ ฅ ํ์ ์ฐธ์กฐ
ffmpeg -i https://storage.rendi.dev/sample/big_buck_bunny_720p_16sec.mp4 -i https://storage.rendi.dev/sample/Neon_Lights_5sec.mp3 -map 0:v -map 1:a -shortest -c:v copy -c:a aac output_replace_audio.mp4
๋น๋์ค์ ์ค๋์ค๋ฅผ ์ ์ค๋์ค ํ์ผ๋ก ๊ต์ฒด
-shortest ๋น๋์ค ๋์ ์ค๋์ค๋งํผ ์งง๊ฒ ์๋ฆ ๋๋ค. ๋น๋์ค ๊ธธ์ด๋ฅผ ์ ์งํ๋ ค๋ฉด ์ด ํ๋๊ทธ๋ฅผ ์ ๊ฑฐํ ์ ์์ต๋๋ค (์ถ๋ ฅ์ 5์ด ํ์ ์์๊ฑฐ๋ฉ๋๋ค)
์ฐธ๊ณ : ์ ๋ช ๋ น์ด๋
c:v copy๊ฐ ์๋ค๋ ์ ์์ ์์์น ๋ชปํ ๊ฒฐ๊ณผ์ ๋๋ค - ํคํ๋ ์์ด ์๋ ๊ณณ์์ ์ฌ์ธ์ฝ๋ฉ ์์ด ์๋ฅด๋ฏ๋ก ๊ฒ์ ํ๋ ์์ด ๋ํ๋ ๊ฒ์ผ๋ก ์์ํ์ต๋๋ค. ํ์ง๋ง ์ถ๋ ฅ ๋น๋์ค๋ ์๋ฒฝํด ๋ณด์ ๋๋ค. ๋ํ-c:v libx264๋ก ๋ช ์์ ์ผ๋ก ์ฌ์ธ์ฝ๋ฉ์ ์๋ํ์ ๋ ์ถ๋ ฅ ๋น๋์ค๋ ๊ฐ์ฅ ์งง์ 5์ด ์ค๋์ค๋ณด๋ค ๊ธด 7์ด์์ต๋๋ค. ์จ๋ผ์ธ์์ ๊ฒ์ํด๋ด๋ ์ด ๋ ๊ฐ์ง์ ๋ํ ์ค๋ช ์ ์ฐพ์ ์ ์์์ต๋๋ค.
MP4๋ฅผ MP3๋ก ์ธ์ฝ๋ฉ:
ffmpeg -i https://storage.rendi.dev/sample/big_buck_bunny_720p_16sec.mp4 big_buck_bunny_720p_16sec.mp3
MP4 ๋น๋์ค์์ ์ค๋์ค๋ฅผ ์ถ์ถํ๊ณ , 16,000 Hz๋ก ๋ค์ด์ํ๋งํ๊ณ , ๋ชจ๋ ธ MP3๋ก ๋ณํํ๋ฉฐ, ๋น๋์ค๋ ์ถ์ถ (์์๊ฑฐ):
ffmpeg -i https://storage.rendi.dev/sample/popeye_talking.mp4 -ar 16000 -ab 48k -codec:a libmp3lame -ac 1 output_extracted_audio.mp3 -map 0:v -c:v copy -an out_video_only.mp4
-ar์ํ ๋ ์ดํธ 16KHz - ์ด๋น ๋์งํธ ์ค๋์ค ์จ์ด๋ธ ์ํ ์-b:a 48k(-ab์ ๋์ผ) ๋นํธ๋ ์ดํธ 48KBit/s - ์ด๋น ์ ์ฅ๋๋ ๋ฐ์ดํฐ ์ Stackoverflow ์ฐธ์กฐ-ac 1์ค๋์ค ์ฑ๋ - 1 (๋ชจ๋ ธ)
MP4์์ ์ธ์ฝ๋ฉํ์ง ์๊ณ AAC ์ค๋์ค ์ถ์ถ:
ffmpeg -i https://storage.rendi.dev/sample/popeye_talking.mp4 -map 0:a:0 -acodec copy output.aac
ffmpeg -i https://storage.rendi.dev/sample/big_buck_bunny_720p_16sec.mp4 -i https://storage.rendi.dev/sample/Neon_Lights_5sec.mp3 -filter_complex "[1:a]volume=0.2[a1];[0:a][a1]amix=inputs=2:duration=shortest" -shortest -map 0:v -c:v copy -c:a aac output_mix_audio.mp4๋น๋์ค์ ์ค๋์ค๋ฅผ ์ ์ค๋์ค ํ์ผ๊ณผ ๋ฏน์คํ๊ณ ๋ณผ๋ฅจ์ ๋ฎ์ถฅ๋๋ค:
[1:a]volume=0.2[a1] ๋น๋์ค ํ์ผ์ ์ค๋์ค๋ ๋ค์ ์ ์๋๋ก ์ค๋์ค ํ์ผ์ ๋ณผ๋ฅจ์ ๋ฎ์ถฅ๋๋ค. [1:a]๋ 0 ๊ธฐ๋ฐ ์ธ๋ฑ์ค์์ ํ์ผ 1์ ์ค๋์ค๋ฅผ ์๋ฏธํฉ๋๋ค. [a1]์ ๋น๋์ค์ ์ค๋์ค์ ๋ฏน์คํ ์ ์๋๋ก ๋ณ๊ฒฝ๋ ๋ณผ๋ฅจ ์ค๋์ค๋ฅผ ํ์ํฉ๋๋ค.
[0:a][a1]amix=inputs=2 ์ฒซ ๋ฒ์งธ ์คํธ๋ฆผ(๋น๋์ค)์ ์ค๋์ค์ ๋ณ๊ฒฝ๋ ๋ณผ๋ฅจ ์ค๋์ค๋ฅผ ๊ฐ์ ธ์ ํจ๊ป ๋ฏน์คํฉ๋๋ค.
์์ธํ ๋ด์ฉ
๋ณผ๋ฅจ์ ๋ณ๊ฒฝํ์ง ์์ผ๋ ค๋ฉด ๋์ ์ด ํํฐ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค: -filter_complex "[0:a][1:a]amix=inputs=2:duration=shortest"
:duration=shortest๋ ์ ์ค๋์ค๋ฅผ ๊ฐ์ฅ ์งง์ ์ค๋์ค๋งํผ ์งง๊ฒ ๋ง๋ค๊ณ , ๋ค์ -shortest ํ๋๊ทธ๋ ์ต์ข
์ถ๋ ฅ ๋น๋์ค์ ๊ธธ์ด๋ฅผ ์ ์ดํ๊ธฐ ๋๋ฌธ์ ์ฌ์ ํ ํ์ํฉ๋๋ค (์ค๋์ค๋ง์ด ์๋๋๋ค).
๋น๋์ค๊ฐ ์ค๋์ค๋ณด๋ค ์งง๊ฑฐ๋ ๊ธธ ๋ ๊ทธ์ ๋ฐ๋ผ ์ถ๋ ฅ ๋น๋์ค์ ๊ธธ์ด๋ฅผ ์ ๋ ฌํ๋ ค๋ ๊ฒฝ์ฐ์ ๋ํ ์ข์ ๋ ผ์
์ด ์ฃผ์ ์ ๊ด๋ จ๋ ์ด๋ฆฐ ๋ฒ๊ทธ duration:shortest์ -shortest ์ฌ์ฉ์ ๋ฒ๊ทธ์ ์ํฅ์ ํผํฉ๋๋ค.
ffmpeg -i https://storage.rendi.dev/sample/Neon_Lights_5sec.mp3 -i https://storage.rendi.dev/sample/Neon%20Lights.mp3 -filter_complex "[0:a]afade=t=out:st=2:d=3[a0];[1:a]afade=t=in:st=0:d=3[a1];[a0][a1]concat=n=2:v=0:a=1" -c:a libmp3lame -q:a 2 output_gapless_fade.mp3[0:a]afade=t=out:st=2:d=3...[1:a]afade=t=in:st=0:d=3 ์ฒซ ๋ฒ์งธ๋ฅผ ํ์ด๋ ์์ํ๊ณ ๋ ๋ฒ์งธ๋ฅผ ํ์ด๋ ์ธ:
- ์ฒซ ๋ฒ์งธ ์
๋ ฅ ์ค๋์ค
[0:a]3์ดd=3ํ์ด๋ ์์t=out2์ด๋ถํฐ ์์st=2 - ๋ ๋ฒ์งธ ์ค๋์ค
[1:a]3์ดd=3ํ์ด๋ ์ธt=in์ค๋์ค ์์๋ถํฐst=0
[a0][a1]concat=n=2:v=0:a=1 ๋ ํ์ด๋๋ ์ค๋์ค ์คํธ๋ฆผ์ ๋ค์ ์ฐ๊ฒฐํ์ฌ 1๊ฐ์ ์ถ๋ ฅ ์ค๋์ค ์คํธ๋ฆผ์ ์์ฑ, ๋น๋์ค ์์ (v=0).
-q:a 2 - ํ๊ท ์คํ ๋ ์ค ๋นํธ๋ ์ดํธ 170-210 KBit/s์ ๊ณ ํ์ง ์ค๋์ค ์ถ๋ ฅ
ffmpeg -i https://storage.rendi.dev/sample/Neon_Lights_5sec.mp3 -i https://storage.rendi.dev/sample/Neon%20Lights.mp3 -filter_complex "[0:0][1:0]acrossfade=d=3:c1=exp:c2=qsin" -c:a libmp3lame -q:a 2 output.mp3acrossfade=d=3:c1=exp:c2=qsin ์ฒซ ๋ฒ์งธ ํธ๋์ด ๋น ๋ฅด๊ฒ ํ์ด๋ ์์๋๊ณ ๋ ๋ฒ์งธ ํธ๋์ด ์ฒ์ฒํ ํ์ด๋ ์ธ๋๋ 3์ด ์ค๋์ค ํฌ๋ก์คํ์ด๋
MP3๋ฅผ WAV pcm_s32le (๋ถํธ ์๋ 32๋นํธ ๋ฆฌํ ์๋์) ํ์, ๋ชจ๋ ธ ๋ฐ 48KHz ์ํ ์ฃผํ์๋ก:
ffmpeg -i https://storage.rendi.dev/sample/Neon%20Lights.mp3 -acodec pcm_s32le -ac 1 -ar 48000 output.wav
๋ mp4 ํ์ผ์ ์ค๋์ค๋ฅผ ๋ณํฉํ๊ณ , ๋ชจ๋ ธ๋ก ๋์ผํ๊ฒ ๋ฏน์คํ๊ณ , ๋ณผ๋ฅจ์ ์ ๊ทํํ๊ณ , 16 kHz๋ก ๋ค์ด์ํ๋งํ๊ณ , 64 KBits/s๋ก MP3 ์ธ์ฝ๋ฉ:
ffmpeg -i https://storage.rendi.dev/sample/big_buck_bunny_720p_16sec.mp4 -i https://storage.rendi.dev/sample/popeye_talking.mp4 -filter_complex "[0:a][1:a]amix=inputs=2:duration=longest,pan=mono|c0=.5*c0+.5*c1,dynaudnorm" -ar 16000 -c:a libmp3lame -b:a 64k merged_audio.mp3pan=mono|c0=.5*c0+.5*c1 ์ถ๋ ฅ ์ฑ๋ (c0)์ ์ผ์ชฝ ์
๋ ฅ (c0)์ 50%์ ์ค๋ฅธ์ชฝ ์
๋ ฅ (c1)์ 50%๋ฅผ ๋ธ๋ ๋ฉํ์ฌ ๋ง๋ค์ด์ง๋๋ค.
dynaudnorm ๋์ ์ค๋์ค ์ ๊ทํ ์ ์ฉ (ํฐ/์กฐ์ฉํ ๋ถ๋ถ์ ๋ถ๋๋ฝ๊ฒ ํจ)
ํจ๋ ๋ฐ ์คํ ๋ ์ค๋ฅผ ๋ชจ๋ ธ๋ก ๋ณํํ๋ FFmpeg ๋ฌธ์
ffmpeg -i https://storage.rendi.dev/sample/popeye_talking.mp4 -filter_complex "[0:v]setpts=PTS/1.5[v];[0:a]atempo=1.5[a]" -map "[v]" -map "[a]" output_sped_up.mp4
setpts=PTS/1.5 ๋น๋์ค๋ฅผ 1.5๋ฐฐ ๋น ๋ฅด๊ฒ ํฉ๋๋ค. atempo=1.5๋ ํผ์น๋ฅผ ๋ณด์กดํ๋ฉด์ ์ค๋์ค ์ฌ์ ์๋๋ฅผ ๋น ๋ฅด๊ฒ ํฉ๋๋ค.
ffmpeg -i https://storage.rendi.dev/sample/popeye_talking.mp4 -filter:v fps=60 popeye_fps.mp4
ffmpeg -i https://storage.rendi.dev/sample/popeye_talking.mp4 -vf "select='between(t,0.0,5.7)+between(t,11.0,18.0)+between(t,19.0,20.0)',setpts=N/FRAME_RATE/TB" -af "aselect='between(t,0.0,5.7)+between(t,11.0,18.0)+between(t,19.0,20.0)',asetpts=N/SR/TB" popeye_jumpcuts.mp4
ํด๋ฆฝ์ ์งง๊ฒ ๋ง๋ค๊ธฐ, ์นจ๋ฌต ์ ๊ฑฐ, ์ ํ ์ ๊ฑฐ ๋ฑ์ ์ฌ์ฉ๋ฉ๋๋ค.
setpts=N/FRAME_RATE/TB...asetpts=N/SR/TB ์์ฒญ๋ ํธ๋ฆผ์ ๋ฐ๋ผ ๋น๋์ค ๋ฐ ์ค๋์ค ํ๋ ์ ํ ์ด์ ํ์์คํฌํ๋ฅผ ์ฌ์ค์ ํฉ๋๋ค
N์๋น๋ ํ๋ ์\์ค๋์ค ์ํ ์, ์ค๋์ค์ ๊ฒฝ์ฐ ํ์ฌ ํ๋ ์์ ํฌํจํ์ง ์์, 0๋ถํฐ ์์FRAME_RATE\SR๋น๋์ค ํ๋ ์ ๋ ์ดํธ ๋ฐ ์ค๋์ค ์ํ ๋ ์ดํธTB์ ๋ ฅ ํ์์คํฌํ์ ํ์๋ฒ ์ด์ค
1080X720 ๋น๋์ค๋ฅผ 720X1080์ผ๋ก ํฌ๋กญํ๊ธฐ ์ํด ํน์ ์๊ฐ ํ๋ ์์์ ๋น๋์ค ์ฒญํฌ๋ฅผ 480X720์ผ๋ก ํฌ๋กญํ๊ณ 1.5๋ฐฐ ์ ์ค์ผ์ผ๋งํ์ฌ ์ธ๋กํ ์์ ๋ฏธ๋์ด ๋น๋์ค๋ฅผ ์์ฑ:
ffmpeg -i https://storage.rendi.dev/sample/big_buck_bunny_720p_16sec.mp4 -vf "split=3[1][2][3];[1]trim=0.0:4.5,setpts=PTS-STARTPTS,crop=min(in_w-300,480ๅ):min(in_h-0,720ๅ):300:0,scale=720:1080,setsar=1:1[1];[2]trim=4.5:8.5,setpts=PTS-STARTPTS,crop=min(in_w-500,480ๅ):min(in_h-0,720ๅ):500:0,scale=720:1080,setsar=1:1[2];[3]trim=8.5,setpts=PTS-STARTPTS,crop=min(in_w-400,480ๅ):min(in_h-0,720ๅ):400:0,scale=720:1080,setsar=1:1[3];[1][2][3]concat=n=3:v=1" -c:v libx264 -c:a copy output_cropped.mp4Details
split=3[1][2][3] ์
๋ ฅ ๋น๋์ค๋ฅผ 3๊ฐ ์ฒญํฌ๋ก ๋ถํ ํ๊ณ [1] [2] [3]๋ก ๋ช
๋ช
ํฉ๋๋ค
trim=0.0:4.5 ๊ฐ ํฌ๋กญ ์ฒญํฌ๋ ์์ ์๊ฐ๋ถํฐ ์ข
๋ฃ ์๊ฐ๊น์ง์ ์์ ์ ๋น๋์ค์
๋๋ค. [3]trim=8.5๋ ์ข
๋ฃ ์๊ฐ์ ์ง์ ํ์ง ์์ผ๋ฏ๋ก ๋น๋์ค์ ํจ๊ป ๋๋ฉ๋๋ค
setpts=PTS-STARTPTS๋ก ํ์์คํฌํ ์ฌ์ค์ ์ trim๊ณผ concat์ ์ฌ์ฉํ ๋ concat์ด ๊ฒ๋ณด๊ธฐ์ ๋ณ๋์ ๋น๋์ค ์คํธ๋ฆผ(ํธ๋ฆผ๋ ์คํธ๋ฆผ)์์ ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ๋๋ก ๋ณด์ฅํ๊ธฐ ์ํด ํ์ํฉ๋๋ค
crop=min(in_w-300,480):min(in_h-0,720):300:0 ๊ฐ์ width:height:x:y x,y๋ ์ผ์ชฝ ์๋จ ๋ชจ์๋ฆฌ์
๋๋ค. min ์น์๋ FFmpeg๊ฐ ์ค์ผ์ผ๋ง ์ ์ ์ถ๋ ฅ ํ๋ ์์ ์ง์ ๋ ํฌ๊ธฐ ๋ฐ์ผ๋ก ํฌ๋กญํ์ง ์๋๋ก ๋ณด์ฅํฉ๋๋ค. ์ต์ ๊ณ์ฐ์ ์ด ์๋๋ฆฌ์ค์์ ํ์ํ์ง ์์ผ๋ฉฐ, ๋ค๋ฅธ ์น์๋ x,y ์์น ์ง์ ์ด ํ์ํ ๊ฒฝ์ฐ๋ฅผ ์ํ ์๋ฆฌํ์์๋ก ์์ต๋๋ค
ํฌ๋กญ์ด ํ๋ ์ ๊ฒฝ๊ณ ๋ฐ์ ์์ผ๋ฉด - ํฌ๋กญ์ด ๋น๋์ค๋ฅผ ์๊ณก์ํต๋๋ค. ์ด๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด ๋น ๊ณต๊ฐ์ ์ฑ์ฐ๊ธฐ ์ํด ๊ฒ์ ํจ๋ฉ์ ์ฌ์ฉํ ์ ์์ต๋๋ค:
ffmpeg -i https://storage.rendi.dev/sample/big_buck_bunny_720p_16sec.mp4 -vf "split=3[1][2][3];[1]trim=0.0:4.5,setpts=PTS-STARTPTS,crop=min(in_w-1200,480ๅ):min(in_h-0,720ๅ):1200:0,pad=480:720:(ow-iw)/2:(oh-ih)/2:color=black,scale=720:1080,setsar=1:1[1];[2]trim=4.5:8.5,setpts=PTS-STARTPTS,crop=min(in_w-500,480ๅ):min(in_h-0,720ๅ):500:0,pad=480:720:(ow-iw)/2:(oh-ih)/2:color=black,scale=720:1080,setsar=1:1[2];[3]trim=8.5,setpts=PTS-STARTPTS,crop=min(in_w-400,480ๅ):min(in_h-0,720ๅ):400:0,pad=480:720:(ow-iw)/2:(oh-ih)/2:color=black,scale=720:1080,setsar=1:1[3];[1][2][3]concat=n=3:v=1" -c:v libx264 -c:a copy output_cropped.mp4๋น๋์ค์ ์ธ ๊ฐ์ ๋ค๋ฅธ ํ ์คํธ ๋ฉ์์ง๋ฅผ ํน์ ์๊ฐ์ ๋ํ๋๋๋ก ์ค๋ฒ๋ ์ดํ๊ณ , ํ์ด๋ ์ธ ์ํ ํจ๊ณผ์ ๋ฐํฌ๋ช ๋ฐฐ๊ฒฝ ๋ฐ์ค๋ฅผ ์ฌ์ฉ:
ffmpeg -i https://storage.rendi.dev/sample/big_buck_bunny_720p_16sec.mp4 -vf "drawtext=text='Get ready':x=50:y=100:fontsize=80:fontcolor=black:alpha='if(gte(t,1)*lte(t,3),(t-1)/2,1)':box=1:boxcolor=#6bb666@0.6:boxborderw=7:enable='gte(t,1)', drawtext=text='Set':x=50:y=200:fontsize=80:fontcolor=black:alpha='if(gte(t,6)*lte(t,10),(t-6)/4,1)':box=1:boxcolor=#6bb666@0.6:boxborderw=7:enable='gte(t,6)', drawtext=text='BOOM!':x=50:y=300:fontsize=80:fontcolor=black:alpha='if(gte(t,10)*lte(t,15),(t-10)/5,1)':box=1:boxcolor=#6bb666@0.6:boxborderw=7:enable='gte(t,10)'" -c:v libx264 output_text_overlay.mp4๋ก์ปฌ๋ก ์ ์ฅ๋ ํฐํธ ํ์ผ์ด ์๋ค๋ฉด fontfile=<path_to_file>์ ์ฌ์ฉํ์ฌ ์ง์ ํ ์ ์์ต๋๋ค. ์: drawtext=text='Get ready':x=50:y=100:fontsize=80:fontcolor=black:fontfile=arial.ttf
drawtext ์ธ๋ถ์ฌํญ
"Get ready" ์ค๋ฒ๋ ์ด ์ค๋ช
drawtext=text='Get ready':x=50:y=100:fontsize=80:fontcolor=black:alpha='if(gte(t,1)*lte(t,3),(t-1)/2,1)':box=1:boxcolor=#6bb666@0.6:boxborderw=7:enable='gte(t,1)':
- enable='gte(t,1)' ์ค๋ฒ๋ ์ด๊ฐ ์ธ์ ํ์๋๋์ง ์ ์ด - 1์ด ์ด์.
*๋ AND ์ฐ์ฐ์์ ๋๋ค. t = 1์ด๋ถํฐ ํ์ alpha='if(gte(t,1)*lte(t,3),(t-1)/2,1)'t=1์์ t=3 ์ฌ์ด์ ์ํ๊ฐ ํ์ด๋ ์ธ๋๊ณ , ๋ค๋ฅธ ๋ชจ๋ ์๊ฐ์๋ 1๊ณผ ๊ฐ์ (์์ ๋ถํฌ๋ช )box=1ํ ์คํธ ๋ค์ 7px ํจ๋ฉboxborderw=7์ผ๋ก ๋ฐฐ๊ฒฝ์ ๊ทธ๋ฆฝ๋๋ค- boxcolor=#6bb666@0.6 โ 60% ๋ถํฌ๋ช ๋์ ๋ น์ ๊ณ์ด ๋ฐฐ๊ฒฝ #6bb666
x=50:y=100๋ฐ์ค์ ์ผ์ชฝ ์๋จ ์์น
ํ ์คํธ ํ์ผ๊ณผ ํฐํธ ํ์ผ์์ ๋น๋์ค์ ํ ์คํธ ์ค๋ฒ๋ ์ด ์ถ๊ฐ:
ffmpeg -i https://storage.rendi.dev/sample/big_buck_bunny_720p_16sec.mp4 -vf "drawtext=textfile=sample_text.txt:fontfile=Poppins-Regular.ttf:x=50:y=100:fontsize=40:fontcolor=black:alpha='if(gte(t,1)*lte(t,5),t-1,1)':box=1:boxcolor=#6bb666@0.6:boxborderw=7:enable='gte(t,1)'" -c:v libx264 output_text_font_file.mp4FFmpeg๋ textfile=๊ณผ fontfile= ๋ด์ ํ์ผ์ ๋ค์ด๋ก๋ํ์ง ์์ผ๋ฏ๋ก https://storage.rendi.dev/sample/sample_text.txt ๋ฐ https://storage.rendi.dev/sample/Poppins-Regular.ttf์์ ํ์ผ์ ์๋์ผ๋ก ๋ค์ด๋ก๋ํด์ผ ํฉ๋๋ค.
๋ช ๋ น์ค ๊ตฌ๋ฌธ์ ๋ฐฉํดํ ์ ์๋ ํน์ ๋ฌธ์ ๋ฌธ์ ๋ฅผ ํผํ๊ธฐ ์ํด FFmpeg ๋ช ๋ น์ด ์์ฒด์์ ํ ์คํธ๋ฅผ ์ง์ ํ๋ ๋์ textfile์ ์ฌ์ฉํ๋ ๊ฒ์ด ๊ถ์ฅ๋ฉ๋๋ค.
ffmpeg -i https://storage.rendi.dev/sample/big_buck_bunny_720p.mp4 -ss 00:00 -to 00:40 -vf "subtitles=sample_subtitles.srt:fontsdir=.:force_style='FontName=Poppins,FontSize=24,PrimaryColour=&HFFFFFF,OutlineColour=&H4066B66B,Outline=1,BorderStyle=3'" -c:v libx264 -c:a copy output_subtitles.mp4์ด ๋ช
๋ น์ด๋ ์ฌ์ฉ์ ์ ์ ํฐํธ - Poppins์ ์ฌ์ฉ์ ์ ์ ์๋ง ์คํ์ผ๋ก ์๋ง์ ๋ฒ์ธํฉ๋๋ค. FontName์ ์ฌ์ฉํด์ผ ํ๋ฉฐ (ํ์ผ ์ด๋ฆ์ด ์๋) - ํฐํธ ํ์ผ์ ์ด ๋ ์ฐพ์ ์ ์์ต๋๋ค. ๋ํ ํฐํธ ํ์ผ์ด ์๋ fontsdir์ ์ง์ ํ์ธ์.
Poppins ํฐํธ ํ์ผ์ https://storage.rendi.dev/sample/Poppins-Regular.ttf์์ ๋ค์ด๋ก๋ํ ์ ์์ต๋๋ค.
์๋ง ์ธ๋ถ์ฌํญ
์์์ &HBBGGRR - ํ๋์, ๋
น์, ๋นจ๊ฐ์ ๋๋ ์ํ ์ฑ๋ (ํฌ๋ช
๋)์ ์ถ๊ฐํ๋ ค๋ฉด &HAABBGGRR์ด๋ฉฐ FF๊ฐ 100% ํฌ๋ช
, 00์ด ํฌ๋ช
๋ ์์์
๋๋ค.
PrimaryColour๋ ํฐํธ ์์์
๋๋ค
๐ ๏ธ OutlineColour=&H4066B66B,Outline=1,BorderStyle=3 ๋
น์ ๋ฐฐ๊ฒฝ (HEXA์์ 40/FF๋ 25% ๋ถํฌ๋ช
)๊ณผ RGB์ #6bb666 ์์์ ๊ตฌ์ฑํฉ๋๋ค. ๋ฐฐ๊ฒฝ์ด ๋ํ๋๋๋ก ํ๋ ค๋ฉด Outline=1,BorderStyle=3์ ์ค์ ํด์ผ ํฉ๋๋ค. ๋ฐฐ๊ฒฝ์ ์คํ์ผ๋งํ๋ ๊ฒ์ ์ฝ๊ฐ ๊น๋ค๋ก์ฐ๋ฉฐ, ์ด reddit ์ค๋ ๋์ ์ ์ฉํ ์ ๋ณด๊ฐ ์์ต๋๋ค.
๊ณต์ FFmpeg ๋ฌธ์: ๋น๋์ค์ ์๋ง์ ๋ฒ์ธํ๋ ๋ฐฉ๋ฒ ; ์๋ง ํํฐ
์๋ง ๋ชจ์์ ์ ๋ง๋ก ์ฌ์ฉ์ ์ ์ํ๋ ค๋ฉด ASS ์๋ง ํ์์ ์ฌ์ฉํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ ์ต์ ์ ๋๋ค. ์ ๊ฐ ์ง์์ ์ผ๋ก ์ฌ์ฉํ๋ ์ข์ ์ ๋ณด ์์ค์ ๋๋ค.
ํน๋ณํ ํจ๊ณผ์ ๋ ํนํ ๋ชจ์์ ํฝ์ ์๋ฒฝํ ์๋ง ๋ฒ์ธ์ ์ํด์๋ ์๋ง ํ์ ์ธ๋ถ์์ ๋ถํฌ๋ช ํ ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค๊ณ FFmpeg๋ก ๋น๋์ค์ ์ด๋ฏธ์ง๋ฅผ ๋ฒ์ธํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ต๋๋ค.
๋น๋์ค์ ๊ธฐ๋ณธ ์๋ง srt ํธ๋์ ์ถ๊ฐํ๊ณ MKV ์ปจํ ์ด๋์ ์ ์ฅ, ๋น๋์ค๋ฅผ ์ฌ์ธ์ฝ๋ฉํ์ง ์๊ณ ์ฝ๋ฑ์ H264๋ก ์ ์ง:
ffmpeg -i https://storage.rendi.dev/sample/big_buck_bunny_720p_16sec.mp4 -i sample_subtitles.srt -c copy -c:s srt -disposition:s:0 default big_buck_bunny_720p_16sec.mkv
-c:s srt ์๋ง ํ์์ srt
-disposition:s:0 default ๊ธฐ๋ณธ ์๋ง ํธ๋์ผ๋ก ์ค์
mkv ํ์ผ์์ ์๋ง ์ถ์ถ:
ffmpeg -i big_buck_bunny_720p_16sec.mkv -map 0:s:0 subs.srt
mkv ํ์ผ์์ ์๋ง์ ์ถ์ถํฉ๋๋ค
๋น๋์ค์ ์ด๋ฏธ์ง ์ค๋ฒ๋ ์ด - ๋น๋์ค์ ๋ก๊ณ \์ํฐ๋งํฌ ์ถ๊ฐ:
ffmpeg -i https://storage.rendi.dev/sample/big_buck_bunny_720p_16sec.mp4 -i https://storage.rendi.dev/sample/rendi_banner_white_transparent.png -filter_complex "overlay=x=(main_w-overlay_w)/8:y=(main_h-overlay_h)/8:enable='gte(t,1)*lte(t,7)'" -c:v libx264 -c:a copy output_logo.mp4์ ๋ช ๋ น์ด๋ ํฌ๋ช ํ ๋ฐฐ๊ฒฝ์ ๊ฐ์ง ์ค๋ฒ๋ ์ด๋ฅผ ๋น๋์ค ์์ ๋์ต๋๋ค
x=(main_w-overlay_w)/8:y=(main_h-overlay_h)/8 ์ค๋ฒ๋ ์ด์ ์ผ์ชฝ ์๋จ ๋ชจ์๋ฆฌ๋ฅผ ์ผ์ชฝ๊ณผ ์์์ ๋จ์ ๊ณต๊ฐ์ 1/8 ์ง์ ์ ์ํ์ผ๋ก ์์น์ํต๋๋ค
main_w\main_h๋ ๋ฉ์ธ ๋น๋์ค์ ๋๋น์ ๋์ด์ ๋๋คoverlay_w\overlay_h๋ ์ค๋ฒ๋ ์ด ์ด๋ฏธ์ง์ ๋๋น์ ๋์ด์ ๋๋ค
enable='gte(t,1)*lte(t,7)' ์ค๋ฒ๋ ์ด๊ฐ ์ธ์ ํ์๋๋์ง ์ ์ด - 1์ด ์ด์์ด๊ณ 7์ด ์ดํ, *๋ AND ์ฐ์ฐ์์
๋๋ค
๐ FFmpeg๊ฐ ์ค๋ฒ๋ ์ด์ ํฌ๋ช ๋๋ฅผ ์ ์ดํ๋๋ก ํ๋ ค๋ฉด ์ด ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค:
ffmpeg -i https://storage.rendi.dev/sample/big_buck_bunny_720p_16sec.mp4 -i https://storage.rendi.dev/sample/rendi_banner_white.png -filter_complex "[1:v]format=argb,geq='p(X,Y)':a='0.5*alpha(X,Y)'[v1];[0:v][v1]overlay=x=(main_w-overlay_w)/8:y=(main_h-overlay_h)/8:enable='gte(t,1)*lte(t,7)'" -c:v libx264 -c:a copy output_faded_logo.mp4[1:v]format=argb,geq=r='r(X,Y)':a='0.5*alpha(X,Y)'[v1] ํฌ๋ช
ํ ๋ก๊ณ ๋ฅผ ์์ฑํฉ๋๋ค
์ธ๋ถ์ฌํญ
[1:v]๋ ๋ฒ์งธ ์ ๋ ฅ(๋ก๊ณ )์์ ๋น๋์ค ์คํธ๋ฆผ์ ์ ํํฉ๋๋คformat=argb์ด๋ฏธ์ง๋ฅผ ARGB ํ์์ผ๋ก ๋ณํํ์ฌ ์ํ ์ฑ๋์ด ์๋ ์ค๋ฒ๋ ์ด ์ด๋ฏธ์ง์ ํจ๊ป ์๋ํ๋๋ก ํฉ๋๋ค- geq='p(X,Y)' X,Y ์ง์ ์์ ๋ก๊ณ ์ ํฝ์ ์์์ ์๋ณธ ์ด๋ฏธ์ง์ ์์์ผ๋ก ์ ์ํฉ๋๋ค. ํฝ์ ์ ํฌ๋ช ๋๋ฅผ ์ ํํ ์ ์ดํ๊ธฐ ์ํด ํ์ํฉ๋๋ค
a='0.5*alpha(X,Y)'์ํ ์ฑ๋์ 0.5๋ฅผ ๊ณฑํ์ฌ ๋ก๊ณ ๋ฅผ 50% ํฌ๋ช ํ๊ฒ ๋ง๋ญ๋๋ค[v1]์ด ์ฒ๋ฆฌ๋ ๋ก๊ณ ๋ฅผ ์ ๋น๋์ค ์คํธ๋ฆผ์ผ๋ก ํ์ํฉ๋๋ค
๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง ์์ ๋น๋์ค๋ฅผ ๋๊ธฐ - ์๋ก์ด ํด์๋์ ์ข ํก๋น๋ก ๋น๋์ค ์์ฑ:
ffmpeg -i https://storage.rendi.dev/sample/popeye_talking.mp4 -i https://storage.rendi.dev/sample/evil-frank.png -filter_complex "[1:v][0:v]overlay=(W-w)/2:(H-h)/2" -c:v libx264 -c:a copy output_bg.mp4[1:v][0:v] ๋จผ์ ์ด๋ฏธ์ง(๋ฐฐ๊ฒฝ)๋ฅผ ๋๊ณ ๊ทธ ์์ ๋น๋์ค๋ฅผ ๋์ต๋๋ค.
(W-w)/2:(H-h)/2 ๊ทธ์ ๋ฐ๋ผ ๋น๋์ค์ ์ผ์ชฝ ์๋จ ๋ชจ์๋ฆฌ๋ฅผ ์ ํํ์ฌ ๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง์์ ๋น๋์ค๋ฅผ ์ํ ๋ฐ ์์ง์ผ๋ก ์ค์์ ๋ฐฐ์นํฉ๋๋ค. W\H๋ ๋ฐฐ๊ฒฝ ๋๋น์ ๋์ด, w\h๋ ๋น๋์ค ๋๋น์ ๋์ด์ด๋ฉฐ, ๋๋ฌธ์๋ ์ฒซ ๋ฒ์งธ ์ง์ ๋ ์คํธ๋ฆผ [1:v]์ ์ํ๊ณ ์๋ฌธ์๋ ๋ ๋ฒ์งธ ์ง์ ๋ ์คํธ๋ฆผ [0:v]์ ์ํฉ๋๋ค. ์์๋ ์
๋ ฅ ํ์ผ ์์๊ฐ ์๋ [1:v][0:v]๋ฅผ ๊ธฐ์ค์ผ๋ก ํจ์ ์ฃผ์ํ์ธ์.
์ธํธ๋ก ๋ฉ์ธ ์์ํธ๋ก๋ฅผ ํ๋์ ๋น๋์ค๋ก ๊ฒฐํฉํ๊ณ ๋ฐฐ๊ฒฝ ์์ ๊ณผ ๋ฏน์ค:
ffmpeg -i https://storage.rendi.dev/sample/big_buck_bunny_720p_5sec_intro.mp4 -i https://storage.rendi.dev/sample/popeye_talking.mp4 -i https://storage.rendi.dev/sample/big_buck_bunny_720p_5sec_outro.mp4 -i https://storage.rendi.dev/sample/Neon%20Lights.mp3 -filter_complex "[0:v]fps=30,format=yuv420p,setsar=1[intro_v];[1:v]scale=-2:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2:black,fps=30,format=yuv420p,setsar=1[main_v];[2:v]fps=30,format=yuv420p,setsar=1[outro_v];[0:a]aformat=sample_fmts=fltp:channel_layouts=stereo[intro_a];[1:a]aformat=sample_fmts=fltp:channel_layouts=stereo[main_a];[2:a]aformat=sample_fmts=fltp:channel_layouts=stereo[outro_a];[intro_v][intro_a][main_v][main_a][outro_v][outro_a]concat=n=3:v=1:a=1[combined_video][combined_audio];[3:a]volume=0.1,aformat=sample_fmts=fltp,afade=t=in:ss=0:d=1.5,afade=t=out:st=20:d=2[bgm_faded];[combined_audio][bgm_faded]amix=inputs=2:duration=first:dropout_transition=2[final_audio]" -map "[combined_video]" -map "[final_audio]" -c:v libx264 -c:a aac -shortest intro_main_outro.mp4
duration=first ์ถ๋ ฅ ์ค๋์ค ์คํธ๋ฆผ ์ง์ ์๊ฐ์ ์
๋ ฅ ์คํธ๋ฆผ(๊ฒฐํฉ๋ ์ค๋์ค)๊ณผ ๊ฐ์์ผ ํ๋ฉฐ, dropout_transition=2๋ ๋ ์งง์ ์ค๋์ค๊ฐ ๊ฐ์๊ธฐ ๋์ด์ง์ง ์๋๋ก ํ์ด๋ ์์ ํจ๊ณผ๋ฅผ ์์ฑํฉ๋๋ค.
aformat=sample_fmts=fltp ์ค๋์ค ํ์์ 32๋นํธ ๋ถ๋์์์ ํ๋๋๋ก ๋ณํ (FFmpeg์์ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋๋ ํ์), ์จ๋ผ์ธ์์ ์ด์ ๋ํ ์ข์ ๊ฐ๋จํ ์์ค๋ฅผ ์ฐพ์ ์ ์์์ต๋๋ค.
๐ ๏ธ ๋ ๋น๋์ค๋ฅผ ์์ง์ผ๋ก ์๊ณ ๋ ๋ฒ์งธ ๋น๋์ค์ ์ค๋์ค ์ ์ง:
ffmpeg -i https://storage.rendi.dev/sample/big_buck_bunny_720p_16sec.mp4 -i https://storage.rendi.dev/sample/popeye_talking.mp4 -filter_complex "[0:v]scale=720:-2:force_original_aspect_ratio=decrease,pad=720:640:(ow-iw)/2:(oh-ih)/2:black[top];[1:v]scale=720:-2:force_original_aspect_ratio=decrease,pad=720:640:(ow-iw)/2:(oh-ih)/2:black[bottom];[top][bottom]vstack=inputs=2:shortest=1[v]" -map "[v]" -map 1:a -c:v libx264 -c:a aac -shortest output_stacked.mp4
shortest=1 ๋ ๋น๋์ค ์คํธ๋ฆผ์์ vstackํ ๋ ๋ ์งง์ ๊ฒ์ ๋ฐ๋ฆ
๋๋ค. -shortest๋ ์ถ๋ ฅ ๋น๋์ค์ ๋ ๋ฒ์งธ ์
๋ ฅ ๋น๋์ค์ ์ค๋์ค ์ฌ์ด์์ ๋ ์งง์ ๊ฒ์ ์ ํํฉ๋๋ค.
๋ฐ๋ณต๋๋ ์ ๋ ฅ ์ด๋ฏธ์ง์ ์ค๋์ค ํ์ผ์์ 10์ด ๋น๋์ค๋ฅผ ์์ฑ, ์ด๋ฏธ์ง๊ฐ ๋ทฐ๋ก ํ์ด๋์ธ:
ffmpeg -loop 1 -t 10 -i https://storage.rendi.dev/sample/bbb-splash.png -i https://storage.rendi.dev/sample/Neon%20Lights.mp3 -vf "scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:-1:-1:color=black,setsar=1,fade=t=in:st=0:d=1,format=yuv420p" -c:v libx264 -c:a aac -shortest output_loop.mp4์ ๋ช ๋ น์ด๋ ๋ชจ๋ ๋น๋์ค ํ๋ ์์ ๋ํด ์ด๋ฏธ์ง ํ๋ ์์ ๋ค์ด๋ก๋ํ๊ธฐ ๋๋ฌธ์ ๋๋ฆฌ๊ฒ ์คํ๋ฉ๋๋ค. ๋ ๋น ๋ฅด๊ฒ ์คํํ๋ ค๋ฉด png๋ฅผ ๋ก์ปฌ๋ก ๋ค์ด๋ก๋ํ๊ณ ๋ก์ปฌ ํ์ผ๋ก ๋ช ๋ น์ด๋ฅผ ์คํํ์ธ์.
-loop 1 ์
๋ ฅ ์ด๋ฏธ์ง๋ฅผ ๋ฌดํํ ๋ฐ๋ณตํฉ๋๋ค. -t 10 ๊ฐ์ ธ์ฌ ์
๋ ฅ ๋ฐ๋ณต์ ์ง์ ์๊ฐ์ 10์ด์ด๋ฏ๋ก ์
๋ ฅ ์ด๋ฏธ์ง๋ฅผ ๋ฌดํํ ๋ฐ๋ณตํ๋๋ผ๋ 10์ด ํ์ ์ค์งํฉ๋๋ค.
๋ฐ๋ณต์ ๋ํ ๋ฐ์ด๋ stackoverflow ์ฐธ์กฐ - ๊ผญ ์ฝ์ด๋ณด์ธ์
fade=t=in:st=0:d=1 ๋น๋์ค ์์ (st=0)์์ 1์ด (d=1) ํ์ด๋ ์ธ (t=in)
๐ ๏ธ ์ ๋ ฅ ์ด๋ฏธ์ง๋น 5์ด ๋ฐ ๋ฐฐ๊ฒฝ ์ค๋์ค๋ก ์ฌ๋ผ์ด๋์ผ ๋น๋์ค ์์ฑ, ์ด๋ฏธ์ง ๊ฐ ํ์ด๋ฉ:
ffmpeg -loop 1 -t 5 -i https://storage.rendi.dev/sample/rodents.png -loop 1 -t 5 -i https://storage.rendi.dev/sample/evil-frank.png -i https://storage.rendi.dev/sample/Neon%20Lights.mp3 -filter_complex "[0:v]format=yuv420p,fade=t=in:st=0:d=0.5,setpts=PTS-STARTPTS[v0];[1:v]format=yuv420p,fade=t=out:st=4.5:d=0.5,setpts=PTS-STARTPTS[v1];[v0][v1]xfade=transition=fade:duration=0.5:offset=4.5,format=yuv420p[v]" -map "[v]" -map 2:a -c:v libx264 -c:a aac -shortest slideshow_with_fade.mp4
์ฒซ ๋ฒ์งธ ์ด๋ฏธ์ง์์ ๋ ๋ฒ์งธ ์ด๋ฏธ์ง๋ก ํ์ด๋ฉํ ๋ 0.5์ด ๊ฒน์นจ์ด ์์ด ๊ฒฐ๊ณผ ๋น๋์ค๋ 9.5์ด์ ๋๋ค. ์ฒซ ๋ฒ์งธ ์ด๋ฏธ์ง๋ ํ์ด๋ ์ธ๋๊ณ ๋ง์ง๋ง ์ด๋ฏธ์ง๋ ํ์ด๋ ์์๋ฉ๋๋ค.
Details
[0:v]...[v0];[1:v]...[v1];[v0][v1]...[v] ์ฒซ ๋ฒ์งธ ์
๋ ฅ ๋น๋์ค ์คํธ๋ฆผ [0:v]๋ ํ์ด๋ ์ธ์ผ๋ก ํํฐ๋ง๋๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ v0๋ก ํ์๋๋ฉฐ, ๊ทธ ๋ค์ ๋ ๋ฒ์งธ ์
๋ ฅ ๋น๋์ค ์คํธ๋ฆผ์ด ํํฐ๋ง๋๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ v1๋ก ํ์๋๋ฉฐ, ๊ทธ ๋ค์ xfade๋ก ํจ๊ป ์ฐ๊ฒฐ๋๊ณ ์ถ๋ ฅ ๋น๋์ค ๊ฒฐ๊ณผ๋ v๋ก ํ์๋ฉ๋๋ค
xfade=transition=fade:duration=0.5:offset=4.5 ์ฒซ ๋ฒ์งธ ์ด๋ฏธ์ง์ 4.5์ด์์ 0.5์ด ๋์ ์ง์๋๋ ํ์ด๋ ์์ ์ ํ์ ์์ํ๋ฉด์ ์ ํ ์ค์ ๋ ๋ฒ์งธ ์ด๋ฏธ์ง๋ฅผ ์ถ๊ฐํฉ๋๋ค.
๐ ๏ธ ์ด๋ฏธ์ง์์ Ken Burns ์คํ์ผ ๋น๋์ค ์์ฑ:
ffmpeg -loop 1 -i https://storage.rendi.dev/sample/rodents.png -loop 1 -i https://storage.rendi.dev/sample/evil-frank.png -i https://storage.rendi.dev/sample/Neon%20Lights.mp3 -filter_complex "[0:v]scale=8000:-1,zoompan=z='zoom+0.005':x='iw/2-(iw/zoom/2)':y='ih/2-(ih/zoom/2)':d=100:s=1920x1080:fps=25,trim=duration=4,format=yuv420p,setpts=PTS-STARTPTS[v0];[1:v]scale=8000:-1,zoompan=z='if(lte(zoom,1.0),1.5,max(zoom-0.005,1.005))':x=0:y='ih/2-(ih/zoom/2)':d=100:s=1920x1080:fps=25,trim=duration=4,format=yuv420p,setpts=PTS-STARTPTS[v1];[v0][v1]xfade=transition=fade:duration=1:offset=3,format=yuv420p[v]" -map "[v]" -map 2:a -c:v libx264 -c:a aac -shortest output_kenburns.mp4
๋ช ๋ น์ด๋ ๋ ๊ฐ์ ์ ๋ ฅ ์ด๋ฏธ์ง์ ๋ฐฐ๊ฒฝ ์ค๋์ค๋ก๋ถํฐ ๋น๋์ค๋ฅผ ์์ฑํฉ๋๋ค. ์ฒซ ๋ฒ์งธ ์ด๋ฏธ์ง์ ์ค์์ ํ๋ํ์ฌ 4์ด๊ฐ ์ฌ์ํ๊ณ ๋ค์ ์ด๋ฏธ์ง๋ก ํ์ด๋ ์ ํํฉ๋๋ค. ๋ ๋ฒ์งธ ์ด๋ฏธ์ง๋ ์ผ์ชฝ์์ 4์ด๊ฐ ์ฌ์ํ๋ฉด์ ์ถ์๋ฉ๋๋ค. ๋ ์ด๋ฏธ์ง ์ฒญํฌ ์ฌ์ด์ 1์ด ํ์ด๋ ์ ํ์ผ๋ก ์ธํด ์ถ๋ ฅ์ 7์ด ๊ธธ์ด์ด๋ฉฐ, ๋ช ๋ น์ด๋ ๋น๋์ค์ ๋ง์ถฐ ์ค๋์ค๋ฅผ ๋จ์ถํฉ๋๋ค.
z='zoom+0.005' ์์ฑ๋ ๊ฐ ์ ํ๋ ์์ ์ด์ ํ๋ ์์ 0.005 ์ค์ ์ถ๊ฐํ๊ฑฐ๋, ์ด์ ํ๋ ์์ 1.005๋ฐฐ ํ๋ํฉ๋๋ค.
x='iw/2-(iw/zoom/2)':y='ih/2-(ih/zoom/2)' ํ๋ ์ ์ค์์ผ๋ก ํจ๋
d=100:s=1920x1080:fps=25 ํจ๊ณผ๊ฐ 100 ํ๋ ์ (d)์ ์์ฑํ๊ณ , ์ถ๋ ฅ ํด์๋ s=1920x1080 ๋ฐ ์ด๋น 25 ํ๋ ์ fps๋ก 4์ด ํจ๊ณผ์์ ์ง์ ํฉ๋๋ค (100 ํ๋ ์์ 25 fps๋ก ๋๋)
scale=8000:-1 ํ๋ ์์ ๋จผ์ ์
์ค์ผ์ผํ ๋ค์ ํ๋ํ๋ ๋ฐ ์ฌ์ฉ๋๋ฉฐ, zoompan ํํฐ์์ ๋ฐ์ํ๋ ๋จ๋ฆผ ๋ฒ๊ทธ๋ฅผ ์
์ค์ผ์ผ๋ง์ ์ํ ์ถ๊ฐ ์ฐ์ฐ ์๊ฐ์ ๋๊ฐ๋ก ๋ฐฉ์งํฉ๋๋ค. -1์ 8000px ๋๋น์ ๋ฐ๋ผ ์ข
ํก๋น๊ฐ ์ ์ง๋๋๋ก ๋์ด๋ฅผ ์กฐ์ ํ๋ค๋ ์๋ฏธ์
๋๋ค. ์ข์ ์๋ฃ: https://superuser.com/a/1112680/431710 , https://superuser.com/questions/1112617/ffmpeg-smooth-zoompan-with-no-jiggle
zoompan=z='if(lte(zoom,1.0),1.5,max(zoom-0.005,1.005))' ์ด ๋ถ๋ถ์ ํ๋๋ ์์ ํ๋ ์์์ ์ถ์ํฉ๋๋ค. ์ค ํฉํฐ๊ฐ 1.0๋ณด๋ค ์์ผ๋ฉด 1.5๋ก ์ค์ ํฉ๋๋ค - ์ด๊ฒ์ด ์์ ํ๋ ์์ ํด๋นํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ๋ช ๋ น์ด๋ ์ค ํฉํฐ๊ฐ 1.005์ ๋๋ฌํ ๋๊น์ง ๊ฐ ํ๋ ์์์ 0.005์ฉ ์ถ์ํ์ฌ ์ค ์์ ํจ๊ณผ๋ฅผ ์ฃผ๊ณ , ๊ทธ ๋ค์ ์ค ๋ณ๊ฒฝ์ ์ค์งํฉ๋๋ค - ์ค ์์ ํจ๊ณผ๊ฐ ์ฌ์ค์ ๋์ง ์๋๋ก ์ ์งํฉ๋๋ค.
trim=duration=4 ์
๋ ฅ ํ์ผ ์์ -t=4๋ฅผ ์ง์ ํ๊ณ ์ด ์ด๋ฏธ์ง ์ฒญํฌ๋ฅผ 4์ด๋ก ์ ์งํ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํ์ต๋๋ค (์์ ๋ฃจํ ์
๋ ฅ ์ด๋ฏธ์ง๋ก๋ถํฐ ๋น๋์ค ์์ฑ๊ณผ ๊ฐ์ด). ๊ทธ๋ ๊ฒ ํ๋ ค๊ณ ์๋ํ์ ๋, xfade๋ก ์ธํด ์ฒซ ๋ฒ์งธ ์ฒญํฌ๋ 4์ด๊น์ง ์ฌ๋ฐ๋ฅธ ๊ธธ์ด์์ง๋ง, ๋ ๋ฒ์งธ ์ฒญํฌ๋ ์ด ์ถ๋ ฅ ๋น๋์ค๊ฐ ์ค๋์ค ๊ธธ์ด์ ์ผ์นํ๋๋ก ๋ฐ๋ณต๋์์ต๋๋ค. ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ค์ํ ๋ฐฉ๋ฒ์ ์๋ํ์ง๋ง ์๋ฌด๊ฒ๋ ๋์์ด ๋์ง ์์์ต๋๋ค. ์ด๋ ์๋ง๋ ํ๋ ์ต๋ ์ํ์ ์ง์ ํ์ง ์๊ณ fps์ ํ๋ ์ ์๋ฅผ ์ง์ ํ์ฌ ๊ธฐ๋ณธ์ ์ผ๋ก -t์ ๋ชฉ์ ์ ์์ ๋ zoompan ํํฐ ๋๋ฌธ์ผ ๊ฒ์
๋๋ค.
์๋ํ ์ ์ผํ ๋ฐฉ๋ฒ์ zoompan ํ์ trim duration์ ์ง์ ํ๋ ๊ฒ์ด์์ต๋๋ค.
ffmpeg -i https://storage.rendi.dev/sample/big_buck_bunny_720p_16sec.mp4 -vf "select='gt(trunc(t/2),trunc(prev_t/2))',setpts='PTS*0.1',scale=trunc(oh*a/2)*2:320:force_original_aspect_ratio=decrease,pad=trunc(oh*a/2)*2:320:-1:-1" -loop 0 -an output.gif๋น๋์ค์์ 320px ๋๋น๋ก ์๋ ํฌ๊ธฐ ์กฐ์ ๋ ๋ฃจํ gif๋ฅผ ์์ฑํ๊ณ , 2๋ฒ์งธ๋ง๋ค ํ๋ ์์ ๊ฐ์ ธ์ gt(trunc(t/2),trunc(prev_t/2)) ์ฌ์ ์๋๋ฅผ 10๋ฐฐ ๊ฐ์ setpts='PTS*0.1'
-loop 0์ ๊ธฐ๋ณธ๊ฐ์ด๋ฉฐ ์ค์ ๋ก ์๋ตํ ์ ์์ผ๋ฉฐ, ๋ฃจํ๊ฐ ๋ฌดํ์์ ๋ช
์ํฉ๋๋ค. ํ ๋ฒ๋ง ๋ฃจํํ๋ ค๋ฉด -loop 1์ ์ฌ์ฉํ์ธ์.
ํ์ด๋ ํจ๊ณผ๊ฐ ์๋ ๋ถ๋ถ์ผ๋ก ๋ถํ ๋๋ ๋จ์ผ ์ ๋ ฅ ๋น๋์ค๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋น๋์ค ํธ์ง๋ณธ ์์ฑ:
ffmpeg -i https://storage.rendi.dev/sample/BigBuckBunny_320x180.mp4 -filter_complex "[0:v]trim=start=11:end=15,setpts=PTS-STARTPTS,fade=t=in:st=0:d=0.5,fade=t=out:st=3.5:d=0.5[v1];[0:a]atrim=start=11:end=15,asetpts=PTS-STARTPTS,afade=t=in:st=0:d=0.5,afade=t=out:st=3.5:d=0.5[a1];[0:v]trim=start=21:end=25,setpts=PTS-STARTPTS,fade=t=in:st=0:d=0.5,fade=t=out:st=3.5:d=0.5[v2];[0:a]atrim=start=21:end=25,asetpts=PTS-STARTPTS,afade=t=in:st=0:d=0.5,afade=t=out:st=3.5:d=0.5[a2];[v1][a1][v2][a2]concat=n=2:v=1:a=1[outv][outa]" -map "[outv]" -map "[outa]" -c:v libx264 -c:a aac output_fade_in_out.mp4
์ด ๋ช ๋ น์ด๋ ์ ๋ ฅ ๋น๋์ค์์ ๋ ๊ฐ์ ์ธ๊ทธ๋จผํธ(11-15์ด์ 21-25์ด)๋ฅผ ๊ฐ์ ธ์ ๊ฐ ์ธ๊ทธ๋จผํธ์ ํ์ด๋ ์ธ/์์ ํจ๊ณผ๋ฅผ ์ ์ฉํ๊ณ ๋์ ์ฐ๊ฒฐํฉ๋๋ค.
Details
trim=start=X:end=Y ๋น๋์ค๋ฅผ ์ง์ ๋ ์๊ฐ ๋ฒ์๋ก ์๋ฅด๊ณ , atrim - ์ค๋์ค์ ํด๋น
setpts=PTS-STARTPTS ํ์์คํฌํ๋ฅผ 0๋ถํฐ ์์ํ๋๋ก ์ฌ์ค์
fade=t=in:st=0:d=0.5...fade=t=out:st=3.5:d=0.5 ์ฌ๋ผ์ด๋์ผ ์์ฑ์์ ์ ์ฐธ์กฐ
afade ์ค๋์ค ์ฒ๋ฆฌ์์ ์ ์ฐธ์กฐ
concat=n=2:v=1:a=1 ๋น๋์ค์ ์ค๋์ค ๋ชจ๋๋ฅผ ํฌํจํ ๋ ์ธ๊ทธ๋จผํธ๋ฅผ ๊ฒฐํฉ
7์ด ํ๋ ์์์ ์ธ๋ค์ผ ์์ฑ:
ffmpeg -i https://storage.rendi.dev/sample/big_buck_bunny_720p_16sec.mp4 -ss 00:00:07 -frames:v 1 output_thumbnail.png
์ถ๋ ฅ ์ด๋ฏธ์ง ํ์ง์ ์ ์ดํ๋ ค๋ฉด -q:v๋ฅผ ์ฌ์ฉํ์ธ์:
ffmpeg -i https://storage.rendi.dev/sample/big_buck_bunny_720p_16sec.mp4 -ss 00:00:07 -frames:v 1 -q:v 2 output_thumbnail.jpg
๊ฐ์ 2์์ 31๊น์ง์ด๋ฉฐ, 2๊ฐ ์ต๊ณ , 31์ด ์ต์ ์ ๋๋ค. ์ฐธ์กฐ: Stackoverflow 1 Stackoverflow 2
๋ ๊ฐ์ ์ธ๋ค์ผ ์์ฑ - 5์ด ํ ์ฒซ ๋ฒ์งธ ํ๋ ์์์ ํ๋, 15์ด ํ ์ฒซ ๋ฒ์งธ ํ๋ ์์์ ํ๋:
ffmpeg -i https://storage.rendi.dev/sample/big_buck_bunny_720p_16sec.mp4 -filter_complex "[0:v]split=2[first][second];[first]select='gte(t,5)'[thumb1];[second]select='gte(t,15)'[thumb2]" -map [thumb1] -frames:v 1 output_thumbnail_1.png -map [thumb2] -frames:v 1 output_thumbnail_2.png-frames:v 1 ๋น๋์ค ํ๋ ์ 1๊ฐ๋ง ์ถ๋ ฅ
์ฅ๋ฉด ๋ณ๊ฒฝ์ ์ฒซ ๋ฒ์งธ ํ๋ ์์์ ์ธ๋ค์ผ ์์ฑ:
ffmpeg -i https://storage.rendi.dev/sample/big_buck_bunny_720p_16sec.mp4 -vf "select='gt(scene,0.4)'" -frames:v 1 -q:v 2 thumbnail_scene.jpggt(scene,0.4) ๋งค๊ฐ๋ณ์๋ ์ฅ๋ฉด ๋ณ๊ฒฝ์ ๋ํ๋ด๋ ํ๋ ์ ๋ณํ์ ๋ํ FFmpeg์ ๋ฏผ๊ฐ๋๋ฅผ ๊ฒฐ์ ํฉ๋๋ค. ๊ฐ์ 0์์ 1๊น์ง์ด๋ฉฐ, ๋ฎ์ ๊ฐ์ FFmpeg๊ฐ ์ฅ๋ฉด ๋ณ๊ฒฝ์ ๋ ๋ฏผ๊ฐํด์ง๊ณ ๋ ๋ง์ ์ฅ๋ฉด ๋ณ๊ฒฝ์ ์ธ์ํ๋ค๋ ์๋ฏธ์ ๋๋ค. ๊ถ์ฅ ๊ฐ์ 0.3์์ 0.5์ ๋๋ค.
FFmpeg๋ก ์ฅ๋ฉด ๊ฐ์ง์ ๋ํ ์ข์ stackoverflow ๋ ผ์
ffmpeg -i https://storage.rendi.dev/sample/bbb-splash.png -i https://storage.rendi.dev/sample/rodents.png -i https://storage.rendi.dev/sample/evil-frank.png -filter_complex "[1]scale=640:360,pad=648:368:4:4:black[overlay1];[2]scale=640:360,pad=648:368:4:4:black[overlay2];[0][overlay1]overlay=0:main_h-overlay_h[tmp1];[tmp1][overlay2]overlay=main_w-overlay_w:main_h-overlay_h" -frames:v 1 thumbnail_overlayed.png์๋ ๋ชจ๋ ๋ช ๋ น์ด๋ ๋น๋์ค์์ ํ๋ ์์ ์ถ์ถํ์ฌ ๋ค์ํ ์คํ ๋ฆฌ๋ณด๋๋ฅผ ์์ฑํฉ๋๋ค.
ffmpeg -i https://storage.rendi.dev/sample/big_buck_bunny_720p_16sec.mp4 -vf "select='gt(scene,0.4)',scale=640:480,tile=2X2" -frames:v 1 scene_storyboard.jpg๐ ๏ธ tile=2X2๋ฅผ ์ฌ์ฉํ์ฌ ๋น๋์ค์ ์ฅ๋ฉด์์ 2X2 ์คํ ๋ฆฌ๋ณด๋๋ฅผ ์์ฑํฉ๋๋ค. FFmpeg ๋ฌธ์์ ์์
ffmpeg -i https://storage.rendi.dev/sample/big_buck_bunny_720p_16sec.mp4 -vf "select='gt(scene,0.4)'" -vsync 0 scene_storyboard_%03d.jpg๋์ผํ ์คํ ๋ฆฌ๋ณด๋๋ฅผ ์์ฑํ์ง๋ง ์ฅ๋ฉด๋ณ๋ก ๋ณ๋์ ์ด๋ฏธ์ง ํ์ผ๋ก
๐ ๏ธ -vsync 0 ์ค๋ณต์ด ์๋๋ก ๋์ผํ ์ฅ๋ฉด์ ์ํ๋ ํ๋ ์์ ์ญ์ ํฉ๋๋ค. ์ด ๋งค๊ฐ๋ณ์๋ ์ฌ์ฉํ๊ธฐ ๋ณต์กํ๋ฉฐ, ์ข์ ์ค๋ช
vsync๋ ์ฌ์ฉํด๋ ๊ด์ฐฎ์ง๋ง ์๋ก์ด ๋ฒ์ ์ ffmpeg์์๋ ์ฌ์ฉ ์ค๋จ๋์์ผ๋ฉฐ,
-fps_mode๊ฐ ๋ณ๊ฒฝ์ฌํญ์ ๋๋ค ์ฐธ์กฐ FFmpeg ๋ฌธ์
ffmpeg -skip_frame nokey -i https://storage.rendi.dev/sample/big_buck_bunny_720p.mp4 -vf 'scale=640:480,tile=4x4' -an -vsync 0 keyframes%03d.png์ฅ๋ฉด ๋์ ๋น๋์ค์ ํคํ๋ ์์ ๊ธฐ๋ฐ์ผ๋ก ํ์ผ๋ง๋ ์ฌ๋ฌ ํ์ผ์ด ์๋ ์คํ ๋ฆฌ๋ณด๋๋ฅผ ์์ฑํฉ๋๋ค. ์์ ๋ FFmpeg ๋ฌธ์์์
-skip_frame nokey ํ
์คํธ๊ฐ ์ ์ํ๋ ๋๋ก - ํค๊ฐ ์๋ ํ๋ ์์ ๊ฑด๋๋๋๋ค.
ffmpeg -i https://storage.rendi.dev/sample/big_buck_bunny_720p_16sec.mp4 -vf "select=not(mod(n,10ๅ)),scale=640:480,tile=4x2" -vsync 0 tile_4_2_frames_10_%03d.png๋น๋์ค์ 10๋ฒ์งธ๋ง๋ค ํ๋ ์์์ 4X2 ํ์ผ ํ์ผ์ ์์ฑํฉ๋๋ค. ํ๋ ์๋ณ๋ก ์ด๋ฏธ์ง๋ฅผ ์์ฑํ๋ ค๋ฉด ,tile4x2 ๋ถ๋ถ์ ์ ๊ฑฐํ์ธ์.
ffmpeg -i https://storage.rendi.dev/sample/popeye_talking.mp4 -vf "scale=w=1080:h=1920:force_original_aspect_ratio=decrease,pad=1080:1920:(ow-iw)/2:(oh-ih)/2:color=black,setsar=1:1" -crf 18 -preset veryslow -threads 0 -tune fastdecode -movflags +faststart output_scaled_optimized.mp4์ด ๋ช ๋ น์ด๋ ์ ๋ ฅ ๋น๋์ค์ ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ๋ฉฐ ์์นด์ด๋น, ์คํธ๋ฆฌ๋ฐ(๋น๋ผ์ด๋ธ) ๋ฐ ๋ค์ํ ์์ง ์ฅ์น์์ ์ฌ์์ ์ข์ต๋๋ค. ํน๋ณํ ์ด์ ๊ฐ ์๋ ํ ์ผ๋ฐ์ ์ผ๋ก ๋ชจ๋ FFmpeg ๋ช ๋ น์ด์ ์ด ๋ช ๋ น์ด์ ํ๋๊ทธ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ด ๋ช ๋ น์ด์ ๋งค๊ฐ๋ณ์์๋ ๋ค์ํ ๊ตฌ์ฑ ์ต์ ์ด ์์ต๋๋ค. FFmpeg ์ฐธ์กฐ๋ฅผ ํตํด ์ฝ์ด๋ณด์๊ธฐ ๋ฐ๋๋๋ค. ์ฌ๊ธฐ์ ์์ธํ ์ค๋ช ํด ๋๋ฆฌ๊ธฐ๋ฅผ ์ํ์๋ฉด ์๋ ค์ฃผ์ธ์.
-tune fastdecode ์ธ์ฝ๋ฉ๋ ์ถ๋ ฅ์ด ๋์ฝ๋ฉํ๋ ๋ฐ ๋ ์ ์ ์ฐ์ฐ๋ ฅ์ ํ์๋ก ํฉ๋๋ค - ๋ค์ํ ์์ง ์ฅ์น์์ ๋ณผ ๋ ์ข์ต๋๋ค. ๋น ๋ฅธ ์ธ์ฝ๋ฉ๊ณผ ๋ฎ์ ์ง์ฐ์๊ฐ ์คํธ๋ฆฌ๋ฐ์ ์ํ ์ต์ ํ์๋ zerolatency๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค
-preset veryslow ๋ ๋๋ฆฐ ์ธ์ฝ๋ฉ์ด์ง๋ง ๊ณ ํ์ง์ ์ ์งํ๋ฉด์ ๋ ์์ถ๋ ์ถ๋ ฅ - ์น ๋ณด๊ธฐ(VOD, ์์นด์ด๋น, ๋น๋ผ์ด๋ธ ์คํธ๋ฆฌ๋ฐ)์ ์ต์ ํํ ๋ ์ข์ต๋๋ค. ๋ ํฐ ์ถ๋ ฅ ํ์ผ์ ๋๊ฐ๋ก ๋งค์ฐ ๋น ๋ฅธ ์ธ์ฝ๋ฉ์ด ํ์ํ๋ค๋ฉด ultrafast๋ฅผ ์ฌ์ฉํ์ธ์.
-threads 0 ์ฌ์ฉํ ์์คํ
์ค๋ ๋ ์๋ฅผ ์ง์ ํฉ๋๋ค. ์ต์ ์ 0(๊ธฐ๋ณธ๊ฐ)์ด๋ฉฐ, ์ผ๋ฐ์ ์ผ๋ก ์ด ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ์ง ์๊ณ FFmpeg๊ฐ ์ต์ ํํ๋๋ก ํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ต๋๋ค. ํ์ง๋ง ๋๋๋ก ์์คํ
๊ณผ ๋ช
๋ น์ด์ ๋ฐ๋ผ ์กฐ์ ํ๊ณ ์ถ์ ์๋ ์์ต๋๋ค
-c:v ๋น๋์ค ์ธ์ฝ๋๋ฅผ ์ง์ ํ๊ณ -c:a ์ค๋์ค ์ธ์ฝ๋๋ฅผ ์ง์ ํฉ๋๋ค.
-c:a aac AAC ์ธ์ฝ๋ฉ๋ ์ค๋์ค. ์ด๊ฒ์ FFmpeg์ ๊ธฐ๋ณธ๊ฐ์ด๊ธฐ๋ ํ๋ฉฐ, ์ง์ ํ๋ ๊ฒ์ด ์ข์ ๊ดํ์
๋๋ค.
-c:a libmp3lame MP3์ฉ ์ธ์ฝ๋ฉ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
-an ์ถ๋ ฅ์์ ์ค๋์ค ๋นํ์ฑํ
-c:v libx264 - H264 (AVC)
์ผ๋ฐ์ ์ผ๋ก FFmpeg๋ libx264๊ฐ ํฌํจ๋ FFmpeg ๋น๋๋ฅผ ์ฌ์ฉํ์ง ์๋ ํ MP4 ์ถ๋ ฅ์ ์์ฒญํ ๋ H264๋ฅผ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ฌ์ฉํฉ๋๋ค. ํญ์ ์ฝ๋ฑ์ ์ง์ ํ๋ ๊ฒ์ด ์ข์ ๊ดํ์ ๋๋ค.
libx265 - H265 (HEVC), ์๋ก์ด ์ฝ๋ฑ์ ๋์๊ณผ ์ ์ด์์ ๋งค์ฐ ์ ์ฌํฉ๋๋ค. H264๋ ์ฌ์ ํ ๊ฐ์ฅ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
Apple ์ฅ์น๋ ๋๋๋ก FFmpeg๊ฐ ์์ฑํ H265 ๋น๋์ค์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค (์: iOS Airdrop์์), ์ด๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด
-vtag hvc1์ ์ฌ์ฉํ์ธ์. ๊ฐ์ฌํฉ๋๋ค! ๊ด๋ จ ์๋ฃ
ffmpeg -i https://storage.rendi.dev/sample/big_buck_bunny_720p_16sec.mp4 -c:v libx265 -vtag hvc1 -c:a copy output_265.mp4
format=yuv420p H264 YUV ํ๋ฉด ์์ ํ์์ ๋๋ถ๋ถ์ ํ๋ ์ด์ด์์ ์ฌ์ ํธํ์ฑ์ ์ํด ์ฌ์ฉ๋ฉ๋๋ค. ์ด๋ฏธ์ง๋ฅผ ๋น๋์ค๋ก ๋ณํํ ๋์ ์ผ๋ฐ์ ์ผ๋ก ์ถ๋ ฅ ๋น๋์ค์์ ์ฌ์ ๋ฌธ์ ๊ฐ ์์ ๋ ์ด ํ๋๊ทธ๋ฅผ ์ฌ์ฉํ์ธ์. ํน๋ณํ ์ด์ ๊ฐ ์๋ค๋ฉด ๋ง์ ๋๋ค.
QuickTime๊ณผ ๋๋ถ๋ถ์ ๋ค๋ฅธ ํ๋ ์ด์ด์์ ์ถ๋ ฅ์ด ์๋ํ๋๋ก -vf format=yuv420p (๋๋ ๋ณ์นญ -pix_fmt yuv420p)๋ฅผ ์ฌ์ฉํด์ผ ํ ์๋ ์์ต๋๋ค. ์ด๋ฌํ ํ๋ ์ด์ด๋ H.264 ๋น๋์ค์ ๋ํด 4:2:0 ํฌ๋ก๋ง ์๋ธ์ํ๋ง์ด ์๋ YUV ํ๋ฉด ์์ ๊ณต๊ฐ๋ง ์ง์ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์์ค์ ๋ฐ๋ผ ffmpeg๊ฐ ์ด๋ฌํ ํ๋ ์ด์ด์ ํธํ๋์ง ์์ ์ ์๋ ํฝ์ ํ์์ผ๋ก ์ถ๋ ฅํ ์ ์์ต๋๋ค.
yuv420p์ ๋ํ ์ข์ ์ ๋ณด๋ ์ด reddit ์ค๋ ๋์ ์์ต๋๋ค.
-crf ์ผ์ ๋น์จ ํฉํฐ (CRF) - libx264์ libx265์ ๊ธฐ๋ณธ ๋นํธ๋ ์ดํธ ์ ์ด ์ต์
์
๋๋ค:
์ต๊ณ ํ์ง์ ์ ์งํ๊ณ ํ์ผ ํฌ๊ธฐ์ ๋ ์ ๊ฒฝ ์ฐ๋ ค๋ฉด ์ด ๋น์จ ์ ์ด ๋ชจ๋๋ฅผ ์ฌ์ฉํ์ธ์. ์ด๋ ๋๋ถ๋ถ์ ์ฌ์ฉ์ ๊ถ์ฅ๋๋ ๋น์จ ์ ์ด ๋ชจ๋์ ๋๋ค.
์ด ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ฉด ์ถ๋ ฅ ํ์ผ ํฌ๊ธฐ๊ฐ ๋ ์ค์ํ ๋ ์ธ์ฝ๋๊ฐ ์ ์ฒด ํ์ผ์ ๋ํด ํน์ ์ถ๋ ฅ ํ์ง์ ๋ฌ์ฑํ๋ ค๊ณ ์๋ํ ์ ์์ต๋๋ค. ์ด๋ ๋จ์ผ ํจ์ค๋ก ์ต๋ ์์ถ ํจ์จ์ฑ์ ์ ๊ณตํฉ๋๋ค. ๊ฐ ํ๋ ์์ ๋ํด ์์ ์์ํ๊ธฐ๋ฅผ ์กฐ์ ํจ์ผ๋ก์จ ์์ฒญ๋ ํ์ง ์์ค์ ์ ์งํ๋ ๋ฐ ํ์ํ ๋นํธ๋ ์ดํธ๋ฅผ ์ป์ต๋๋ค. ๋จ์ ์ ํน์ ํ์ผ ํฌ๊ธฐ๋ฅผ ์ป๊ฑฐ๋ ํน์ ํฌ๊ธฐ๋ ๋นํธ๋ ์ดํธ๋ฅผ ์ด๊ณผํ์ง ์๋๋ก ์ง์ํ ์ ์๋ค๋ ๊ฒ์ด๋ฉฐ, ์ด๋ ์ด ๋ฐฉ๋ฒ์ด ์คํธ๋ฆฌ๋ฐ์ฉ ๋น๋์ค ์ธ์ฝ๋ฉ์ ๊ถ์ฅ๋์ง ์๋๋ค๋ ์๋ฏธ์ ๋๋ค.
CRF ์ค์ผ์ผ์ ๋ฒ์๋ 0โ51์ด๋ฉฐ, ์ฌ๊ธฐ์ 0์ ๋ฌด์์ค (8๋นํธ๋ง, 10๋นํธ์ ๊ฒฝ์ฐ -qp 0 ์ฌ์ฉ), 23์ด ๊ธฐ๋ณธ๊ฐ, 51์ด ๊ฐ๋ฅํ ์ต์ ์ ํ์ง์ ๋๋ค. ๋ ๋ฎ์ ๊ฐ์ ์ผ๋ฐ์ ์ผ๋ก ๋ ๋์ ํ์ง๋ก ์ด์ด์ง๋ฉฐ, ์ฃผ๊ด์ ์ผ๋ก ํฉ๋ฆฌ์ ์ธ ๋ฒ์๋ 17โ28์ ๋๋ค. 17 ๋๋ 18์ ์๊ฐ์ ์ผ๋ก ๋ฌด์์ค ๋๋ ๊ฑฐ์ ๋ฌด์์ค๋ก ๊ฐ์ฃผํ์ธ์; ์ ๋ ฅ๊ณผ ๋์ผํ๊ฑฐ๋ ๊ฑฐ์ ๋์ผํ๊ฒ ๋ณด์ฌ์ผ ํ์ง๋ง ๊ธฐ์ ์ ์ผ๋ก ๋ฌด์์ค์ ์๋๋๋ค. ๋ฒ์๋ ์ง์์ ์ด๋ฏ๋ก CRF ๊ฐ์ +6 ์ฆ๊ฐ์ํค๋ฉด ๋นํธ๋ ์ดํธ/ํ์ผ ํฌ๊ธฐ๊ฐ ๋๋ต ์ ๋ฐ์ด ๋๊ณ , -6์ ๋๋ต ๋ ๋ฐฐ์ ๋นํธ๋ ์ดํธ๋ก ์ด์ด์ง๋๋ค.
์ผ๋ฐ์ ์ธ ์กฐ์ธ์ ๋งค์ฐ ๊ณ ํ์ง H264 ์ถ๋ ฅ์ ์ํด -crf 18์ ์ฌ์ฉํ๋ ๊ฒ์
๋๋ค. -crf 10์ ์ฌ์ฉํ๋ฉด ๋ ๋์ ํ์ง์ ๋น๋์ค๊ฐ ๋์จ๋ค๋ ๊ฒ์ ๋ฐ๊ฒฌํ์ต๋๋ค.
-movflags +faststart๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ปจํ ์ด๋ ์์ชฝ์ผ๋ก ์ด๋ํ์ฌ ์น ๋ณด๊ธฐ์ ์ต์ ํํ๊ณ ๋น๋์ค๊ฐ ์จ๋ผ์ธ์์ ๋ ๋น ๋ฅด๊ฒ ์ฌ์๋๋๋ก ๋ง๋์ธ์:
ffmpeg -i https://storage.rendi.dev/sample/big_buck_bunny_720p_16sec.mp4 -c copy -movflags +faststart big_buck_bunny_720p_16sec_faststart.mp4
YouTube ๊ถ์ฅ์ฌํญ์ faststart๊ฐ ์๋ MP4 ํ์ผ์ YouTube์ ์ ๋ก๋ํ๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ฉด ์ด๋ค์ VP9๋ก ์ฌ์ธ์ฝ๋ฉํฉ๋๋ค.
Fast start๋ MP4, M4A ๋ฐ MOV์์ ์ง์๋๋ฉฐ ์ฒ๋ฆฌํ๋ ๋ฐ ๋ช ์ด๊ฐ ๊ฑธ๋ฆด ์ ์์ต๋๋ค faststart๊ฐ libx265์ ์๋ํ๋ค๊ณ ๊ณต์์ ์ผ๋ก ๋ช ์๋ ๊ณณ์ ์ฐพ์ ์ ์์์ง๋ง, ๋ค์ ๋ช ๋ น์ด๋ ์๋ํจ์ ๋ณด์ฌ์ค๋๋ค:
ffmpeg -i https://storage.rendi.dev/sample/big_buck_bunny_720p_16sec.mp4 -c:v libx265 -c:a copy -movflags +faststart big_buck_bunny_720p_16sec_h265_faststart.mp4
big_buck_bunny_720p_16sec_h265_faststart.mp4๊ฐ ์ค์ ๋ก moov faststart๋ก ์ธ์ฝ๋ฉ๋์๋์ง ํ์ธํ๋ ค๋ฉด ๋ค์์ ์คํํ์ธ์:
ffprobe -v trace -i your_video.mp4
๊ทธ๋ฆฌ๊ณ ์์ ๋ถ๋ถ ๊ทผ์ฒ์ [mov,mp4,m4a,3gp,3g2,mj2 @ 0x...] type:'moov' size:... pos:...์ ์ ์ฌํ ์ค์ด ์๋์ง ํ์ธํ์ธ์.
โWebM์ฉ VP9 ๋น๋์ค ์ธ์ฝ๋๋ก, ์คํ ์์ค์ด๊ณ ๋ก์ดํฐ ์๋ ๋ฏธ๋์ด ํ์ผ ํ์์
๋๋ค. VP9๋ Google์ด ์์ ํ๊ณ ์์ผ๋ฉฐ, YouTube์ ๋๋ถ๋ถ์ ๋น๋์ค๊ฐ ์ด๊ฒ์ผ๋ก ์ธ์ฝ๋ฉ๋ฉ๋๋ค. ์ ์ ์น ํธ์คํ
๋น๋์ค๋ฅผ ์ํด ์ค๊ณ๋๊ณ ์ต์ ํ๋ ์ธ์ฝ๋ฉ์
๋๋ค. libvpx-vp9๋ ๋์ผํ ์๊ฐ์ ํ์ง์ ์ ์งํ๋ฉด์ libx264(๊ธฐ๋ณธ H264 ์ธ์ฝ๋)์ ๋นํด ์ฝ 20โ50% ๋นํธ๋ ์ดํธ๋ฅผ ์ ์ฝํ ์ ์์ต๋๋ค.
libvpx-vp9์ ์ผ์ ํ์ง -crf ์ธ์ฝ๋ฉ - libx264์ ์ผ์ ๋น์จ ํฉํฐ์ ์ ์ฌ:
ffmpeg -i https://storage.rendi.dev/sample/big_buck_bunny_720p_16sec.mp4 -c:v libvpx-vp9 -crf 15 -b:v 0 -c:a libopus big_buck_bunny_720p_16sec.webm
์ด ๋ชจ๋๋ฅผ ์๋์ํค๋ ค๋ฉด
-crf์-b:v 0์ ์กฐํฉ์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.-b:v๋ ๋ฐ๋์ 0์ด์ด์ผ ํฉ๋๋ค. ๋ ๋๊ฒ ์ค์ ํ๊ฑฐ๋ ์์ ํ ์๋ตํ๋ฉด ๋์ ์ ํ๋ ํ์ง ๋ชจ๋๊ฐ ํธ์ถ๋ฉ๋๋ค.
CRF ๊ฐ์ 0โ63๊น์ง ๊ฐ๋ฅํฉ๋๋ค. ๋ฎ์ ๊ฐ์ผ์๋ก ๋ ๋์ ํ์ง์ ์๋ฏธํฉ๋๋ค. ๊ถ์ฅ ๊ฐ์ 15โ35 ๋ฒ์์ด๋ฉฐ, 1080p HD ๋น๋์ค์ ๊ฒฝ์ฐ 31์ด ๊ถ์ฅ๋ฉ๋๋ค.
-c:a libopus WebM์ ๊ธฐ๋ณธ ์ค๋์ค ์ธ์ฝ๋๋ libopus์ด๋ฉฐ, ์ ๋ช
๋ น์ด๋ mp4์ AAC ์ค๋์ค๋ฅผ webm์ opus๋ก ์ฌ์ธ์ฝ๋ฉํฉ๋๋ค.
vp9์ CPU, ์๋ ๋ฐ ๋ฉํฐ์ค๋ ๋ ์ ์ด
VP9, libx264, libx265๋ 1-pass์ 2-pass ์ธ์ฝ๋ฉ์ ์ง์ํฉ๋๋ค (์ด๋ค์ ๊ฐ ์ฐธ์กฐ์์ ์ด์ ๋ํด ์ฝ์ ์ ์์ต๋๋ค). slhck๊ฐ ์ ์์ฝํ์ต๋๋ค::
์์ฝํ์๋ฉด, ์ฌ์ฉ ์ฌ๋ก์ ๋ฐ๋ผ ํด์ผ ํ ์ผ [์ฌ์ฉํ ๋นํธ๋ ์ดํธ ์ธ์ฝ๋ฉ ๊ตฌ์ฑ]์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ์์นด์ด๋น โ ์ํ๋ ํ์ง์ ์ ๊ณตํ๋ CRF
- ์คํธ๋ฆฌ๋ฐ โ VBV ์ ํ ๋นํธ๋ ์ดํธ๋ฅผ ์ฌ์ฉํ 2-pass CRF ๋๋ ABR
- ๋ผ์ด๋ธ ์คํธ๋ฆฌ๋ฐ โ VBV ์ ํ ๋นํธ๋ ์ดํธ๋ฅผ ์ฌ์ฉํ 1-pass CRF ๋๋ ABR, ๋๋ ๋นํธ๋ฅผ ๋ญ๋นํ ์ ์๋ค๋ฉด CBR
- ์ฅ์น์ฉ ์ธ์ฝ๋ฉ โ ์ผ๋ฐ์ ์ผ๋ก 2-pass ABR
slhck๋ ์๋ง๋ ์คํธ๋ฆฌ๋ฐ์ ์ํ VP9์ 2-pass CRF๋ฅผ ์๋ฏธํ์ ๊ฒ์ ๋๋ค - ์ฒซ ๋ฒ์งธ ํจ์ค๋ libvpx-vp9๊ฐ ํ์ง์ ์ ์งํ๋ฉด์ ํ์ผ ํฌ๊ธฐ๋ฅผ ์ค์ด๊ธฐ ์ํด ๋ ๋ฒ์งธ ํจ์ค์์ ๋ ๋์ ์์ถ์ผ๋ก ์ธ์ฝ๋ฉํ๊ธฐ ์ํ ์ํ๋ ์ธก์ ๊ฐ์ ๊ณ์ฐํ๊ฒ ํฉ๋๋ค. ์ด ๋ฐฉ๋ฒ์ ์น ํธ์คํ ๋น๋์ค์ ๋ ์ต์ ํ๋์ด ์์ต๋๋ค.
์ข์ ์ฐธ์กฐ์๋ฃ:
- slhck์ crf์ ๋ํ ๋ ๋ค๋ฅธ ๋งค์ฐ ์ข์ ์ฐธ์กฐ
- FFmpeg์ CRF์ ๋ํ Stackoverflow
- CRF์ ๋ํ Reddit ๋ ผ์
- CRF VS CQP VS CBR ๋ฐ GPU ์ธ์ฝ๋ฉ์ ๋ํ Reddit ๋ ผ์
- CBR๊ณผ CQP์ ๋ํ Reddit ๋ ผ์
- CRF์ 2-pass์ ๋ํ Reddit ๋ ผ์
๐ ๏ธ -c copy
๊ฐ๋ฅํ ๋๋ง๋ค -c copy๋ฅผ ์ฌ์ฉํ์ธ์. ์ด๋ ๊ณ์ฐ ์ง์ฝ์ ์ธ ์ฌ์ธ์ฝ๋ฉ (ํนํ ๋น๋์ค ์ฌ์ธ์ฝ๋ฉ) ๋์ ๋น๋์ค์ ์ค๋์ค๋ฅผ ๋ฆฌ๋จน์คํฉ๋๋ค. -c:v copy๋ ์ฌ์ธ์ฝ๋ฉ ์์ด ๋น๋์ค๋ฅผ ํน๋ณํ ๋ณต์ฌํ๊ณ -c:a copy๋ ์ค๋์ค์ ๋ํด ๋์ผํ ์์
์ ์ํํฉ๋๋ค (-acodec copy์ ๋์ผ).
๋ฆฌ๋จน์ฑ์ ์คํธ๋ฆผ์ ๋ณ๊ฒฝํ์ง ์๊ณ ์ ์ปจํ ์ด๋๋ก ์ฌํฌ์ฅํ๋ ๊ฒ์ผ๋ก, ์์ถ๊ณผ ํ์ง์ ๋ณ๊ฒฝํ๋ ํธ๋์ค์ฝ๋ฉ๊ณผ๋ ๋ค๋ฆ ๋๋ค. ์๋ฅผ ๋ค์ด - MP4๋ ๋ชจ๋ H264 ์ฝ๋ฑ์ ์ปจํ ์ด๋์ด๋ฏ๋ก MKV์ MOV๋ก ๋ฆฌ๋จน์คํ ์ ์์ต๋๋ค.
-c copy๋ฅผ ์ฌ์ฉํ์ง ๋ง์์ผ ํ ๋๋?
- ๋น๋์ค ํํฐ(scale, overlay, subtitles, trim, fade)๋ฅผ ์ ์ฉํ๊ฑฐ๋ ์ค๋์ค๋ฅผ ๋ฏน์ฑํ๊ฑฐ๋ ์์ ํ ๋ (amix, atempo, volume) - ์ด๋ค์ ์ฌ์ธ์ฝ๋ฉ์ด ํ์ํฉ๋๋ค
- ์ ํํ ์๋ฅด๊ธฐ(ํ๋ ์ ์ ํ๋)์ ๊ฒฝ์ฐ - c copy๋ ํคํ๋ ์์์๋ง ์๋ฅผ ์ ์์ด ๊ฑฐ์น ๊ฑฐ๋ ๋ถ์ ํํ ํธ์ง์ผ๋ก ์ด์ด์ง๋๋ค
- ์๋ง์ ๋น๋์ค์ ๊ตฌ์๋ฃ์ผ๋ ค๋ฉด ์ฌ์ธ์ฝ๋ฉ์ด ํ์ํฉ๋๋ค
- ๋ค์ํ ์ฝ๋ฑ ๊ฐ์ ํธ๋์ค์ฝ๋ฉ์๋ ์ฌ์ธ์ฝ๋ฉ์ด ํ์ํฉ๋๋ค
- ๋ฏธ๋์ด๋ฅผ ์์ถํ๊ณ ์ถ์ ๋
๐ ๏ธ ์ ๋ ฅ\์ถ๋ ฅ ํ์
์
๋ ฅ ํ์ (์
๋ ฅ ์ -ss):
ffmpeg -ss 00:00:03 -i "https://storage.rendi.dev/sample/big_buck_bunny_720p_16sec.mp4" -frames:v 1 "input_seeking.jpg"
ํคํ๋ ์์ผ๋ก ๋น๋์ค๋ฅผ ํ์ฑํ์ฌ ๋งค์ฐ ๋น ๋ฅด์ง๋ง ๋ ์ ํํฉ๋๋ค (25fps H264์์ 10์ด๋ง๋ค ํคํ๋ ์์ด ์์).
์ ๋ ฅ ํ์์ผ๋ก ๋น๋์ค๋ฅผ ์๋ฅด๋ฉด ๋น๋์ค์ ํ์์คํฌํ๊ฐ ์๋ฅธ ๋ฒ์ ์ผ๋ก ์ฌ์ค์ ๋๋ฏ๋ก ํํฐ๋ฅผ ์ฌ์ฉํ ๋ ์๋ฅธ ํ ๋น๋์ค ์๊ฐ์ ์ค์ํด์ผ ํฉ๋๋ค.
ffmpeg -i "https://storage.rendi.dev/sample/big_buck_bunny_720p_16sec.mp4" -ss 00:00:03 -frames:v 1 "output_seeking.jpg"
์ถ๋ ฅ ํ์ (์
๋ ฅ ํ -ss) "ํ์์คํฌํ๊ฐ ์์น์ ๋๋ฌํ ๋๊น์ง ์
๋ ฅ์ ๋์ฝ๋ฉํ์ง๋ง ํ๊ธฐํฉ๋๋ค" - ํ๋ ์ ์ ํํ์ง๋ง ๋์ฝ๋ฉํด์ผ ํ๋ฏ๋ก ์ฒ๋ฆฌ ์๊ฐ์ด ๋ ์ค๋ ๊ฑธ๋ฆด ์ ์์ต๋๋ค.
๐ ๏ธ ์๋ฅผ ๋๋ -c:v copy (่ฟฝ่จ) ์์ด (่ฟฝ่จใใใพใง) ์ถ๋ ฅ ํ์์ ์ฌ์ฉํ์ฌ ์ถ๋ ฅ ๋น๋์ค๋ฅผ ์ฌ์ธ์ฝ๋ฉํ๋ ๊ฒ์ด ๊ถ์ฅ๋ฉ๋๋ค.
๊ทธ ์ด์ ๋:
-
์ ๋ ฅ ํ์๊ณผ
-c:v copy๋ก ์๋ฅด๋ ๊ฒ์ ๋ํ ์ด๋ฆฐ ๋ฒ๊ทธ๊ฐ ์์ต๋๋ค Stackoverflow ๋ ผ์ - FFmpeg ์ ์ฅ์ ๋ฒ๊ทธ ๋ฆฌํฌํธ. ๋ฐ๋ผ์ ์ถ๋ ฅ ํ์์ผ๋ก ์๋ฅด๋ ๊ฒ์ด ๊ถ์ฅ๋ฉ๋๋ค (-c:v copy์ฌ์ฉ ์ฌ๋ถ์ ๊ด๊ณ์์ด). -
-c:v copy์ ํจ๊ป ์ถ๋ ฅ ํ์์ผ๋ก ์๋ฅผ ๋ ์ถ๋ ฅ ๋น๋์ค์์ ๊ฒ์ ํ๋ ์์ ๋ณผ ์ ์๋๋ฐ, ์ด๋c:v copy๊ฐ ํคํ๋ ์ ์ดํ์ ์์๋ ํ๋ ์๋ค์ ๋ณต์ฌํ์ง๋ง ํคํ๋ ์ ์์ฒด๋ ๋ณต์ฌํ์ง ์์ ํ๋ ์์ ์ํํ๋ ๋ฐ ํ์ํ ๋ฐ์ดํฐ๊ฐ ๋๋ฝ๋๊ธฐ ๋๋ฌธ์ ๋๋ค. FFmpeg์ trac ๋ฌธ์์์ ์์ธํ ์ฝ์ด๋ณด์ธ์.
FFmpeg ๋ฌธ์์ ์ด ๋ฐ์ท๋ฌธ์ด ๋ชจ๋ ๊ฒ์ ์์ฝํฉ๋๋ค:
์ ๋ ฅ ์ต์ ์ผ๋ก ์ฌ์ฉ๋ ๋, ์ด ์ ๋ ฅ ํ์ผ์์ ์์น๋ก ํ์ํฉ๋๋ค. ๋๋ถ๋ถ์ ํ์์์๋ ์ ํํ ํ์ํ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํ๋ฏ๋ก ffmpeg๋ ์์น ์ด์ ์ ๊ฐ์ฅ ๊ฐ๊น์ด ํ์ ์ง์ ์ผ๋ก ํ์ํฉ๋๋ค. ํธ๋์ค์ฝ๋ฉํ ๋์ -accurate_seek์ด ํ์ฑํ๋์ด ์์ ๋(๊ธฐ๋ณธ๊ฐ), ํ์ ์ง์ ๊ณผ ์์น ์ฌ์ด์ ์ด ์ถ๊ฐ ์ธ๊ทธ๋จผํธ๋ ๋์ฝ๋ฉ๋๊ณ ํ๊ธฐ๋ฉ๋๋ค. ์คํธ๋ฆผ ๋ณต์ฌ๋ฅผ ์ํํ๊ฑฐ๋ -noaccurate_seek์ ์ฌ์ฉํ ๋๋ ๋ณด์กด๋ฉ๋๋ค.
Stackoverflow์์ ์ด ๋ฌธ์ ์ ๋ํ ์ข์ ๋ต๋ณ
์ฌ์ธ์ฝ๋ฉ๋ ์ถ๋ ฅ ๋น๋์ค๋ ๋ค๋ฅธ ๋นํธ๋ ์ดํธ์ผ ์ ์์ผ๋ฏ๋ก ๊ทธ์ ๋ฐ๋ผ ์ถ๋ ฅ ๋นํธ๋ ์ดํธ๋ฅผ ์กฐ์ ํด์ผ ํ ์๋ ์์ต๋๋ค (์๋ ์ฐธ์กฐ).
Nvidia GPU๋ฅผ ์ฌ์ฉํ์ฌ AVI์์ H264 (AVC)๋ก ๋น๋์ค ํธ๋์ค์ฝ๋:
ffmpeg -i https://storage.rendi.dev/sample/big_buck_bunny_720p_stereo.avi -c:v h264_nvenc output_gpu_264.mp4
Nvidia GPU๋ฅผ ์ฌ์ฉํ์ฌ AVI์์ H265 (HEVC)๋ก ๋น๋์ค ํธ๋์ค์ฝ๋:
ffmpeg -i https://storage.rendi.dev/sample/big_buck_bunny_720p_stereo.avi -c:v hevc_nvenc output_gpu_265.mp4
Intel GPU ์ฌ์ฉ ํธ๋์ค์ฝ๋ฉ - Quick Sync Video (QSV) ์ธ์ฝ๋:
ffmpeg -init_hw_device qsv=hw -filter_hw_device hw -i https://storage.rendi.dev/sample/big_buck_bunny_720p_stereo.avi -c:v h264_qsv output_gpu_qsv.mp4
๋ ๋ณต์กํ๊ณ ๋ ์ง์๋๋ Mesa VAAPI ๋๋ผ์ด๋ฒ๋ฅผ ํตํ AMD GPU ์ธ์ฝ๋ฉ
FFmpeg ๋น๋๊ฐ ์ง์ํ๋ ํ์ ๋ชฉ๋ก:
ffmpeg -formats
FFmpeg ๋น๋๊ฐ ์ง์ํ๋ ์ฝ๋ฑ ๋ชฉ๋ก:
ffmpeg -codecs
๋ฏธ๋์ด ํ์ผ์ ๋ํ ๊ตฌ์กฐํ๋ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋น๋์ค ํ์ผ์ ์์ธํ ์คํธ๋ฆผ ์ ๋ณด ํ์:
ffprobe -show_streams -i https://storage.rendi.dev/sample/big_buck_bunny_720p_16sec.mp4
- ๋น๋์ค ๋ฐ ์ด๋ฏธ์ง ํ์ผ์ ์ํ www.bigbuckbunny.org
- https://www.fiftysounds.com/music/neon-lights.mp3 ์ ์์ ํฌ๋ ๋ง
- Popeye๋ฅผ ์ํ ๋ฏธ๊ตญ ๊ตญ๋ฆฝ ๋์๊ด๊ณผ Paramount Pictures https://www.loc.gov/item/2023602008/
- ํ๋ ์ ๋ ์ดํธ ๊ตฌ์ฑ
- ๋น๋์ค ๋นํธ๋ ์ดํธ ์ค์ ์ ๋ํ ์์ธํ ์ค๋ช
- ์ค๋์ค ๋นํธ๋ ์ดํธ ์ค์ ์ ๋ํ ์์ธํ ์ค๋ช
- 1-pass์ 2-pass ์ธ์ฝ๋ฉ์ ๋ํ ์ค๋ช
- tune, presets, profile ์ต์ ๊ฐ์
- ASS ์๋ง ํ์
- ์น ์ต์ ํ ๋ฏธ๋์ด ์์ฑ์ ๋ํ ๋ ๋ง์ ์ค๋ช
- FFmpeg๋ก ์จ๋ผ์ธ ๋น๋์ค ์คํธ๋ฆฌ๋ฐ ๋ ผ์
- FFmpeg๋ก ์นจ๋ฌต ์ ๊ฑฐ
- FFmpeg๋ก ๋ฐฐ์น ์ฒ๋ฆฌ
์ง๋ฌธ, ํผ๋๋ฐฑ ๋๋ ๋ณด๊ณ ์ถ์ ๋ค๋ฅธ ๋ช ๋ น์ด๊ฐ ์์ผ์๋ฉด Issues ์น์ ์ ์์ฑํด ์ฃผ์ธ์.
์ฌ๋ฌ๋ถ์ ํผ๋๋ฐฑ๊ณผ ์์ฒญ์ ๋ฐ๋ผ ์ด ๋ฌธ์๋ฅผ ์ ๋ฐ์ดํธํ ์์ ์ ๋๋ค.