ffmpeg-video-modules

FF๐š–๐š™๐šŽ๐š V๐š’๐š๐šŽ๐š˜ M๐š˜๐š๐šž๐š•๐šŽ๐šœ ๐ŸŽž

MIT License

Stars
0
Committers
2

ffmpeg-video-modules

ํ•ต์‹ฌ ๋ฌธ์ œ ํ•ด๊ฒฐ ์ „๋žต ๋ฐ ๋ถ„์„ ๐Ÿง

FFmpeg ๋ฐ FFprobe ์„ค์น˜ ๊ฐ€์ด๋“œ (Windows 10)

# ๐Ÿ“Œ FFmpeg ๋ฐ FFprobe ์„ค์น˜
  - [FFmpeg ๋‹ค์šด๋กœ๋“œ ํŽ˜์ด์ง€](https://ffmpeg.org/download.html)๋กœ ์ด๋™
  - Windows ๋นŒ๋“œ ์„ ํƒ (๊ถŒ์žฅ: [gyan.dev](https://www.gyan.dev/ffmpeg/builds/))
  - "Release builds"์—์„œ `ffmpeg-release-essentials.zip` ๋‹ค์šด๋กœ๋“œ
  - ZIP ํŒŒ์ผ์„ `C:\ffmpeg`์— ์••์ถ• ํ•ด์ œ


# ๐Ÿ“Œ PATH ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์ถ”๊ฐ€
  - `C:\ffmpeg\bin` ๊ฒฝ๋กœ ๋ณต์‚ฌ
  - ๋‚ด PC โ†’ ์†์„ฑ โ†’ ๊ณ ๊ธ‰ ์‹œ์Šคํ…œ ์„ค์ • โ†’ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ํด๋ฆญ
  - ์‹œ์Šคํ…œ ๋ณ€์ˆ˜์—์„œ `Path` ํŽธ์ง‘ โ†’ ์ƒˆ ๊ฒฝ๋กœ์— `C:\ffmpeg\bin` ์ถ”๊ฐ€
  - ๋ชจ๋“  ์ฐฝ ๋‹ซ๊ธฐ


# ๐Ÿ“Œ ์„ค์น˜ ํ™•์ธ
  - Win + R โ†’ "cmd" ์ž…๋ ฅ ํ›„ ์‹คํ–‰
  - `ffmpeg -version` ๋ฐ `ffprobe -version` ์ž…๋ ฅํ•ด ์„ค์น˜ ํ™•์ธ
  • ์œ„ ๊ณผ์ •์„ ์ง„ํ–‰ํ•ด์•ผ Local ํ™˜๊ฒฝ์—์„œ ffmpeg ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

MariaDB ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰ (Windows Powershell)

docker network create --driver bridge mynetwork

docker network ls

docker run -d --name mariadb -p 3310:3306 -v mysql_db:/var/lib/mysql --network mynetwork -e MYSQL_DATABASE=ffmpeg-video-database -e MYSQL_ROOT_PASSWORD=password mariadb:latest

์‹คํ–‰

# ๐Ÿ“Œ GoLand IDE์—์„œ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์‹œ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•

- Program arguments: Go ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•  ๋•Œ ์ „๋‹ฌํ•  ๋ช…๋ น์ค„ ์ธ์ˆ˜. 
- ์—ฌ๊ธฐ์„œ๋Š” `-c deploy/dev/config.toml`์„ ์ „๋‹ฌํ•˜์—ฌ `config.toml` ํŒŒ์ผ์„ ์„ค์ • ํŒŒ์ผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

- ์„ค์ • ๋ฐฉ๋ฒ•
  1. GoLand์—์„œ Run/Debug Configurations๋ฅผ ์—ฝ๋‹ˆ๋‹ค.
  2. Program arguments ํ•„๋“œ์— `-c deploy/dev/config.toml`์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.
  3. ์ด ์„ค์ •์€ ํ”„๋กœ๊ทธ๋žจ์ด `config.toml` ํŒŒ์ผ์„ ์ฝ์–ด๋“ค์ด๋„๋ก ํ•˜์—ฌ, ์ง€์ •๋œ ํ™˜๊ฒฝ ์„ค์ •์„ ๋กœ๋“œํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
  4. ์„ค์ •์„ ์ €์žฅํ•˜๊ณ , Run ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜์—ฌ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์‹คํ–‰ ์‹œํ‚ค๊ธฐ (Git Bash)

# ๐Ÿ“Œ ๋ชจ๋“  ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์‹คํ–‰
go test ./internal/...


# ๐Ÿ“Œ ์ปค๋ฒ„๋ฆฌ์ง€ ํ”„๋กœํŒŒ์ผ ์ƒ์„ฑ ํ›„, HTML ๋ณด๊ณ ์„œ ์ƒ์„ฑ
go test -v -coverprofile=coverage.out ./internal/...
go tool cover -html=coverage.out

ํ—ฌ์Šค ์ฒดํฌ API ํ…Œ์ŠคํŠธ (Git Bash)

$ curl --http1.1 http://localhost:3031/api/health

ํ…Œ์ŠคํŠธ ๋น„๋””์˜ค ์ƒ์„ฑ ffmpeg ๋ช…๋ น์–ด (Windows Powershell)

ffmpeg -f lavfi -i color=c=blue:s=320x240:d=5 -vf "drawtext=fontfile='C\\Windows\\Fonts\\arial.ttf': text='Test Video 1': fontcolor=white: fontsize=24: x=(w-text_w)/2: y=(h-text_h)/2" -c:v libx264 -t 5 -pix_fmt yuv420p "C:\test_video_1.mp4"

ffmpeg -f lavfi -i color=c=red:s=320x240:d=6 -vf "drawtext=fontfile='C\\Windows\\Fonts\\arial.ttf': text='Test Video 2': fontcolor=white: fontsize=24: x=(w-text_w)/2: y=(h-text_h)/2" -c:v libx264 -t 6 -pix_fmt yuv420p "C:\test_video_2.mp4"

ffmpeg -f lavfi -i color=c=green:s=320x240:d=7 -vf "drawtext=fontfile='C\\Windows\\Fonts\\arial.ttf': text='Test Video 3': fontcolor=white: fontsize=24: x=(w-text_w)/2: y=(h-text_h)/2" -c:v libx264 -t 7 -pix_fmt yuv420p "C:\test_video_3.mp4"

ffmpeg -f lavfi -i color=c=yellow:s=320x240:d=5 -vf "drawtext=fontfile='C\\Windows\\Fonts\\arial.ttf': text='Test Video 4': fontcolor=black: fontsize=24: x=(w-text_w)/2: y=(h-text_h)/2" -c:v libx264 -t 5 -pix_fmt yuv420p "C:\test_video_4.mp4"

ffmpeg -f lavfi -i color=c=purple:s=320x240:d=6 -vf "drawtext=fontfile='C\\Windows\\Fonts\\arial.ttf': text='Test Video 5': fontcolor=white: fontsize=24: x=(w-text_w)/2: y=(h-text_h)/2" -c:v libx264 -t 6 -pix_fmt yuv420p "C:\test_video_5.mp4"
  • ์œ„ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด, ํ…Œ์ŠคํŠธ ๋น„๋””์˜ค ํŒŒ์ผ๋“ค์€ C ๋“œ๋ผ์ด๋ธŒ์˜ ๋ฃจํŠธ์— ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

Swagger ํ…Œ์ŠคํŠธ (Windows)

cd internal
swag init

ffmpeg-video-modules API Server ์‹คํ–‰ ํ›„, `http://localhost:3031/docs/index.html` ์ ‘๊ทผ

Swagger ํ…Œ์ŠคํŠธ ์ˆœ์„œ (๐Ÿ“Œ ๊ถŒ์žฅ)

  • [GET] /health -> [POST] /videos -> [POST] /videos/{id}/trim -> [POST] /videos/concat -> [POST] /jobs/execute -> [GET] /Videos -> [GET] /videos/{fid}/download

ํ—ฌ์Šค ์ฒดํฌ API

์‹คํ–‰ ์ „ UI ์‹คํ–‰ ํ›„ UI

๋™์˜์ƒ ์—…๋กœ๋“œ API

์‹คํ–‰ ์ „ UI ์‹คํ–‰ ํ›„ UI
  • Swagger UI์—์„œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํŒŒ์ผ์„ ํ•œ ๋ฒˆ์— ์—…๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ง์ ‘ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  • ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํŒŒ์ผ์„ ํ•œ ๋ฒˆ์— ์—…๋กœ๋“œํ•˜๋Š” ๊ธฐ๋Šฅ์€ ์•„๋ž˜์˜ ์ด๋ฏธ์ง€๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ Postman์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๋™์˜์ƒ ์ปท ํŽธ์ง‘ (Trim) API

์‹คํ–‰ ์ „ UI ์‹คํ–‰ ํ›„ UI
  • ๐Ÿ“Œ ์–ธ๊ธ‰๋œ ์š”๊ตฌ์‚ฌํ•ญ์€ ์‚ฌ์šฉ์ž๊ฐ€ ์ด์ „์— ์š”์ฒญํ•œ ๋ชจ๋“  ํŠธ๋ฆผ ๋ฐ ์ด์–ด๋ถ™์ด๊ธฐ ์ž‘์—…์„ ํ•œ ๋ฒˆ์— ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

  • ๐Ÿ“Œ ์ œ๊ณต๋œ ์š”๊ตฌ์‚ฌํ•ญ ๋ฒ”์œ„ ๋‚ด์—์„œ๋Š” ํŠธ๋ฆผ๊ณผ ์ด์–ด ๋ถ™์ด๊ธฐ ์ž‘์—…์ด ์ˆœ์ฐจ์ ์œผ๋กœ(ํ•œ ๋ฒˆ์—) ์ฒ˜๋ฆฌ๋˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•˜๋ฉด ์ถฉ๋ถ„ํ•  ๊ฒƒ์œผ๋กœ ํŒ๋‹จ.

๋™์˜์ƒ ์ด์–ด ๋ถ™์ด๊ธฐ (Concat) API

์‹คํ–‰ ์ „ UI ์‹คํ–‰ ํ›„ UI
  • ๐Ÿ“Œ ์–ธ๊ธ‰๋œ ์š”๊ตฌ์‚ฌํ•ญ์€ ์‚ฌ์šฉ์ž๊ฐ€ ์ด์ „์— ์š”์ฒญํ•œ ๋ชจ๋“  ํŠธ๋ฆผ ๋ฐ ์ด์–ด๋ถ™์ด๊ธฐ ์ž‘์—…์„ ํ•œ ๋ฒˆ์— ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

  • ๐Ÿ“Œ ์ œ๊ณต๋œ ์š”๊ตฌ์‚ฌํ•ญ ๋ฒ”์œ„ ๋‚ด์—์„œ๋Š” ํŠธ๋ฆผ๊ณผ ์ด์–ด ๋ถ™์ด๊ธฐ ์ž‘์—…์ด ์ˆœ์ฐจ์ ์œผ๋กœ(ํ•œ ๋ฒˆ์—) ์ฒ˜๋ฆฌ๋˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•˜๋ฉด ์ถฉ๋ถ„ํ•  ๊ฒƒ์œผ๋กœ ํŒ๋‹จ.

์ž‘์—… ์ˆ˜ํ–‰ API

์‹คํ–‰ ์ „ UI ์‹คํ–‰ ํ›„ UI

์ตœ์ข… ๋™์˜์ƒ ๋‹ค์šด๋กœ๋“œ API

์‹คํ–‰ ์ „ UI ์‹คํ–‰ ํ›„ UI

Application Server Architecture

๐Ÿ“Œ ์ฐธ๊ณ  Link

Go Clean Architecture ๊ธฐ๋ฐ˜ ํด๋” ๊ตฌ์กฐ

ERD(Entity Relationship Diagram)

API Endpoint

HTTP Method URI Description
POST /api/videos ๋™์˜์ƒ ์—…๋กœ๋“œ
POST /api/videos/{id}/trim ๋ช…๋ น ๋™์˜์ƒ ์ปท ํŽธ์ง‘ (Trim)
POST /api/videos/concat ๋ช…๋ น ๋™์˜์ƒ ์ด์–ด ๋ถ™์ด๊ธฐ (Concat)
POST /api/jobs/execute ๋ช…๋ น ์ž‘์—… ์ˆ˜ํ–‰
GET /api/videos/{id}/download ์ตœ์ข… ๋™์˜์ƒ ๋‹ค์šด๋กœ๋“œ
GET /api/videos ๋™์˜์ƒ ๋ฐ ์ž‘์—… ์กฐํšŒ

Git ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ๊ทœ์น™

Tag Description
feat ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•œ ๊ฒฝ์šฐ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
fix ๋ฒ„๊ทธ๋ฅผ ์ˆ˜์ •ํ•œ ๊ฒฝ์šฐ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
refactor ์ฝ”๋“œ ๋ฆฌํŒฉํ† ๋งํ•œ ๊ฒฝ์šฐ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
style ์ฝ”๋“œ ํ˜•์‹, ์ •๋ ฌ, ์ฃผ์„ ๋“ฑ์˜ ๋ณ€๊ฒฝ(๋™์ž‘์— ์˜ํ–ฅ์„ ์ฃผ๋Š” ์ฝ”๋“œ ๋ณ€๊ฒฝ ์—†์Œ)ํ•œ ๊ฒฝ์šฐ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
test ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€, ํ…Œ์ŠคํŠธ ๋ฆฌํŒฉํ† ๋ง(์ œํ’ˆ ์ฝ”๋“œ ์ˆ˜์ • ์—†์Œ, ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์— ๊ด€๋ จ๋œ ๋ชจ๋“  ๋ณ€๊ฒฝ์— ํ•ด๋‹น)ํ•œ ๊ฒฝ์šฐ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
docs ๋ฌธ์„œ๋ฅผ ์ˆ˜์ •(์ œํ’ˆ ์ฝ”๋“œ ์ˆ˜์ • ์—†์Œ)ํ•œ ๊ฒฝ์šฐ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
chore ๋นŒ๋“œ ์—…๋ฌด ์ˆ˜์ •, ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ € ์„ค์ • ๋“ฑ ์œ„์— ํ•ด๋‹น๋˜์ง€ ์•Š๋Š” ๋ชจ๋“  ๋ณ€๊ฒฝ(์ œํ’ˆ ์ฝ”๋“œ ์ˆ˜์ • ์—†์Œ)์ผ ๊ฒฝ์šฐ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
Package Rankings
Top 6.35% on Proxy.golang.org
Related Projects