-
스트리밍 프로토콜 구현체
- HLS.js
- Akamai
- flowplayer
- FLUID player
- Naver TV
- VLIVE
- DASH.js
- VLIVE
- Shaka-player
스트리밍
멀티미디어 파일을 다운로드함과 동시에 실행하는 방법/기술
대표적인 스트리밍 프로토콜
- MEPG-DASH (MPEG)
- HSL (HTTPS Live Streaming - Apple)
- HDS (Adobe)
- Smooth Streaming (MS)
HLS
Quick Time, iOS, Safari 등에서 사용
- 미디어 컨테이너 포맷 :
.mp2ts
,.mp4
- 매니페스트 파일 :
.m3u8
1. H.264 + AAC 등의 포맷 동영상 파일을 10초 정도의 작은 단위로 분할 (MPEG-2 TS 컨테이너 타입의 세그먼트 파일) 2. 분할된 파일의 재생 순서가 작성된 매니페스트 파일(.m3u8) 생성 3. HLS를 지원하는 브라우저나 애플리케이션에서 매니페스트 파일을 읽어 재생 시작 - 재생은 매니페스트 파일에 작성돼 있는 분할 된 동영상 파일을 순차적으로 읽어들이며 진행 - 동영상 도중부터 재생할 경우 해당하는 시간의 동영상 파일 읽어들임
- 전송 속도에 따라서 그 세그먼트 파일의 크기가 너무 커서 다운받기전에 재생이 실행돼버리면 안되므로,
- TS파일로 분할은 시간을 기준으로 하되, 용량도 고려해서 세그먼트를 분할
FFmeg 실행 예제
$ ffmpeg\ -i <입력 파일.mp4>\ -map 0\ -f segment\ -vcodec libx264\ # 영상 코덱 지정 -acodec libfdk_aax\ # 음성 코덱 지정 -segment_list video/playlist.m3u8\ # 플레이 리스트 파일명 -segment_time 5\ # 5초 정도 분량으로 분할 video/segment-%03d.ts # .ts명은 segment-000.ts~segment-999.ts
$ python -m SimpleHTTPServer
멀티 비트레이트
- 화질 선택 기능과 밀접한 관련
- 비트레이트가 다른 여러 영상을 준비하고 필요에 따라 영상을 전환 방식/기술
원본 : video.m3u8
(비트레이트 별 매니페스트 파일이 작성된 파일)
유튜브 실시간 스트림의 해상도 및 비트 전송률
- 4K/2160p @60fps : 3840x2160p / 20,000~51,000Kbps
- 4K/2160p @30fps : 3840x2160p / 13,000~34,000Kbps
- 1440p @60fps : 2560x1440p / 9,000~18,000Kbps
- 1440p @30fps : 2560x1440p / 6,000~13,000Kbps
- 1080p @60fps : 1920x1080p / 4,500~9,000Kbps
- 1080p : 1920x1080p / 3,000~6,000Kbps
- 720p @60fps : 1280x720p / 2,250~6,000Kbps
- 720p : 1280x720p / 1,500~4,000Kbps
- 480p : 854x480p / 500~2,000Kbps
- 360p : 640x360p / 400~1,000Kbps
- 240p : 246x240p / 300~700Kbps
How to choose the right bitrate
https://docs.peer5.com/guides/production-ready-hls-vod/
Master playlist
- bandwidth에 따라 Resolution 결정 (360p / 480p / 720p / 1080p)
playlist.m3u8
#EXTM3U #EXT-X-VERSION:3 #EXT-X-STREAM-INF:BANDWIDTH=800000,RESOLUTION=640x360 360p.m3u8 #EXT-X-STREAM-INF:BANDWIDTH=1400000,RESOLUTION=842x480 480p.m3u8 #EXT-X-STREAM-INF:BANDWIDTH=2800000,RESOLUTION=1280x720 720p.m3u8 #EXT-X-STREAM-INF:BANDWIDTH=5000000,RESOLUTION=1920x1080 1080p.m3u8
[참고] twitch Broadcasting Guidelines
NVIDIA NVENC Specs x264 Specs 1080p 60fps
(고품질, 느린 동작 콘텐츠)1080p 60fps
(고품질, 느린 동작 콘텐츠)Resolution: 1920x1080
Bitrate: 6000 kbps
Rate Control: CBR
Framerate: 60 or 50 fps
Keyframe Interval: 2 seconds
Preset: Quality
B-frames: 2Resolution: 1920x1080
Bitrate: 6000 kbps
Rate Control: CBR
Framerate: 60 or 50 fps
Keyframe Interval: 2 seconds
Preset: veryfast <-> medium
Profile: Main/High1080p 30fps
빠른 속도의 게임 (예: 배틀 로얄, 슈팅 게임)1080p 30fps
빠른 속도의 게임 (예: 배틀 로얄, 슈팅 게임)Resolution: 1920x1080
Bitrate: 4500 kbps
Rate Control: CBR
Framerate: 25 or 30 fps
Keyframe Interval: 2 seconds
Preset: Quality
B-frames: 2Resolution: 1980x1080
Bitrate: 4500 kbps
Rate Control: CBR
Framerate: 25 or 30 fps
Keyframe Interval: 2 seconds
Preset: veryfast <-> medium
Profile: Main/High720p 60fps 720p 60fps Resolution: 1280x720
Bitrate: 4500 kbps
Rate Control: CBR
Framerate: 60 or 50 fps
Keyframe Interval: 2 seconds
Preset: Quality
B-frames: 2Resolution: 1280x720
Bitrate: 4500 kbps
Rate Control: CBR
Framerate: 60 or 50 fps
Keyframe Interval: 2 seconds
Preset: veryfast <-> medium
Profile: Main/High720p 30fps 720p 30fps Resolution: 1280x720
Bitrate: 3000 kbps
Rate Control: CBR
Framerate: 25 or 30 fps
Keyframe Interval: 2 seconds
Preset: Quality
B-frames: 2Resolution: 1280x720
Bitrate: 3000 kbps
Rate Control: CBR
Framerate: 25 or 30 fps
Keyframe Interval: 2 seconds
Preset: veryfast <-> medium
Profile: Main/High오디오 오디오 코덱: AAC-LC. 스테레오 또는 모노
권장 오디오 비트 전송률: 128kbps
최대 오디오 비트 전송률: 320kbps (AAC)
샘플링 주파수: 모든 (AAC)코덱: AAC-LC. 스테레오 또는 모노
권장 오디오 비트 전송률: 128kbps
최대 오디오 비트 전송률: 320kbps (AAC)
샘플링 주파수: 모든 (AAC)NVENC ↔️ x264
NVENC
- GPU 내의 전용 인코더를 사용해 모든 인코딩을 처리하는 NVIDIA 인코더로
- 게임 성능의 저하 없이 플레이하고 방송할 수 있게 해줍니다.
- 튜링 기반 NVIDIA GeForce GPU(예: RTX 20-Series 및 GTX 1660/Ti)에서 NVENC는 x264 중간 사전 설정에 필적하는 이미지 품질을 제공
- 이전 Pascal 및 Kepler GPU는 x264의 매우 빠른 사전 설정에 필적하는 이미지 품질을 제공
x264
- CPU를 사용해 동영상을 인코딩합니다.
- x264는 초고속에서 매우 느림/플라세보까지 품질 사전 설정을 제공하죠.
- 기본적으로 더 느리게 사전 설정을 할수록 CPU가 더 많은 작업을 합니다.
- 이는 더 느리게 사전 설정을 할수록 고품질 이미지 결과를 얻기 위해 CPU가 동영상을 인코딩하는 시간이 더 걸리기 때문이죠.
- (그래서 다른 작업에 할당할 수 있는 리소스가 더 적어짐)
- 더 빠르게 사전 설정을 하면 CPU가 리소스를 더 적게 사용하지만, 이미지의 품질이 낮아집니다.
해상도 및 프레임 속도
해상도 : 화면의 동영상 크기
프레임 속도 : Twitch로 보내는 애니메이션 프레임 빈도- 해상도가 높을수록 → 방송의 이미지가 더 뚜렷, 선명
- FPS가 높을수록 → 프레임 데이터를 더 자주 Twitch로 보내기 때문에 더 부드러워짐
- 하지만, 적절한 비트 전송률을 고려하지 않고 해상도와 프레임 속도를 높이면 이미지가 블록화 or 흐릿해질 수 있다.
비트레이트
비트 전송률 : 방송할 때 Twitch에 보내는 데이터양
권장 비트 전송률 : 대역폭을 낭비하지 않고 동영상 품질을 최적화하기 위해 테스트된 설정- 비트 전송률이 높을수록 이용 가능한 인터넷 대역폭을 더 많이 차지
- 선택한 해상도와 프레임 속도 설정에 비해 비트 전송률이 너무 낮으면 이미지 품질이 저하 될 수 있다.
- 반대로 비트 전송률이 너무 높으면 버퍼링이 발생하거나 시청자의 프레임이 떨어지는 문제가 생길 수 있으며, 자체 대역폭에도 문제가 발생할 수 있습니다.
CBR 대 VBR
VBR(가변 비트 전송률)
CBR(고정 비트 전송률)
Twitch에서는 모든 브로드캐스터에게 CBR을 사용할 것을 권장하는데,
그 이유는 시청자의 최종 서비스 품질(QoS)과 관련이 있습니다.
가변 비트 전송률은 TCP(대부분의 방송 동영상이 사용하는 인터넷 프로토콜) 작동 방식 때문에 인터넷의 동영상에 적합하지 않고,
가능한 CBR을 사용하는 게 좋습니다.- VBR의 가장 큰 문제
- 게임을 일시 중지했거나 영웅을 선택하는 화면 등 작업이 소강 상태인 동안에 VBR 방송의 비트 전송률이 크게 떨어짐
- 이로 인해, 작업(팀 전투, 움직임이 많은 장면) 중에 비트 전송률이 급증하면
- 많은 최종 유저 연결에 문제(방송 버퍼링, 떨어지는 프레임)가 발생 가능
- 또한, VBR은 많은 ISP를 통해 Twitch 네트워크에 데이터를 보내면 문제될 수 있음
- Twitch에 연결할 때 ISP가 사용하는 경로가 불안정해 갑작스러운 대역폭의 증가를 처리할 수 없어 "방송 기아 상태"가 발생할 수 있다
- 방송 기아 상태(불안정): 동영상 데이터가 적시에 도착하지 않거나 완전히 누락된 상태
- 이는 나와 Twitch 사이에 네트워크 문제가 있거나,
- 네트워크/ISP에 비해 비트 전송률이 너무 높을 때 방송을 시도하거나,
- 라우터에 문제가 있어 Twitch 네트워크에 들어가기 전에 프레임이 떨어지는 경우에 발생
- 이로 인해 모두에게(낮은 해상도로 시청하는 사람 포함) 렉이 생기거나, 버퍼링이 있거나, 방송이 끊기게됨
Adaptive Bitrate (ABR)
비트레이트를 계산해 영상 품질 전환을 자동으로
- MPEG-DASH
- MPEG-DASH ➡️ dash.js ➡️ MSE ➡️ fox, Safari, Chrome 등등
- HTTP Live Streaming (HLS)
- HLS ➡️ hls.js ➡️ MSE ➡️ fox, Safari, Chrome 등등
- HLS ➡️ Native ➡️ fox, Safari, Chrome 등등
Video Playback with Adaptive Streaming (https://support.jwplayer.com/articles/adaptive-streaming-reference)
MPEG-DASH
기본적인 원리는 HLS와 같다.
- 미디어 컨테이너 포맷 : 제한 없음
- 매니페스트 파일 : MPD (XML)
📌 네이티브로 DASH 지원하는 브라우저가 아직 없음 ➡️ 해결 : MSE(Media Source Extension)
- MSE에서는 세그먼트를 두 종류로 나눔
- 헤더 정보를 갖는 초기화 세그먼트
- 미디어의 본 내용을 갖는 미디어 세그먼트
1. 최초 초기화 세그먼트를 불러와 헤더 정보 설정 2. 이후에 미디어 세그먼트를 차례로 불러와 소스 버퍼에 전달
[참고] Can I use...
https://caniuse.com/
Green = Supported
Red = Not supportedMPEG-DASH
HLS
회사별 사용 프로토콜
- 아프리카 TV : RTMP(Real Time Messaging Protocol) + HLS
- 네이버 TV, V LIVE : HLS, DASH
- 트위치 : HLS (before : RTMP)
- 유튜브 : MPEG-DASH
- Netflix : MPEG-DASH
- 토라테레비 : HLS
- AbemaTV : HLS + DASH
- HLS.js