Skip to content

[학습] 비디오 스트리밍을 위한 인프라

KKambi edited this page Nov 13, 2019 · 3 revisions

infra

비디오 스트리밍 인프라 학습문서

김한비
2019.11.11 ~

스트리밍?

  • 일반적으로 데이터를 모두 전송받으면 재생한다
  • 스트리밍은 데이터를 잘게 쪼개서, 전송과 재생이 동시에 가능

스트리밍 서비스 작동 시나리오

  1. Admin이 Upload Server의 multer를 통해 Object Storage에 비디오를 업로드한다.
  2. VOD TranscoderObject Storage에 저장된 업로드 영상을 트랜스코딩하라는 요청을 보낸다. 다양한 화질의 영상과 썸네일이 Object Storage에 저장된다.
  3. Segmeneter Server에 영상들을 스트림으로 분할해달라는 요청을 보낸다. ts 및 m3u8 파일이 Object Storage에 저장된다. 이 과정에서 fluent-ffmpeg 모듈을 이용한다.
  4. CDN+Object Storage을 복제하여 캐싱하여 사용자에게 제공한다. 이 과정은 클라우드 설정만 해주면 알아서 된다.

삽질과정

  1. m3u8파일이 그냥 스토리지에 존재하면 되나? -> OK
  2. m3u8요청 시 CORS제한 -> CDN의 viewr설정에서 응답 헤더 Access-Control-Allow-Origin 설정
  3. hls.js를 이용하여 스트리밍 자동 재생이 불가능한 문제 -> 브라우저들이 의도치 않은 데이터 전송을 막아놓음. 이벤트에 의해 video DOM의 play()메소드가 실행되어야 함.
  4. CDN요청이 안되는 문제 -> ts파일들 모두 공개 설정이 되어야 함. 재생이 되면서 차례차례 요청하기 때문!
  5. Transcoder API를 위해 Signature를 만들 때, 도메인을 제외한 "/" 아래 전체 url (쿼리스트링 포함)은 videos/#2 4 Protection with PropTypes.mp4이 아니라 /videos/#2 4 Protection with PropTypes.mp4가 되야 한다.

해결해야할 문제

  1. CDN Referrer 문제 -> 우리 사이트에서만 요청이 가능하도록 해야 함. 안그러면 돈 어마무시하게 나간다 :(
  2. play() 메소드를 실행하지 않았는데도 초기 stream 3개 정도가 요청됨 -> 메인페이지에선 요청되지 않도록 해야함.
  3. 파일 이름들이 함수들에 동적으로 전달되야 한다. (자동화 문제)

비디오 전송에 쓰일 수 있는 프로토콜 종류

  1. Progressive Downlad

    • 가장 단순한 방식
    • 웹서버에 있는 비디오를 다운받음
    • 어느 정도 다운되었을 때, 재생 시작. 즉 필요한 데이터를 미리 받아놓음
  2. RTSP/RTMP Streaming

    • 사용자가 현재 시청하고 있는 비디오 프레임만을 전송
    • 따라서 데이터를 미리 다운받아놓지 않음
    • 이미 시청한 데이터는 버림
  3. Adaptive HTTP Streaming

    • 1번과 2번을 결합
    • 서버는 잘개 쪼개진 비디오 스트림들을 보유
    • 이들을 전송

HTTP Live Streaming(HLS)

특징

  1. Adaptive HTTP Streaming을 제공하기 위한 Manifest 포맷
  2. 애플이 만든 프로토콜로, 가장 많이 쓰임!
  3. HTTP를 전송 채널로 사용
  4. 다른 프로토콜에 비해 방화벽 설정 / 웹서버 캐싱 적용 / CDN 이용이 쉬움
  5. full-duplex가 아닌 half-duplex이므로 별도의 방식은 필요

파일 포멧

  1. 스트리밍 데이터를 MPEG-2 Transport Stream(ts)에 담아 쪼개서 전송
  2. 어떤 파일을 재생해야 하는지 m3u8(메타데이터) 파일에 담아 전송

비디오 전송

  1. 비디오 파일을 코덱을 이용해 압축해서 서버로 보낸다.
  2. Stream Segment는 일정한 시간 간격마다 입력받은 미디어 데이터를 분할해 파일을 만들고, 그 분할한 파일에 접근할 수 있는 m3u8를 생성
  3. 웹 서버는 저장되어 있는 파일을 읽어서 HTTP 응답에 데이터를 싣기만 하면 된다.
  4. HTTP는 양방향 방식이 아니기 때문에, 클라이언트에서 반드시 서버에 요청을 해야 그에 맞는 응답을 받을 수 있다. 즉, 잘게 쪼갠 동영상과 다음에 볼 동영상 정보를 함께 클라이언트에 전달하고 동영상이 끊김 없이 때에 맞춰 다음 동영상 정보를 요청한다.

HLS를 위한 ts파일 생성

  • MPEG-2 TS를 순서대로 저장한 ts 파일들 필요
  • 지정한 시간에 따라 분할
  • m3u8과 ts 파일을 전송하게 된다!

Adaptive Bitrate Streaming 지원

  • 사용자의 네트워크 속도에 따른 콘텐츠를 제공
  • 동시에 여러 비트레이트의 ts 파일에 대한 정보 제공
  • 다양한 주의점이 있으므로 적용할지 말지 고민해야 함

각 인프라 서비스의 역할

역할
  - 비디오 저장소: Object Storage
  - 비디오 스트림 캐싱(복제 저장소): CDN+ 
  - 코덱을 이용한 압축: VOD Transcoder
  - 스트림 세그먼터: Who????

Object Storage

  • 원본 저장소

VOD Transcoder

  • 코덱 = 인코딩 및 디코딩을 하는 장치 (COder and DECoder)
  • 인코딩 = 정보의 형태를 변환하는 일 (다른 디바이스에서 볼 수 있게 한다든지...)
  • VOD Transcoder는 H.264 출력 코덱 지원
  • 다양한 화질로 영상 변환 가능

CDN

  • Content Delivery Network (컨텐츠 전송 네트워크)
  • 이미지, 동영상과 같은 용량이 크고 사용빈도가 높은 데이터를 복제하여 제공하는 프록시서버 (정적파일저장)
  • 대규모 캐싱 시스템

Stream Segmenter

  • 비디오를 transport stream으로 분할하고, m3u8 파일을 만드는 모듈
  • nCloud에는 해당 서비스가 없고, 직접 구축하여 스크립트?로 작성해야하는 상황
Clone this wiki locally