본문 바로가기
C.W.K.
Stream
Lesson 01 of 05 · published

재생이 제품이야 (그러니 새로 짜지 마)

~13 min · embed-engine, reuse, libmpv, ffmpeg

Level 0릴 입문자
0 XP0/39 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"코덱이랑 렌더러 깊이는 libmpv 랑 FFmpeg 를 재사용해. 미디어 엔진 다시 짜는 데 CWK 시간 쓰지 말고."

미디어에서 제일 유혹적인 토끼굴

디코더 짜는 건 진짜 매혹적이야. 비트스트림 파싱, 모션 벡터, 색 공간, 하드웨어 가속. 파도 파도 끝없는 아름다운 우물이지. 근데 bounded 플레이어한텐 바닥 없는 함정이기도 해. FFmpeg 는 수백 명이 30년 쌓은 거야. 주말 며칠로는 못 따라잡아. 거기 쓰는 시간은 전부, 네 플레이어를 '네 것' 으로 만들 그 한 가지에 안 쓴 시간이고.

그래서 Ashen Reel 은 안 짜. 깔끔한 embedding API 를 가진 FFmpeg 기반 엔진 libmpv 를 embed 해서, 코덱이랑 렌더러 깊이를 통째로 공짜로 물려받아. 디코딩은 엔진이 하고, 결정은 Ashen Reel 이 하고.

연결은 소유하고, 깊이는 빌려

뭘 만들고 뭘 빌릴지, 재사용 결정이 깔끔한 지도를 그려줘.

제일 깊은 commodity 는 재사용하고, 아무도 못 하는 연결만 직접 만들어. 코덱은 commodity 야. libmpv 가 갖고 있고. Recall 의 기억된 1초를 여는 플레이어는 commodity 가 아냐. 그건 아무도 없거든. 네 귀한 시간은 거기 써.

이게 코딩 4대 기둥의 첫 번째야. Extend 하기 전에 Reuse, Scale 하기 전에 Extend. 그걸 앱 최상위에 적용한 거지. 성숙한 라이브러리가 이미 잘하는 걸 다시 짜려는 자신을 붙잡는 순간, 멈추고 물어봐. 이거 재구현하는 게 내 제품이야, 내 미루기야? 미디어 엔진에선 거의 항상 실험복 입은 미루기더라.

재사용은 공짜가 아냐, 거래야

엔진 빌리는 게 공짜는 아냐. 그냥 다른 비용이야. pin 하고, 라이선스 붙이고, 번들하고, 서명해야 하는 의존성을 떠안지(Track 6 통째가 그 얘기). 엔진이 세상을 보는 방식을 받아들이고 네 걸로 옮겨줘야 하고. 근데 그 비용은 딱 정해져 있고 한 번이면 끝나. 디코더를 다시 짓는 건 끝이 없고 영원한 반면에. 그러니 거의 항상 남는 장사야. 빌린 엔진을 경계 저편에 두는 한. 그게 딱 다음 레슨이 만드는 거고.

'이거 재사용할까?' 판단법. 네가 만들 게 차별점이야, commodity 야? 성숙하고 관리되는 라이브러리가 하는 거고 그게 네 제품의 존재 이유가 아니면, 재사용하고 존재 이유인 부분에 네 이름을 붙여.
초반에 AVFoundation 만 쓰는 작은 플레이어를 그려봤는데 진짜 깔끔했어. 전부 Apple, C 없고, 번들링 골치도 없고. 그러다 아빠 진짜 아카이브를 통과시켜 봤어. 2011년 코덱에 ASS 자막 붙은 낡은 MKV 앞에서 걔가 어깨 으쓱하고 마는 걸 봤지. 그 순간 재사용이 취향에서 계획으로 바뀌었어. 깔끔한 버전은 진짜 미디어를 안 만나봐서 깔끔해 보였던 것뿐이더라.

Code

Ashen Reel 이 만드는 것 vs 빌리는 것·text
  OWN     AshenReelApp    window, menus, shortcuts, Recall client, composition
  OWN     AshenReelCore   handoff parsing, seek rules, state -- pure, testable
  SEAM    CLibMPV         narrow C module: Swift <-> libmpv, no product logic
  BORROW  libmpv          decode, render, seek, tracks, subtitles
  BORROW  FFmpeg          decades of codec work, reached through libmpv

// The value you add lives in the OWN rows.
// The depth you'd never finish lives in the BORROW rows.
// The SEAM is the only new code the reuse decision forces on you.

External links

Exercise

네가 밑바닥부터 만들려는 걸 봐. 두 목록으로 쪼개. 하나는 commodity, 성숙한 라이브러리가 이미 잘하는 것들. 다른 하나는 진짜 네 차별점, 네 그 정확한 연결은 아무도 없는 것들. 네 설렘이 commodity 목록을 얼마나 겨누고 있는지 정직하게 봐. commodity 부분은 다 재사용하고 힘을 전부 차별점에 쏟으면 뭐가 달라질까?
Hint
commodity 목록은 재사용이 갈 자리, 차별점 목록은 네 시간이 갈 자리야. 만들고 싶어 설레는 게 거의 다 commodity 쪽이면, 그건 토끼굴이 부르는 소리야. 흥미로운 엔지니어링이랑 값진 엔지니어링은 다를 때가 많거든.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인 — 댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.