Adaptive HTTP Streaming

플래시가 대세였던 웹 동영상 기술이 점차 표준 기술인 HTML5 비디오로 전환되었고,
현재 많은 동영상 서비스들은 HTML5를 기반으로 서비스되고 있다.
기술이 발전함에 따라 네트워크 환경에 따른 최적의 스트리밍 서비스를 제공하기 위해 여러한 노력들이 있었고, 그 중 하나가 이번에 소개할 Adaptive HTTP Streaming이다.

Adaptive HTTP Streaming이란 ?

제목에서도 알 수 있듯이 Adaptive 즉 적응형 HTTP 스트리밍이란 뜻이다.

사용자의 네트워크 상태에 적응하여 최적의 스트리밍 서비스를 제공하는 것이 Adaptive HTTP Streaming의 방식이다.

기존의 동영상 스트리밍 방식과 무엇이 다른가?

기존 스트리밍 방식인 Progressive download (PD)는 동영상 소스가 한번 선택되면 해당 콘텐츠를
끝까지 다운로드해가며 플레이하는 방식이다.

해당 방식의 단점은 한가지 해상도의 동영상 소스가 선택되어 다운로드되기 때문에,
유저의 네트워크 상황에 따라 유저는 버퍼링을 만날 수 있게되고, 이후 네트워크 상황이 좋아지지않는다면, 버퍼링 지옥에 빠질 수밖에 없다.

Adaptive HTTP Streaming은 바로 이 문제를 해결하기 위하여 만들어졌는데,

작동하는 방식은 아래와 같다.

Adaptive HTTP Streaming의 동작 방식

  • Adaptive HTTP Streaming은 동영상 콘텐츠를 다양한 해상도로 인코딩하여 저장하는 것 뿐만 아니라 해당 동영상을 작은 조각으로 쪼개 저장해둔다.

  • 사용자가 동영상을 플레이할 때, 실시간 네트워크 상황에 따라서 적절한 소스를 선택하여 네트워크 환경에 최적화 된 스트리밍 서비스를 제공한다.

  • 동영상을 작은 조각들로 쪼개두었음으로, 유저의 실시간 네트워크 상황에따라 low quality / high quality의 동영상 조각을 제공하여 버퍼링을 방지하고, 최적의 스트리밍 환경을 제공한다.
    ( 이 때문에 Adaptive, 반응형 이라 불린다)

예시

넷플릭스나 유튜브 동영상을 시청할때, 처음에는 360p, 480p 등 low quality의 해상도를 제공하다가 점점 해상도가 좋아지는 경험을 했던 적이 많을것이다. (특히 넷플릭스)
ve
이는 처음에는 사용자의 네트워크 상태를 파악할 수 없으니 낮은 해상도의 콘텐츠 조각을 내려주다가, 유저의 평균 네트워크 상황이 확정되면 그에 최적화된 해상도로 내려주는 전략을 선택했을 것으로 짐작해 볼 수 있다.

또한 이는 이전의 인터넷 경험과는 다르게 요즘의 스트리밍 서비스는 스트리밍 중간에 화질을 낮추거나 높혀도 스트리밍이 처음부터 다시 시작하지 않는 것의 이유 또한 될 것이다.
( 불과 10년+ 전의 네이버 동영상 플레이어를 기억해보자..)

Adaptive Streaming의 플로우

서버 파트

Adaptive Streaming을 지원하기 위해선 PD와는 다르게 여러 준비가 필요하다.

  1. 동영상을 업로드할때 동영상 파일을 작은 조각으로 잘라낸다.
  2. 작은 조각들을 서비스에서 정한 대역폭에 대응하는 해상도로 인코딩한다.
  3. 네트워크 대역폭에 대응되는 조각들의 '정보'가 담긴 파일을 클라이언트에 제공한다.

여기서 작은 조각을 세그먼트라고 하고, 최종적으로 클라이언트에게 보내는 파일을 매니페스트 파일이라 한다.

즉 서버는 동영상을 업로드 할 때 세그먼트를 생성하고, 세그먼트를 각각의 해상도 별로 인코딩하여 해당 정보를 담은 메니페스트 파일을 클라이언트에 제공한다.

(Adaptive HTTP Streaming을 제공하기 위한 매니페스트 포맷으로는 애플에서 독자적으로 만든 Apple-HLS 와 MPEG에서 표준화 한 MPEG-DASH가 있다.)

클라이언트 파트

  1. 클라이언트는 스트리밍 할 동영상의 각 해상도별 세그먼트info가 담긴 매니페스트 파일을 서버에 요청한다.
  2. 매니페스트 파일을 파싱하여 필요한 info들을 얻은 후 vedio에 대한 info, 지원되는 해상도, 세그먼트를 다운로드 할 수 있는 위치 등을 파악한다.
  3. 클라이언트는 사용자의 네트워크 환경을 측정하여 메니페스트의 내용에 따라 가장 최적의 vedio 퀄리티를 선택한 뒤, 필요한 세그먼트를 다운로드 한다. 이 두 과정은 스트리밍이 되는 순간부터 실시간으로 일어나며 실시간으로 상황에 맞는 퀄리티의 세그먼트들을 다운로드 한다.
  4. 다운로드한 세그먼트들의 데이터를 MSE 버퍼에 제공한다.
  5. MSE는 데이터를 디코딩하여 vedio 객체에 제공하고, vedio 객체는 영상을 출력(플레이)한다.

Adaptive Streaming의 핵심 요소

MSE

APPLE-HLS 포맷의 경우 MAC/Mobile 사파리에서 바로 미디어 소스로 적용할 수 있지만, MPEG-DASH일 경우 대부분 MSE를 이용하여 직접 데이터를 디코딩한다.

실제로 HLS나 DASH 모두 스트리밍 할 미디어 데이터에 대한 정보를 클라이언트에게 제공할 뿐이지, 실질적으로 플레이에 관여하지는 않는다. (해당 관여는 세그먼트가 담당한다)

MSE는 실직적으로 각종 메니패스트 파일을 통해 얻은 세그먼트 정보를 바탕으로, 세그먼트를 다운로드하여 웹 환경에서 플레이할때 사용된다.
(여기서 사파리는 HLS 매니패스트를 영상 재생 소스로 사용할 수 있다.)

세그먼트 (Segment)

세그먼트는 다양한 화질로 인코딩 된 동영상 데이터의 작은 조각이다. 이 조각에 대한 정보는 DASH 나 HLS와 같은 매니패스트 파일에 의해 얻어오고, 각 조각들은 동영상의 일정한 부분들을 담당한다.

세그먼트는 크게 2가지의 종류로 나눌 수 있는데

  1. 첫번째는 바로 Initialization Segment (초기화 세그먼트) 이다.

초기화 세그먼트는 실제 동영상 정보를 담고 있는 미디어 세그먼트의 시퀀스를 디코딩 하는데 필요한 정보들을 담고 있는데, 여기엔 코덱 초기화 데이터, 트랙 ID, TimeStamp Offset등의 정보가 담겨있다.

  1. 두번째는 바로 Media Segment (미디어 세그먼트)이다.

미디어 세그먼트는 패킷화된 동영상 데이터, 자신이 플레이 되어야 할 Media TimeLine 상의 TimeStamp 정보가 포함된 실제 동영상 데이터를 담고있다.

미디어 세그먼트와 초기화 세그먼트의 연관성 중 하나를 집자면, 미디어 세그먼트는 초기화 세그먼트의 TimeStamp Offset를 토대로 자신의 TimeStamp를 알기 때문에,
미디어 세그먼트를 순차적으로 플레이어에 제공하지 않아도 플레이되어야 할 위치에서 플레이 되게 된다.

이 부분이 바로 우리가 동영상을 보다 중간에 클라이언트를 나갔다 들어와도, 마지막으로 스트리밍이 종료된 시점부터 다시 재생되는 역할을 할 것이다.

MediaSource / SourceBuffer 객체

MediaSource는 HTMLMediaElement의 미디어 데이터 소스를 나타내는 객체이다.
동영상 플레이어에서 플레이 되고있는 한 종류의 미디어로 이해하면 될것이다.

SoureBuffer 객체는 MediaSource에게 미디어 세그먼트를 전달해주고, HTMLMediaElement(플레이어)는 동영상을 플레이하면서 MediaSource로 부터 실시간으로 필요한 데이터를 꺼내온다.

즉 데이터의 흐름은
SoureBuffer -> MediaSource -> 플레이어(HTMLMediaElement) 가 될 것이다.

이론공부는 간략하게 이쯤에서 끝내고,
다음편에서는 Adaptive Streaming를 어떻게 사용할 수 있는지에 대해 알아보자.

위 글은 NHN Cloud의 웹 기술로 구현하는 Adaptive HTTP Streaming 포스트를 참조하여 작성하였습니다.

profile
const isInChallenge = true; const hasStrongWill = true; (() => { while (isInChallenge) { if(hasStrongWill) {return 'Success' } })();

0개의 댓글