1. HLS
- HTTP Live Streaming, 비디오 파일을 다운로드할 수 있는 HTTP 파일 조각으로 나누고 HTTP프로토콜을 이용하여 전송. 클라이언트 장치는 이러한 HTTP 파일을 로드한 후 비디오로 재생
- 장점
- 모든 인터넷 연결 장치가 HTTP를 지원하기 때문에 전용 서버가 필요한 스트리밍 프로토콜보다 간단하게 실행.
- HLS 스트리밍은 재생에 지장을 주지 않고 네트워크 상태에 따라 비디오 품질을 높이거나 낮출 수 있다는 것, 이 때문에 사용자가 비디오를 보는 중에 품질이 나빠지거나 좋아질 수 있음
- 스트리밍 ?
- 파일을 한번에 보내는 대신에 여러번 나누어 사용자에게 전송, 따라서 사용자의 장치가 먼저 모든 파일을 다운로드하지 않고 비디오를 재생
2. HLS 동작원리
- 세그먼트 분할
- 미디어파일 (비디오 등)은 6초정도의 짧은 시간으로 분할, 각 세그먼트는 독립적인 파일로 저장되며 클라이언트는 이를 순차적으로 재생,
- 네트워크 상황에 따라 필요한 부분만 빠르게 요청할 수 있어, 버퍼링 현상을 줄일 수 있음.
- 세그먼트가 너무 길면 네트워크 변화에 대한 반응이 늦어지고, 너무 짧으면 HTTP 요청 오버헤드가 증가하는 문제점이 있다. 따라서 적절한 세그먼트 길이를 선택하는 것이 중요
- 플레이리스트 파일 (M3U8 파일)
- 세그먼트들의 목록은 텍스트 기반의 M3U8 플레이리스트 파일에 기록된다.
- 이 파일에는 각 세그먼트의 URL, 길이(#EXTINF 태그 등)와 같은 메타데이터가 포함되어 있으며, 클라이언트는 이 정보를 바탕으로 필요한 세그먼트를 순차적으로 요청
- 적응형 비트레이트 스트리밍 (Adaptive Bitrate Streaming, ABR)
- 동일한 콘텐츠를 여러 품질(비트레이트)로 인코딩하여 제공하며, 서버는 각 품질별로 별도의 플레이리스트(variant playlist)를 생성
- 네트워크 상태나 디바이스 성능에 따라 최적의 품질을 선택하여 해당 세그먼트를 다운로드.
- 네트워크 상태가 변화해도 실시간으로 품질을 조정하여 원활한 스트리밍 환경을 제공합니다.
3. HTTP 기반의 장점
- HLS는 HTTP를 기반으로 하므로, 기존의 웹 서버, CDN(콘텐츠 전송 네트워크) 및 캐싱 시스템과 쉽게 통합
- HTTP 프로토콜은 대부분의 네트워크 환경에서 허용되기 때문에, HLS 스트리밍은 방화벽이나 프록시 환경에서도 문제없이 작동.
4. M3U8
- M3U8 파일은 HTTP Live Streaming(HLS) 프로토콜에서 사용되는 텍스트 기반의 플레이리스트 파일로, 미디어 스트리밍에 필요한 세그먼트(짧은 비디오 또는 오디오 조각)들의 목록과 재생 정보를 정의하는 역할
- M3U 파일의 UTF-8 인코딩 버전으로, 국제 문자 지원이 강화되어 있으며 주로 HLS 스트리밍에서 사용.
- M3U8 파일은 미디어 콘텐츠(비디오/오디오)를 여러 개의 작은 세그먼트로 나누어 관리하고, 클라이언트(플레이어)가 이 세그먼트를 순차적으로 다운로드 및 재생할 수 있도록 “로드맵” 역할
- 텍스트 기반이기 때문에 가볍다.,
- UTF-8 인코딩으로 다양한 언어와 문자 지원이 가능하며,
- HTTP 전송의 장점을 활용하여 기존 인프라와 손쉽게 통합
5. M3U8 플레이 리스트 종류
- 마스터 플레이리스트 (Master Playlist)
- 여러 개의 미디어 플레이리스트(variant playlist)를 포함하여, 다양한 해상도나 비트레이트로 인코딩된 스트림의 정보를 제공
- 클라이언트는 먼저 마스터 플레이리스트를 다운로드한 후, 자신의 네트워크 상태나 디바이스 성능에 맞춰 적절한 미디어 플레이리스트를 선택
- #EXT-X-STREAM-INF 태그를 사용하여 각 미디어 플레이리스트의 정보(예: 비트레이트, 해상도, URL 등)를 제공
- 미디어 플레이리스트 (Media Playlist)
- 실제 미디어 세그먼트 파일의 URL과 각 세그먼트의 재생 정보를 나열
- VOD(주문형 스트리밍): 고정된 플레이리스트로, 전체 콘텐츠에 대한 모든 세그먼트 정보가 포함
- 라이브 스트리밍: 플레이리스트가 주기적으로 갱신되어 새로운 세그먼트가 추가되고, 오래된 세그먼트가 제거될 수 있다.
6. M3U8 예제
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:10.0,
segment0.ts
#EXTINF:10.0,
segment1.ts
#EXTINF:10.0,
segment2.ts
#EXT-X-ENDLIST
- 설명:
- #EXTM3U: 파일이 확장 M3U임을 표시.
- #EXT-X-VERSION:3: HLS 버전 3을 사용함.
- #EXT-X-TARGETDURATION:10: 각 세그먼트의 최대 길이가 10초임을 명시.
- #EXT-X-MEDIA-SEQUENCE:0: 첫 번째 세그먼트의 번호가 0임을 의미.
- #EXTINF:10.0,: 각 세그먼트가 10초 동안 재생됨.
- segment0.ts, segment1.ts, segment2.ts: 재생할 미디어 세그먼트 파일들의 URL 또는 경로.
- #EXT-X-ENDLIST: 플레이리스트가 끝났음을 알림(즉, 추가적인 세그먼트가 없음).
적용 방법 예상
- HLS 스트리밍을 구현할 때 중요한 것은 클라이언트가 **M3U8 파일(플레이리스트)**와 그에 해당하는 세그먼트 파일들(예: .ts 파일) 을 받아서 재생
- 클라이언트는 원본 전체 동영상 파일이 아니라, 이미 세그먼트로 나뉘어 있고 그 목록이 포함된 M3U8 파일을 통해 스트리밍 콘텐츠를 재생
두가지의 방식을 사용할 수 있다고 가정,
1. 미리 인코딩 및 세그먼트화하여 업로드하는 방식
- 사전 처리:
동영상 파일을 업로드하기 전에, ffmpeg나 다른 인코딩 도구를 사용하여 동영상 파일을 HLS 형식으로 변환
이 과정에서 동영상은 여러 개의 짧은 세그먼트(예: .ts 파일)로 분할되고, 각 세그먼트를 재생할 순서를 정의하는 M3U8 파일이 생성 - 업로드:
이렇게 생성된 M3U8 파일과 세그먼트 파일들을 서버(또는 CDN)에 업로드. - 재생:
클라이언트(예: Expo의 Video 컴포넌트)는 M3U8 파일의 URL을 지정하여 접속하게 되며, 그 M3U8 파일에 명시된 세그먼트들을 순차적으로 다운로드하여 스트리밍 재생.
2. 서버 측에서 동영상 파일을 HLS로 변환하는 방식
- 업로드:
사용자가 원본 동영상 파일(전체 파일)을 업로드. - 서버 처리:
서버 측에서 별도의 인코딩/패키징 프로세스를 통해 업로드된 동영상 파일을 HLS 형식으로 변환.
이 과정에서 동영상은 자동으로 세그먼트로 분할되고, M3U8 플레이리스트 파일이 생성. - 재생:
변환된 HLS 스트림(세그먼트 파일과 M3U8 파일)을 클라이언트에 제공하면, 클라이언트는 M3U8 파일을 기반으로 세그먼트들을 순차적으로 받아 스트리밍.
'프로젝트 답지' 카테고리의 다른 글
React Native에서 대용량 동영상 업로드 최적화 (0) | 2025.03.07 |
---|---|
업로드 상황에 따른 Progress 구현 (0) | 2025.02.10 |
앱에서 앨범에 접근해 동영상 불러오는 시간 줄이는 방법 (0) | 2025.01.27 |
답지 영상 데이터 소모량 개선 (0) | 2025.01.03 |
앱스토어 승인 리젝 사유 모음집 => 승인 통과된 결과 (1) | 2024.12.13 |