프로덕트

아티클

전체 보기
Preview

Preview

유튜브를 같이 보게 만든 방법 (영상 싱크 삽질기)

"지금, 같이 볼래?"라는 서비스를 만들고 있습니다. 낯선 사람이 유튜브 링크를 띄우면 다른 누군가가 그걸 눌러 1:1로 같이 보는 건데, 만들면서 제일 골치 아팠던 게 "두 사람의 영상을 같은 지점에 맞추는 것" 이었어요. 같은 고민을 하는 분이 있을 것 같아 삽질 과정을 공유합니다.

1. "그냥 currentTime 맞추면 되지 않나?" — 안 됩니다

처음엔 단순하게 생각했어요. 호스트의 재생 위치(currentTime)를 게스트한테 보내서 seekTo 하면 끝 아닌가?

문제는 네트워크 지연입니다. 호스트가 "지금 2분 30초"라고 보내도, 그 메시지가 게스트한테 도착할 땐 이미 2분 30.4초가 지나있어요. 그대로 맞추면 게스트가 항상 살짝 뒤처집니다. 그리고 seekTo를 자꾸 호출하면 영상이 계속 버벅여요(매번 버퍼링).

2. 서버를 '기준 시계'로 삼기

그래서 서버 시간을 기준점으로 잡았습니다. 클라이언트끼리 시간을 맞추려 하지 않고, 둘 다 서버 시간에 맞추는 거죠.

문제는 클라이언트 시계가 제각각이라는 것(누군 30초 빠르고 누군 느리고). 그래서 NTP 비슷하게 RTT(왕복 지연)를 재서 보정했어요:

offset = serverTs - clientTs - rtt/2

여기에 EMA(지수이동평균, alpha 0.3)를 씌워서 한 번 튄 값에 휘둘리지 않게 했습니다. 핑이 갑자기 200ms 튀어도 추정 오프셋이 출렁이지 않아요.

3. 보정은 '3단계'로 — 사용자가 못 느끼게

여기가 핵심인데, drift(예상 위치 - 실제 위치)에 따라 다르게 대응합니다:

  • 0.5초 미만: 그냥 무시. 사람은 0.5초 차이 못 느낍니다. 여기서 seek 걸면 오히려 거슬려요.

  • 0.5초 ~ 2초: seek 대신 재생 속도를 0.95배 또는 1.05배로 슬쩍 조정. 앞서면 느리게, 뒤처지면 빠르게. 몇 초 지나면 자연스럽게 따라잡고, 사용자는 눈치 못 챕니다.

  • 2초 초과: 그제야 seekTo로 강제 점프. (광고 보는 중엔 이 보정 전부 멈춤 — 광고 흐름 깨면 안 되니까)

코드로는 이게 전부예요:

function decideDrift(local, expected) {
  const drift = expected - local;
  const abs = Math.abs(drift);
  if (abs < 0.5) return { kind: 'ignore' };
  if (abs <= 2)  return { kind: 'rate', rate: drift > 0 ? 1.05 : 0.95 };
  return { kind: 'seek', positionSec: expected };
}

"seek로 다 맞추면 되지"가 아니라, 언제 seek를 안 할지가 더 중요했어요.

4. 진짜 지옥은 라이브 스트림이었습니다

VOD는 위 방식으로 잘 됐는데, 유튜브 라이브가 저를 며칠 잡았어요. 커밋 로그가 그대로 증거입니다:

  • stop re-buffering loop on live (loading→play→loading) — 보정하려고 seek를 걸면 다시 로딩, 로딩 끝나면 또 어긋나서 또 seek… 무한 루프

  • break the loading→play→loading echo loop introduced with forceSeek — 위 문제 고치려고 넣은 forceSeek가 또 다른 에코 루프를 만듦

  • translate live-edge intent across viewers' DVR windows — 라이브는 사람마다 DVR 윈도우(되감기 가능 구간)가 달라서, 한쪽의 "라이브 최신 지점"이 다른 쪽엔 존재하지도 않음

결론은 라이브에선 seekTo를 포기했어요. 라이브는 PLAY/PAUSE만 맞추고, 위치 동기화는 안 합니다. 각자의 DVR 윈도우가 다르니 억지로 맞추면 둘 다 깨져요. "완벽한 동기화"를 포기하는 게 정답일 때가 있더라고요.

배운 것

  1. 클라이언트끼리 맞추지 말고 공통 기준(서버)에 맞춰라. 2-body 문제를 1-body로 바꾸는 게 훨씬 쉽습니다.

  2. 보정은 "언제 할지"보다 "언제 안 할지"가 중요하다. 0.5초 무시 / 배속 보정이 seek 남발보다 체감이 훨씬 좋습니다.

  3. 완벽한 동기화에 집착하지 마라. 라이브는 PLAY/PAUSE만 맞추는 게 오히려 사용자 경험이 낫습니다.

혹시 같이보기나 실시간 협업 같은 거 만드시는 분 계시면 도움이 됐으면 합니다. 직접 써보고 싶으시면 → https://momentbrand.site (피드백 환영합니다 🙏)

유튜브 같이보기

알고리즘이 아닌 누군가 보낸 진짜 주파수. 익명 둘이 함께 보는 유튜브 동시 시청.

1
0
Preview

Preview

PreView - 반영구 시술 전 AI로 미리 보여주는 상담 도구 🎯

hub2.png

눈썹·입술 반영구 시술 결과를 AI로 시뮬레이션해

고객에게 미리 보여주는 B2B SaaS 앱

💡 문제 인식

반영구 화장 샵 원장님들의 공통된 고민:

- "연예인처럼 해주세요" → 어떤 연예인요...?

- 말로 설명하면 고객이 기대하는 것과 시술

결과가 다름

- 상담에 30분 쏟고도 "생각해볼게요" 듣고 끝

- 시술 후 "이게 아닌데" 클레임

💡 해결책

PreView는 고객 얼굴 사진에 눈썹/입술 시술

결과를 AI로 합성해 시술 전에 보여주는 앱입니다.

---

⚙️ 핵심 기능

기능: AI 컨실러

설명: 기존 눈썹/잔흔을 자연스럽게 제거 (LaMa Inpainting)

────────────────────────────────────────

기능: 눈썹 시뮬레이션

설명: 30+ 템플릿, 헤어스트록/엠보 질감, 탈각 후 발색 구현

────────────────────────────────────────

기능: 입술 시뮬레이션

설명: 20종 컬러, 그라데이션/풀립 스타일

────────────────────────────────────────

기능: 스마트 룰러

설명: 얼굴 랜드마크 분석 → 황금비율 가이드 자동 생성

────────────────────────────────────────

기능: 케어카드

설명: Before/After 비교 이미지 생성 → 문자/카톡 발송

────────────────────────────────────────

기능: QR 상담 시스템

설명: 고유 URL 발급 → 고객이 사진 업로드 → 리드 자동 수집

🔒 보안 (B2B에서 중요)

- 온디바이스 AI: 고객 사진이 외부 서버로 전송되지 않음

- 24시간 링크 만료: 케어카드 자동 삭제

- 본인 인증: 이름+전화번호 일치해야 열람

📊 비즈니스 임팩트

- 상담 성공률 +40% (시각적 합의 → 결정 빠름)

- 월 1건 추가 시술 = 구독료 회수 (시술 단가 15만원 기준)

---

💰 요금

구분: 무료

가격: 하루 10회 불러오기, 1회 저장

────────────────────────────────────────

구분: Pro (앱)

가격: ₩9,900/월 (무제한)

────────────────────────────────────────

구분: 웹 입점 (B2B)

가격: ₩29,000/월 (Early Bird → Pro 기능 평생)

---

🔗 링크

- 🌐 홈페이지: https://previewapp.co.kr

- 📱 앱스토어:

- 🤖 플레이스토어:

- 🎨 웹 시뮬레이션 체험: https://store.previewapp.co.kr

---

🛠️ 기술 스택

- iOS: Swift/SwiftUI, CoreML, Vision, Metal

- Android: Kotlin, Jetpack Compose, ML Kit ONNX Runtime

- Web: Next.js, Firebase

- AI: LaMa Inpainting (온디바이스)

---

🎯 타겟 사용자

- 반영구 화장 샵 원장님

- 타투이스트

- 뷰티 아카데미 강사

- 눈썹/입술 시술 고민하는 일반인

---

📢 현재 상황

- iOS/Android 앱 출시 완료

- 웹 시뮬레이션 (B2C) 오픈

- 5개국 언어 지원 (한/영/일/중간체/중번체)

- Early Bird 파트너 모집 중

피드백 환영합니다! 🙏

0
1

포스트

전체 보기
Preview

Preview

웹으로만 있던 '같이보기', 드디어 iOS·안드로이드 앱 나왔어요

낯선 사람이랑 유튜브를 1:1로 같이 보는 서비스 "지금, 같이 볼래?"를 만들고 있어요. 그동안 웹만 있었는데, 이번에 iOS·안드로이드 앱을 둘 다 올렸습니다.

iOS: https://apps.apple.com/app/float/id6777661839

Android: https://play.google.com/store/apps/details?id=site.momentbrand.floatapp

웹: https://momentbrand.site

웹이 이미 다 돌아가니까 앱은 껍데기만 씌우면 금방일 줄 알았는데, 전혀 아니었어요. 앱에만 있는 문제가 한 세트 더 오더라고요.

제일 애먹은 건 채팅 입력창이 키보드에 가려지는 문제였어요. iOS랑 안드로이드가 키보드를 다루는 방식이 아예 달라서, 한쪽을 맞추면 다른 쪽이 깨졌습니다. 결국 억지로 위치를 계산하던 걸 다 걷어내고, 잘 되던 화면 레이아웃을 그대로 가져다 쓰는 걸로 정리했어요.

애플 심사도 처음엔 반려당했습니다. "iPad에서 화면이 저절로 스크롤된다"는 지적이었는데, 아무도 안 건드렸는데 화면이 움직이는 거라 한참 헤맸어요. 알고 보니 익명 세션이 갱신될 때 목록이 통째로 새로고침되던 부작용이었습니다. 그거 고쳐서 재제출하니 통과됐고요. (근데 통과했는데도 판매 지역을 안 정해놔서 스토어에 "삭제됨"으로 떠서, 또 거절당한 줄 알고 식겁했네요.)

아직 부족한 게 많지만, '낯선 누군가와 같은 영상을 같은 순간에 본다'는 느낌만큼은 앱에서도 그대로예요. 영상이 끝나면 방이 사라지는 것도 그대로고요. 한번 써보시고 이상한 점 있으면 편하게 알려주세요

유튜브 같이보기

알고리즘이 아닌 누군가 보낸 진짜 주파수. 익명 둘이 함께 보는 유튜브 동시 시청.

1
0