-
Notifications
You must be signed in to change notification settings - Fork 4
[학습] 비디오 스트리밍을 위한 인프라
KKambi edited this page Nov 13, 2019
·
3 revisions
김한비
2019.11.11 ~
- 일반적으로 데이터를 모두 전송받으면 재생한다
- 스트리밍은 데이터를 잘게 쪼개서, 전송과 재생이 동시에 가능
- Admin이
Upload Server의 multer
를 통해Object Storage
에 비디오를 업로드한다. -
VOD Transcoder
에Object Storage
에 저장된 업로드 영상을 트랜스코딩하라는 요청을 보낸다. 다양한 화질의 영상과 썸네일이Object Storage
에 저장된다. -
Segmeneter Server
에 영상들을 스트림으로 분할해달라는 요청을 보낸다. ts 및 m3u8 파일이Object Storage
에 저장된다. 이 과정에서fluent-ffmpeg
모듈을 이용한다. -
CDN+
가Object Storage
을 복제하여 캐싱하여 사용자에게 제공한다. 이 과정은 클라우드 설정만 해주면 알아서 된다.
- m3u8파일이 그냥 스토리지에 존재하면 되나? -> OK
- m3u8요청 시 CORS제한 -> CDN의 viewr설정에서 응답 헤더 Access-Control-Allow-Origin 설정
- hls.js를 이용하여 스트리밍 자동 재생이 불가능한 문제 -> 브라우저들이 의도치 않은 데이터 전송을 막아놓음. 이벤트에 의해 video DOM의
play()메소드
가 실행되어야 함. - CDN요청이 안되는 문제 -> ts파일들 모두 공개 설정이 되어야 함. 재생이 되면서 차례차례 요청하기 때문!
- Transcoder API를 위해 Signature를 만들 때, 도메인을 제외한 "/" 아래 전체 url (쿼리스트링 포함)은
videos/#2 4 Protection with PropTypes.mp4
이 아니라/videos/#2 4 Protection with PropTypes.mp4
가 되야 한다.
- CDN Referrer 문제 -> 우리 사이트에서만 요청이 가능하도록 해야 함. 안그러면 돈 어마무시하게 나간다 :(
- play() 메소드를 실행하지 않았는데도 초기 stream 3개 정도가 요청됨 -> 메인페이지에선 요청되지 않도록 해야함.
- 파일 이름들이 함수들에 동적으로 전달되야 한다. (자동화 문제)
-
Progressive Downlad
- 가장 단순한 방식
- 웹서버에 있는 비디오를 다운받음
- 어느 정도 다운되었을 때, 재생 시작. 즉 필요한 데이터를 미리 받아놓음
-
RTSP/RTMP Streaming
- 사용자가 현재 시청하고 있는 비디오 프레임만을 전송
- 따라서 데이터를 미리 다운받아놓지 않음
- 이미 시청한 데이터는 버림
-
Adaptive HTTP Streaming
- 1번과 2번을 결합
- 서버는 잘개 쪼개진 비디오 스트림들을 보유
- 이들을 전송
특징
- Adaptive HTTP Streaming을 제공하기 위한 Manifest 포맷
- 애플이 만든 프로토콜로, 가장 많이 쓰임!
- HTTP를 전송 채널로 사용
- 다른 프로토콜에 비해 방화벽 설정 / 웹서버 캐싱 적용 / CDN 이용이 쉬움
- full-duplex가 아닌 half-duplex이므로 별도의 방식은 필요
파일 포멧
- 스트리밍 데이터를 MPEG-2 Transport Stream(ts)에 담아 쪼개서 전송
- 어떤 파일을 재생해야 하는지 m3u8(메타데이터) 파일에 담아 전송
비디오 전송
- 비디오 파일을 코덱을 이용해 압축해서 서버로 보낸다.
- Stream Segment는 일정한 시간 간격마다 입력받은 미디어 데이터를 분할해 파일을 만들고, 그 분할한 파일에 접근할 수 있는 m3u8를 생성
- 웹 서버는 저장되어 있는 파일을 읽어서 HTTP 응답에 데이터를 싣기만 하면 된다.
- 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에는 해당 서비스가 없고, 직접 구축하여 스크립트?로 작성해야하는 상황