-
Notifications
You must be signed in to change notification settings - Fork 2
방송 송출 창을 새로운 창으로 띄우기
우리 서비스는 체크인을 누르는 동시에 방송 송출이 시작되고 출석이 기록된다. 따라서 체크인 버튼을 누르면 방송 송출 페이지로 이동하며 방송이 시작하게 할 계획이었다.
이 기능을 구현하기 위해서는 방송 송출 창을 어떻게 띄울지 정해야 했다. 왜냐하면 방송 송출은 계속 연결된 채로 미디어 스트림을 보내야 방송이 지속되는데 이는 페이지를 나가면 연결이 끊어지게 된다. 그렇기에 체크인 후 방송 송출은 켜놓은채로 다른 캠퍼들의 방송에 가는 등 창을 이동하려면 어떻게 구현해야할까 고민하게 되었다.
위와 같은 고민에 대해 생각해낸 방법은 2가지였다.
- 기존 페이지에서 방송 송출 페이지로 이동하고, 연결을 유지할 방법을 찾아보기
- 방송 송출 창을 PIP 모드로 화면 한 쪽에 띄우기
이 2가지 방법을 두고 팀원들끼리 논의해보았다. 논의하며 WebRTC를 사용하는 기존 서비스들은 어떻게 되어 있을까 살펴봤다. 하나씩 직접 실행해보며 확인하니 구글 미트, 줌 등도 웹에서 실행해서 화상 회의에 참여했다가 뒤로 가면 화상 통화가 끊어지는 것을 확인할 수 있었다.
따라서 우리가 생각했던 1번 방식은 구현이 어려울 것이라고 생각하여 2번 방식인 PIP 모드로 구현을 선택하게 되었다.
이걸 시작하자마자 적는 이유는 개발하기 위해 어떻게 PIP 모드를 구현할 지 찾아보니 우리가 생각한 방법이 틀렸다는 것을 알았기 때문이다.
기존의 계획은 방송 송출창을 PIP 모드로 띄우고 여기에 송출을 제어하기 위한 버튼(ex. 카메라 on/off, 마이크 on/off) 등을 추가할 예정이었는데, 찾아보니 PIP는 Picture in Picture의 약자로, 비디오만을 다른 화면 위에 띄울 수 있는 기술이었다. 그렇기에 우리가 생각한대로 비디오와 기타 송출 제어 버튼을 함께 띄울 수 없었다.
그래서 결국 PIP가 아닌 새로운 윈도우로 여는 방식으로 구현하기로 했다.
const newTapFeature = [
`width=580`,
`height=1024`,
`bottom=0`,
`right=0`,
`resizable=yes`,
`scrollbars=no`,
'status=no',
'location=no',
'toolbar=no',
'menubar=no',
].join(',');
const broadcastUrl = `${window.location.origin}/broadcast`;
const newWindow = window.open(broadcastUrl, '_blank', newTapFeature);
이는 방송이 송출될 새로운 윈도우를 여는 코드이다.
체크인 버튼을 누르면 broadcast 페이지가 새로운 윈도우로 열리게 된다.
- 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