m3u8과 hls

Tony·2023년 4월 11일
0

react-player로 m3u8 영상을 재생할 때, 브라우저 네트워크 탭

  • .m3u8 확장자와 .ts 확장자의 파일이 지속적으로 요청을 보내고 응답을 받는다

  • .m3u8의 응답

  • .ts의 응답

.m3u8의 응답을 보면 지난 MPD 포스팅 때 segment가 여러개로 나뉘어서 요청을 보내는 것과 유사해보인다
m3u8도 다수의 segment들로 나뉘어있다

HLS(HTTP Live Streaming)란?

  • HTTP를 라이브 스트리밍을 위한 프로토콜로 사용하는 방법

  • 애플이 개발하여 2009년에 출시한 HTTP기반 적응 비트레이트 스트리밍 통신 프로토콜

    • HLS, MPEG-DASH가 대표적인 비디오 스트리밍 포맷
  • HLS는 전반적인 스트림을 크기가 작은 일련의 HTTP 기반 파일 다운로드로 분리시켜 개개의 다운로드를 통해 잠재적으로 무한한 전송 스트림의 작은 덩어리를 적재시킴으로써 동작한다는 면에서 MPEG-DASH와 유사하다.

라이브 생방송 송출 원리

  • 카메라 -> Encoder(인코더) -> Media server + 동영상 플레이어 -> client

카메라 -> Encoder

  • Encoding(인코딩) : 컴퓨터를 이용하여 영상, 이미지 또는 소리데이터를 생성할 때, 원래의 데이터양을 줄이기 위해 데이터를 코드화하고 압축하는 것
    • 재생할 땐 디코딩(decoding) 작업을 한다

Encoder -> Media server

  • Encoder를 거친 뒤, 미디어 서버로 영상을 보낼 때는 스트리밍에 최적화된 스트리밍 프로토콜을 사용
    • 스트리밍 : 멀티미디어 파일을 다운로드 하는 동시에 실행하는 방법이나 기술
    • 대표적인 스트리밍 프로토콜
      • Encoder : RTMP, RTSP, webRTC, SRT
      • player : HLS, DASH, LL-HLS, webRTC, SRT
  • Encoder의 경우 주로 RTMP(Real time streaming protocol)프로토콜을 사용
    • 과거에는 UDP 기반의 RTSP(Real time streaming protocol)을 많이 사용하였으나 최근에는 RTMP 프로토콜이 거의 표준
  • Player의 경우에는 HLS(HTTP-Live Streaming), MPEG-DASH가 대표적

Media server -> 동영상 플레이어

  • 안정적인 송출을 위해서는 충분한 인터넷 업로드, 대역폭이 확보되어야 합니다. 따라서 Bitrate를 변환하는 작업도 필수적으로 필요합니다.
    • 비트레이트(Bitrate) : 특정한 시간 단위(이를테면 초 단위)마다 처리하는 비트의 수
  • 멀티비트레이트(Multi Bitrate)는 비디오 플레이어에서 보여지는 화질 선택 기능과 밀접하게 관련이 있습니다.
    • 멀티비트레이트는 비트레이트가 다른 여러 개의 영상을 준비하여 필요에 따라 영상을 전환하는 방식이나 기술을 뜻합니다.

  • Bandwitdth에 따라 각기 다른 Bitrate Stream이 선택되는 것을 확인할 수 있습니다.
    • 출처 : 위키피디아

동영상 플레이어 -> 시청자(client)

  • 실시간으로 생성한 HLS 및DASH 영상 조각 파일을 사용자에게 전달하려면 전송 서버가 있어야합니다. 일반적인 미디어 서버는 전송 서버의 역할까지 수행하지만, 동시 시청자가 많은 방송일 경우에는 대규모 트래픽을 안정적으로 처리하기 위해 CDN을 사용하는 것을 권장합니다.
  • 시청자(클라이언트)측에서 이러한 Adaptive Streaming을 가능하게 하는 표준 기술로 MSE (Media Source Extensions)을 사용하며 이를 통해 스트리밍 데이터를 플레이어로 전달하게 됩니다.
    • video 태그에서 기본으로 지원하지 않지만 라이브러리에서 hls 또는 mpd파일을 지원하는 MSE을 사용하여 스트리밍 데이터를 플레이어로 전달

정리

    1. 클라이언트는 실시간 영상을 시청하기 위해 동영상의 각 Quality & Resolution 별 Segment 정보들이 담겨있는 Menifest(.m3u8, .mpd)파일을 Server에게 요청
    1. Manifest 파일을 파싱
    1. 파싱된 파일에서 필요한 정보들을 얻음
    • 비디오에 대한 정보, 해상도의 퀄리티를 사용할 수 있는지 여부, 해당세그먼트를 받을 수 있는지 파악
    1. 클라이언트는 User network bandwidth를 측정하고 manifest 내용에 따라 가장 최적의 비디오 퀄리티를 선택(Multi Bitrate)한 뒤, 필요한 Segment를 다운로드
    1. 다운로드한 Segment 데이터를 MSE(Media Source Extensions)에게 제공
    1. MSE에서 받은 데이터를 형식에 맞게 디코딩하고 영상을 실행

Player 프로토콜 작동 과정 이해하기

  • 우선 H.264 + AAC등 포맷의 동영상 파일을 작은 단위로 분할합니다.(용량에 따라 2초 ~10초 단위)

  • 이와 더불어 분할된 파일의 재생순서가 작성된 manifest 파일을 생성합니다.

    • manifest파일에는 분할된 동영상 파일을 어떤 순서로 몇 초간 재생할 것인지에 대한 내용들이 텍스트로 작성되어 있습니다.
    • HLS의 경우에는 .m3u8 파일이, Dash의 경우 .mpd(xml)와 같은 manifest 파일이 생성됩니다.
    • 이러한 과정을 거쳐 작은 단위로 분할된 미디어 파일은 mp2ts와 mp4로 구성되어 있고 mp2ts의 확장자는 .ts입니다.
  • 마지막으로 HLS, DASH를 지원하는 브라우저나 Application에서 Manifest 파일을 읽어서 재생합니다.

    • html video tag는 HLS를 기본으로 지원하진 않음(플레이어 관련 라이브러리를 사용하거나 hls지원 js를 받아서 사용해야 함)
    • Manifest 파일에 작성되어 있는 분할된 동영상 파일을 순차적으로 읽어 들여 재생하게 됩니다.
    • 따라서 첫번째 segment file을 다 불러오게 되면 재생을 시작할 수 있게 되고, 재생이 진행되면서 2번째 및 3번째 segment file을 뒤에서 계속 실행합니다.
    • 만약 동영상을 중간부터 재생한다고 하면 manifest 파일(.m3u8, mpd)에 근거하여 해당 타임에 맞는 segment file을 먼저 다운로드를 하게 될 것입니다.

참고

profile
움직이는 만큼 행복해진다

0개의 댓글