검정치마가 한정 공개한 음원으로 알게된 HLS 동작 방법

Benza·2022년 4월 26일
0

🔎

목록 보기
6/11
post-thumbnail

4월 26일 자정 즈음 친구에게서 메시지를 받았다.

우리의 눈물 도둑 검정치마가 일주일 동안만 사운드클라우드에 음원을 공개하고 닫겠다는 인스타그램 피드였다.

이런 보물을 그냥 흘려보내기엔 아까워 다운 받을 방법을 고민했다.

당연히 먼저 구글링

너무 쉽게도 mp3 파일을 받을 수 있었다. 근데 문득 궁금증이 생겼다. 어떻게 저 음원을 다운 받을 수 있었을까?

  1. 서버에서 음원을 크롤링 했나?
  2. 서버로 음원 데이터를 변환하나?

음악이 재생될 때 브라우져의 network를 확인 했다.

일정시간 단위로 이벤트를 fetch하는 것을 발견했다.
나눠진 mp3 파일을 긁어오는 걸 확인 할 수 있다.

재생프로그래스바에 재생 가능한 영역이 늘어날때 새로운 mp3파일을 불러온다.

스트리밍 서비스의 동작 방법이란걸 알아차렸고 어떻게 client에서 재생이 되는지 전반적인 프로세스에 대해서 궁금해졌다.

HLS

  • HTTP으로 영상 스트리밍을 할 때 사용하는 프로토콜을 의미합니다.
  • 이 프로토콜은 2009년에 애플에서 공개한 표준이며, 현재는 많은 플랫폼에서 HLS 프로토콜을 지원하고 활용하고 있습니다.

HLS는 애플에서 만들어졌고, iOS와 Andriod3.0 이상도 지원하고 있기 때문에 다양한 모바일에서 현재 사용되고 있다. 이러한 스트리밍 기술은 HLS 이외에 MPEG-Dash, HDS, Smooth Streaming 기술이 있다.
그리고 아래와 같은 기능들을 지원하고 있다.

  • Live or VOD
  • Adaptive Streaming
  • Smart Streaming
  • Encryption

HLS 구조

HLS의 전반적인 flow를 살펴보자.

![[Pasted image 20220428230434.png]]
영상을 만드는 하드웨어에서 인코딩을 한다.
서버에서 스트림 세그멘트로 파일을 잘게 쪼갠다.
디스트리뷰션 영역에서는 고화질과 저화질 청크들을 파일리스트로 관리한다.
클라이언트 단에서는 웹서버에 재생을 위해서 요청한다.
그럼 서버에서는 내용에 맞는 미디어를 내려주고 그것을 정지 없이 플레이한다.

HLS 재생

코드상에서

let url = URL(String:"http://example.com/masterplaylist.m3u8")
let asset = AVURLAsset(url: url)
let playerItem = AVPlayerItem(asset: asset)
let player = AVPlayer()
let playerLayer = AVPlayerLayer(player: player)

player.replaceCurrentItem(with: playerItem)

.m3u8: 각각의 파일리스트를 관리하는 주소
마스터플레이리스트 파일에 요청을 하게되면 각각의 파일리스트에 대한 정보를 응답받는다.

![[Pasted image 20220428231211.png]]

시스템에서

![[Pasted image 20220428231519.png]]

HLS 성능 측정

HLS 성능 기준은 아래와 같다.

![[Pasted image 20220428231714.png]]

AVPlayerItemAccessLog

play history를 저장하는 세션이 있다. 이는 성능 측정시 매우 유리하다
URI가 변경 될 떄, Seeking 시에 새로운 accessLogEvent 인스턴스가 생성된다.

Stratup time: 재생이 될때까지의 시간
Stall count: stall이 생길때 마다 count 증가
Stall Duration: 스톨이 되는 시간(AVPlayerItemPlaybackStalledAVPlayer.timeControlStatus == .playing 사이의 시간)
Indicated bitrate: 재생동안의 Bitrate
Error: AVPlayerErrorlog로 확인할 수 있다.

결론

이렇게 HLS와 스트리밍 기법에 대해 알아봤다.
Stream data to MP3 다운로드의 정확한 방법은 아직 모르겠다.

추측해 본다면 2가지로 생각된다.

  • 원본 인덱스에 접근해 mp3 청크 파일들을 다운 받고 합친다.
    - 보안상의 이유로 쉽지 않을것 같다.
  • 스트리밍 대상 url에서 응답받은 mp3 청크를 각각 다운 받고 하나의 파일로 합친다.
    - 가장 쉽고 합리적인 방법이라고 생각된다.

출처(참고문헌)

profile
Understanding the impression

0개의 댓글