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 λΉŒλ“œ 업무 μˆ˜μ •, νŒ¨ν‚€μ§€ λ§€λ‹ˆμ € μ„€μ • λ“± μœ„μ— ν•΄λ‹Ήλ˜μ§€ μ•ŠλŠ” λͺ¨λ“  λ³€κ²½(μ œν’ˆ μ½”λ“œ μˆ˜μ • μ—†μŒ)일 경우 μ‚¬μš©ν•©λ‹ˆλ‹€.