Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

amisuki/ffmpeg-cheatsheet

Folders and files

NameName
Last commit message
Last commit date

Latest commit

History

7 Commits

Repository files navigation

FFmpeg ๋น„๋””์˜ค ์ž๋™ํ™” ์น˜ํŠธ์‹œํŠธ

๋น„๋””์˜ค ์ž๋™ํ™” ํŒŒ์ดํ”„๋ผ์ธ์„ ์œ„ํ•œ ๋ถ„๋ฅ˜๋œ 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๊ณผ FFmpeg์— ๋Œ€ํ•ด

์ด ํŒŒ์ผ ์ž‘์—…์„ ์ตœ๋Œ€ํ•œ ์‰ฝ๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด 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.mp4
Scale ์„ธ๋ถ€์‚ฌํ•ญ

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์ธ ์ถœ๋ ฅ ๋„ˆ๋น„์™€ ์ถฉ๋Œํ•˜์—ฌ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

force_original_aspect_ratio:

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

FFmpeg ์˜ค๋””์˜ค ์˜ต์…˜

  • -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

๋น„๋””์˜ค์˜ ์˜ค๋””์˜ค๋ฅผ ์ƒˆ ์˜ค๋””์˜ค ํŒŒ์ผ๊ณผ ๋ฏน์Šคํ•˜๊ณ  ๋ณผ๋ฅจ์„ ๋‚ฎ์ถฅ๋‹ˆ๋‹ค:

AAC ์ฐธ์กฐ

[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 ์‚ฌ์šฉ์€ ๋ฒ„๊ทธ์˜ ์˜ํ–ฅ์„ ํ”ผํ•ฉ๋‹ˆ๋‹ค.

๋‘ mp3 ํŠธ๋ž™ ๊ฒฐํ•ฉ

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=out 2์ดˆ๋ถ€ํ„ฐ ์‹œ์ž‘ 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.mp3

acrossfade=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.mp3

pan=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

Stackoverflow ์ฐธ์กฐ

์ ํ”„ ์ปท

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 ์ž…๋ ฅ ํƒ€์ž„์Šคํƒฌํ”„์˜ ํƒ€์ž„๋ฒ ์ด์Šค

Stackoverflow ์ฐธ์กฐ

๐Ÿ› ๏ธ ์†Œ์…œ ๋ฏธ๋””์–ด๋ฅผ ์œ„ํ•œ ๋น„๋””์˜ค ํฌ๋กญ

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.mp4
Details

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 ์„ธ๋ถ€์‚ฌํ•ญ

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.mp4

FFmpeg๋Š” 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์„ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

Ken Burns ํšจ๊ณผ

ken burns์™€ FFmpeg์— ๋Œ€ํ•œ ๋ธ”๋กœ๊ทธ ํฌ์ŠคํŠธ:

GIF ์ƒ์„ฑ

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.jpg

gt(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 ๋ช…๋ น์–ด

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 -codec.

-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๊ฐ€ ํ’ˆ์งˆ์„ ์œ ์ง€ํ•˜๋ฉด์„œ ํŒŒ์ผ ํฌ๊ธฐ๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด ๋‘ ๋ฒˆ์งธ ํŒจ์Šค์—์„œ ๋” ๋†’์€ ์••์ถ•์œผ๋กœ ์ธ์ฝ”๋”ฉํ•˜๊ธฐ ์œ„ํ•œ ์›ํ•˜๋Š” ์ธก์ •๊ฐ’์„ ๊ณ„์‚ฐํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์€ ์›น ํ˜ธ์ŠคํŒ… ๋น„๋””์˜ค์— ๋” ์ตœ์ ํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ข‹์€ ์ฐธ์กฐ์ž๋ฃŒ:

๐Ÿ› ๏ธ -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์—์„œ ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ข‹์€ ๋‹ต๋ณ€

์žฌ์ธ์ฝ”๋”ฉ๋œ ์ถœ๋ ฅ ๋น„๋””์˜ค๋Š” ๋‹ค๋ฅธ ๋น„ํŠธ๋ ˆ์ดํŠธ์ผ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๊ทธ์— ๋”ฐ๋ผ ์ถœ๋ ฅ ๋น„ํŠธ๋ ˆ์ดํŠธ๋ฅผ ์กฐ์ •ํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค (์•„๋ž˜ ์ฐธ์กฐ).

๐Ÿ› ๏ธ ๊ฐ€์†์„ ์œ„ํ•œ GPU ์‚ฌ์šฉ

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 ๋นŒ๋“œ๊ฐ€ ์ง€์›ํ•˜๋Š” ํ˜•์‹ ๋ชฉ๋ก:

ffmpeg -formats

FFmpeg ๋นŒ๋“œ๊ฐ€ ์ง€์›ํ•˜๋Š” ์ฝ”๋ฑ ๋ชฉ๋ก:

ffmpeg -codecs

๋ฏธ๋””์–ด ํŒŒ์ผ์— ๋Œ€ํ•œ ๊ตฌ์กฐํ™”๋œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋น„๋””์˜ค ํŒŒ์ผ์˜ ์ž์„ธํ•œ ์ŠคํŠธ๋ฆผ ์ •๋ณด ํ‘œ์‹œ:

ffprobe -show_streams -i https://storage.rendi.dev/sample/big_buck_bunny_720p_16sec.mp4

ํฌ๋ ˆ๋”ง

์น˜ํŠธ์‹œํŠธ์— ์ถ”๊ฐ€ํ•  ๊ฐ€๋Šฅํ•œ ํ–ฅํ›„ ์ฃผ์ œ๋“ค

  • ํ”„๋ ˆ์ž„ ๋ ˆ์ดํŠธ ๊ตฌ์„ฑ
  • ๋น„๋””์˜ค ๋น„ํŠธ๋ ˆ์ดํŠธ ์„ค์ •์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์„ค๋ช…
  • ์˜ค๋””์˜ค ๋น„ํŠธ๋ ˆ์ดํŠธ ์„ค์ •์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์„ค๋ช…
  • 1-pass์™€ 2-pass ์ธ์ฝ”๋”ฉ์— ๋Œ€ํ•œ ์„ค๋ช…
  • tune, presets, profile ์˜ต์…˜ ๊ฐœ์š”
  • ASS ์ž๋ง‰ ํ˜•์‹
  • ์›น ์ตœ์ ํ™” ๋ฏธ๋””์–ด ์ƒ์„ฑ์— ๋Œ€ํ•œ ๋” ๋งŽ์€ ์„ค๋ช…
  • FFmpeg๋กœ ์˜จ๋ผ์ธ ๋น„๋””์˜ค ์ŠคํŠธ๋ฆฌ๋ฐ ๋…ผ์˜
  • FFmpeg๋กœ ์นจ๋ฌต ์ œ๊ฑฐ
  • FFmpeg๋กœ ๋ฐฐ์น˜ ์ฒ˜๋ฆฌ

๋งˆ๋ฌด๋ฆฌ ๋ง์”€

์งˆ๋ฌธ, ํ”ผ๋“œ๋ฐฑ ๋˜๋Š” ๋ณด๊ณ  ์‹ถ์€ ๋‹ค๋ฅธ ๋ช…๋ น์–ด๊ฐ€ ์žˆ์œผ์‹œ๋ฉด Issues ์„น์…˜์— ์ž‘์„ฑํ•ด ์ฃผ์„ธ์š”.

์—ฌ๋Ÿฌ๋ถ„์˜ ํ”ผ๋“œ๋ฐฑ๊ณผ ์š”์ฒญ์— ๋”ฐ๋ผ ์ด ๋ฌธ์„œ๋ฅผ ์—…๋ฐ์ดํŠธํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

About

A categorized collection of FFmpeg commands for video automation pipelines.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

Contributors

AltStyle ใซใ‚ˆใฃใฆๅค‰ๆ›ใ•ใ‚ŒใŸใƒšใƒผใ‚ธ (->ใ‚ชใƒชใ‚ธใƒŠใƒซ) /