Live Streaming
Streaming이란 멀티미디어 파일을 다운로드 하는 동시에 실행하는 방법이나 기술을 말합니다.
저장되어 있는 동영상을 스트리밍하는것이 아니라 실시간으로 데이터를 받아 스트리밍하므로 Latencty 즉 지연시간이 중요합니다.
Latency
프로토콜마다 지연시간이 다양한 이유는 방송 송출부터 사용자에게 전달하기까지 복잡한 파이프라인을 거치기 때문에 원인이 복합적입니다. 큰 원인은 아래 3가지 입니다.
- Latency
- Scale
- Quality
이들은 trade-off 관계이므로 스트리밍 기술을 사용하는 목적을 생각해서 선택하려합니다.
Protocol
viewtist는 하나의 스트리밍을 동시에 많은 사람들이 볼 수 있도록 송출해주는 플랫폼입니다. 따라서 리얼타임에 가장 가깝지만 1:1에 강한 WebRTC는 적합하지 않다고 판단하였습니다.
상대적으로 적은 지연시간을 가지는 RTMP
와
다수의 사람들이 다양한 디바이스에서 시청할 수 있도록 HLS
를 선택하였습니다!
Process 1: Camer to Media Server
- 카메라는 아날로그 입력(빛, 소리)을 입력받아 디지털 형식의 데이터로 변환합니다.
- 해당 데이터를 전송에 용이하도록 인코딩 및 압축합니다.
- 인코딩 된 데이터는 미디어 서버에 배포되어야하는데 이때
RTMP
가 사용됩니다. - 인코딩 장치와 미디어 서버의 영구적인 연결을 설정하여 빠르게 업로드 할 수 있도록 합니다.
1.1 Camera -> Encoder
그렇다면 카메라로 찍은 영상을 어떻게 미디어 서버에 연결할까요?RTMP
는 HTTP 상에서 통신하지 못하므로 RTMP 호환 카메라
또는 인코더
로 시작해야합니다.
인코더는 OBS 또는 StreamLabs를 많이 이용한다고 합니다.
1.2 Encoder -> Media Server
인코더와 Media Server의 연결을 RTMP 프로토콜을 이용하여 시작합니다.
- 3-way handshake로 이루어집니다.
Handshake 성공 후 연결이 완료되면 데이터를 주고 받을 수 있습니다.
데이터는 Chunk 단위로 fragmentation되어 송신 후 수신 단에서 조합하여 온전한 메세지가 됩니다.
(일반적으로 데이터 청크의 크기는 128byte, 오디오 청크의 크기는 64byte 입니다.)
- Chunk
Process 2: Media Server to Devices
2.1 Media Server
미디어 서버에서는 스트리밍을 할 준비가 되었습니다.
하지만 Adobe Flash Player의 지원 중단으로 RTMP의 재생은 되지 않습니다. 따라서 웹 브라우저에서 재생이 될 수 있는 프로토콜로 전송을 해주어야합니다.
2.2 Trans Coding
송신 프로토콜로 hls를 사용하기로 하였습니다.
인코더가 보내준 인코딩 된 영상을 디코딩하여 원본 파일을 다시 hls 형식으로 인코딩 즉 트랜스 코딩
하여 전송해야합니다.
사용자의 다양한 디바이스 크기, 네트워크 환경에 맞는 영상을 시청하도록 미디어 서버에서 원본 영상을 여러 화질로 변환하여 인코딩해줍니다.
(CPU를 많이 사용하는 작업입니다. )
2.3 Trans Muxing
화질별로 변환된 영상을 다시 HLS 형식으로 변환합니다.
2.4 Media Server -> Devices
미디어 서버에서 드디어 HLS 프로토콜로 스트리밍을 시작합니다.
HLS 형식의 동영상 파일을 작은 단위로 분할합니다. 이것을 ts 청크파일이라고 합니다.
분할된 파일의 재생순서가 작성된 mainfest 파일(.M3U8)을 생성합니다.
HLS에서 지원하는 브라우저에서 Manifest 파일을 읽어서 재생합니다.