# WebRTC : MediaStream

#### MediaStream 개요

MediaStream은 WebRTC (Web Real-Time Communication)에서 실시간 미디어(예: 오디오 및 비디오)를 다루기 위한 핵심적인 API이다. WebRTC는 브라우저 간 실시간 커뮤니케이션을 가능하게 하며, MediaStream은 이러한 커뮤니케이션에서 미디어 스트림을 캡처, 처리, 전송하는 역할을 한다. MediaStream은 사용자 장치에서 미디어 소스를 가져오고, 이를 조작하거나 다른 노드로 전송하는 데 사용된다.

MediaStream은 주로 다음 두 가지 구성 요소로 이루어진다:

* **MediaStreamTrack**: 개별 미디어 트랙 (오디오 또는 비디오)으로 구성된다.
* **MediaStream**: 하나 이상의 MediaStreamTrack을 포함하며, 이들을 그룹화하여 하나의 스트림으로 취급한다.

#### MediaStreamTrack: 미디어 트랙의 기본 단위

MediaStreamTrack은 MediaStream의 기본 구성 요소로, 각각 오디오 또는 비디오와 같은 미디어 데이터를 표현한다. 각 MediaStreamTrack 객체는 특정한 미디어 소스에 연결되며, 이 소스는 사용자 장치의 마이크, 카메라 또는 화면일 수 있다.

* **Track의 속성**
  * `kind`: 트랙의 종류를 나타내며, "audio" 또는 "video" 값을 가질 수 있다.
  * `enabled`: 트랙이 활성화되어 있는지 여부를 나타낸다. `true`로 설정되면 해당 트랙이 전송되며, `false`로 설정되면 트랙이 비활성화된다.
  * `muted`: 트랙이 음소거되었는지 여부를 나타낸다. 이 속성은 주로 오디오 트랙에 사용된다.
  * `readyState`: 트랙의 현재 상태를 나타내며, "live" 또는 "ended" 값을 가질 수 있다.
* **Track의 메서드**
  * `clone()`: 기존 트랙을 복제하여 새로운 트랙을 생성한다. 복제된 트랙은 원본 트랙과 독립적으로 작동한다.
  * `stop()`: 트랙의 소스를 중지하고, 트랙의 `readyState`를 "ended"로 설정한다.

#### MediaStream: 다중 트랙의 그룹화

MediaStream은 여러 MediaStreamTrack을 하나의 논리적인 스트림으로 그룹화하여 관리한다. 이는 단일 오디오 및 비디오 트랙을 함께 전송하거나 처리할 때 유용하다. MediaStream은 주로 사용자의 미디어를 캡처하거나, 다른 피어와의 연결에서 미디어를 주고받는 데 사용된다.

* **MediaStream 생성**
  * 빈 MediaStream을 생성하거나, 기존의 MediaStreamTrack 배열을 사용하여 새로운 MediaStream을 생성할 수 있다.
  * `getUserMedia()`: 사용자 장치의 마이크와 카메라를 사용하여 MediaStream을 생성하는 메서드이다. 이 메서드는 Promises를 반환하며, 사용자 권한 요청이 필요하다.
* **MediaStream의 속성**
  * `id`: MediaStream의 고유 식별자이다.
  * `active`: MediaStream이 활성 상태인지 여부를 나타낸다. 하나 이상의 트랙이 "live" 상태이면 `active`는 `true`가 된다.
* **MediaStream의 메서드**
  * `getTracks()`: 스트림에 포함된 모든 트랙의 배열을 반환한다.
  * `getAudioTracks()`: 스트림에 포함된 오디오 트랙의 배열을 반환한다.
  * `getVideoTracks()`: 스트림에 포함된 비디오 트랙의 배열을 반환한다.
  * `addTrack()`: 새로운 트랙을 MediaStream에 추가한다.
  * `removeTrack()`: 기존 트랙을 MediaStream에서 제거한다.

#### MediaStream의 이벤트 처리

MediaStream과 MediaStreamTrack은 다양한 이벤트를 통해 스트림의 상태 변화를 처리할 수 있다. 이러한 이벤트는 스트림 또는 트랙의 상태 변경, 트랙 추가 또는 제거, 소스의 끝 등 다양한 상황에서 발생한다.

* **MediaStream 이벤트**
  * `active`: MediaStream이 활성화될 때 발생한다.
  * `inactive`: MediaStream이 비활성화될 때 발생한다.
* **MediaStreamTrack 이벤트**
  * `ended`: 트랙의 소스가 끝났을 때 발생한다.
  * `mute`: 트랙이 음소거되었을 때 발생한다.
  * `unmute`: 트랙이 음소거가 해제되었을 때 발생한다.

이벤트 처리를 통해 개발자는 미디어 스트림의 상태를 실시간으로 모니터링하고, 사용자 인터페이스나 연결 로직을 적절히 조정할 수 있다.

***

관련 자료:

* Mozilla Developer Network (MDN), MediaStream, <https://developer.mozilla.org/ko/docs/Web/API/MediaStream>
* W3C WebRTC 1.0 Specification, MediaStream Interface, <https://www.w3.org/TR/webrtc/#mediastream>
