-
Notifications
You must be signed in to change notification settings - Fork 2
방송 송출 및 시청 구현
- Worker: 미디어 처리의 기본 단위입니다. CPU 코어당 하나의 워커를 생성하여 효율적인 미디어 처리를 담당합니다.
- Router: 가상의 컨퍼런스 룸과 같은 개념으로, 하나의 독립된 공간에서 참가자들의 미디어를 관리합니다.
미디어 데이터의 전송을 담당하는 채널입니다. 각 클라이언트는 두 종류의 transport가 필요합니다:
- Producer Transport: 미디어를 서버로 보내는 전송 채널
- Consumer Transport: 서버에서 미디어를 받는 전송 채널
- Producer: 미디어를 생성하는 엔드포인트로, 실제 방송을 송출하는 지점입니다.
- Consumer: 미디어를 소비하는 엔드포인트로, 방송을 시청하는 지점입니다.
- DTLS: UDP 통신에서 보안을 제공하는 프로토콜로, WebRTC에서 안전한 미디어 스트림 전송을 위해 사용됩니다.
- WebRTCTransport: WebRTC 표준을 따르는 전송 방식으로, 일반적인 클라이언트 연결에 사용됩니다.
- PlainTransport: 미디어 서버 간 통신이나 레코딩 등 특수 목적으로 사용되는 단순화된 전송 방식입니다.
- rtpCapabilities: 지원하는 코덱과 미디어 기능을 정의하는 객체입니다.
- Device: 클라이언트의 미디어 기능을 캡슐화한 객체입니다.
방송 송출 프로토타입 Client-Server code
각자의 탐구해온 내용을 바탕으로 우리 팀만의 방송 송출 및 시청 흐름도를 구현해보았습니다.
가설이 맞는지 확인하기 위해 코드 구현을 진행하였습니다. 흐름도를 3부분으로 나눠서 각자 섹션을 구현해오고, 이를 합치는 과정에서
페어 프로그래밍
을 하며 병합하였습니다.
가설에 맞게 구현하는 과정에서 2가지의 문제점을 발견했습니다.
-
RTP Capabilities의 종속성 문제
- 발견된 문제
- RTP Capabilities가 Room(Router)에 종속되어야 함을 발견
- 해결
- Router 생성 시점에 RTP Capabilities를 설정하도록 수정
- 발견된 문제
-
Transport 구조의 이해 오류
- 초기 가정
- Transport connect 후 Producer 생성이 순차적으로 일어날 것으로 예상
- 실제 동작
- 클라이언트 Transport에 connect 이벤트와 produce 이벤트를 먼저 등록
- produce() 메서드 호출 시점에 등록된 이벤트들이 콜백으로 실행
- 핵심 깨달음
- 클라이언트와 서버의 Transport가 독립적으로 동작해야 함
- 초기 가정
문제점 발견 후 개선하기 위한 새로운 가설을 작성해보았습니다.
새롭게 정의 된 가설을 바탕으로 기능 구현을 진행했습니다.
모든 기능이 정상 작동하는 것을 확인한 후, 다음과 같은 리팩토링을 진행했습니다
- 계층 구조 명확화
- DTO 설계 및 적용
- 퍼사드 패턴 도입으로 인터페이스 단순화
- 코드 모듈화 및 재사용성 개선
https://github.com/boostcampwm-2024/web20-camon/pull/115
https://github.com/boostcampwm-2024/web20-camon/pull/123
https://github.com/boostcampwm-2024/web20-camon/pull/124
https://github.com/boostcampwm-2024/web20-camon/pull/125
https://github.com/boostcampwm-2024/web20-camon/pull/128
https://github.com/boostcampwm-2024/web20-camon/pull/153
https://github.com/boostcampwm-2024/web20-camon/pull/154
- Mediasoup 포트 매핑 문제
- swagger 같은 응답 코드에 다양한 응답 보여주기
- Sudo가 계속 비밀번호를 요청함
- Docker 이미지가 너무 크다
- Git action에서 도커 이미지 빌드 시간을 단축시켜보자
- Docker compose를 이용해서 메모리 사용률을 줄여보자
- 방송 녹화 시 CPU 과부하 문제를 해결해보자
- Release 브랜치? 너 필요해?
- 로딩이 너무 짧아…!
- NestJS ORM으로 무엇을 사용해야 할까?
- WebRTC를 이용한 1:N 스트리밍 서비스에서 시그널링 서버가 필요할까?
- 실시간 채팅 구현: 인메모리 방식을 선택한 이유
- MySQL 아키텍처 개선: DB 의존성 분리와 서버 역할 명확화
- 브라우저 창이 최소화되면 비디오 송출이 안된다…!
- Mediasoup 기본 개념
- DLTS와 Signaling
- Tell, Don't Ask (TDA) 원칙이란
- VPC(Virtual Private Cloud) 학습 정리
- 순환참조: A 서비스 ‐ B 서비스 vs. A 서비스 ‐ B 레포지토리
- Dto 메서드 전략
- WebRTC란?
- 자바스크립트 패키지 매니저(npm, yarn, pnpm)
- shadcn/ui을 이용해 UI 개발 생산성 높이기
- React 이벤트 핸들러 네이밍(on vs handle)
- React-router-dom의 createBrowserRouter을 사용해보기
- fetch vs axios