안녕하세요 Ruel입니다.
이전 프로젝트 진행 시 영상 재생을 하는 서비스를 개발하는데
무려 앱 사용시 데이터 사용량이 유튜브이 3~5배....

머선 일이고 이게....
그래서 분명 다른 방법이 있을 것이다 하면서 알아보게 된
HLS
시작해 봅시다
HLS란 무엇일까?
HLS(HTTP Live Streaming)는 Apple이 개발한 스트리밍 프로토콜로, 인터넷을 통해 비디오와 오디오 콘텐츠를 실시간으로 전송하는 방식이에요.
주로 iOS와 macOS 환경에서 많이 사용되고, 네트워크 상태에 따라 비디오 품질을 동적으로 조정할 수 있는 적응형 스트리밍을 제공합니다.
간단히 말해, HLS는 인터넷 속도가 느려도 영상이 끊기지 않도록 도와주는 기술입니다.

넘나 좋은 거 끊김 없는 스트리밍이라니!
HLS 작동 원리
1. 콘텐츠 준비:
- 원본 비디오를 작은 조각(세그먼트)으로 분할해요. 보통 2초에서 10초 정도로 나눠요.
이건 마치 피자를 한 입 크기로 잘라서 나눠주는 것과 같아요. - 각각의 세그먼트를 서로 다른 비트레이트로 인코딩해요.
이렇게 하면 네트워크 상태에 맞춰 최적의 품질을 제공할 수 있어요.
2. 플레이리스트 생성:
- 세그먼트의 URL을 포함한 M3U8 파일을 생성해요.
이 파일은 각 세그먼트의 위치와 비트레이트 정보를 담고 있어요.
마치 우리가 가야 할 길을 표시해 주는 지도 같은 거죠. - 마스터 플레이리스트는 여러 미디어 플레이리스트를 참조하여, 클라이언트가 네트워크 상태에 따라 적절한 비트레이트의 스트림을 선택할 수 있게 해 줘요.
3. 전송 및 재생:
- 클라이언트는 마스터 플레이리스트를 요청하고, 네트워크 상태에 따라 적절한 비트레이트의 미디어 플레이리스트를 선택합니다.
- 이후 클라이언트는 미디어 플레이리스트에 명시된 세그먼트를 순차적으로 다운로드하고 재생합니다.
마치 내가 좋아하는 드라마를 한 편씩 다운로드하여서 보는 것과 같아요!
HLS의 구성 요소
- 미디어 파일: 분할된 비디오 세그먼트 파일이에요. 보통 MPEG-TS 형식을 사용하죠.
- 플레이리스트 파일(M3U8): 세그먼트 파일의 URL을 포함한 텍스트 파일입니다.
- 마스터 플레이리스트: 여러 미디어 플레이리스트를 참조하는 최상위 플레이리스트입니다.
- 미디어 플레이리스트: 특정 비트레이트의 세그먼트 파일을 나열한 플레이리스트입니다.
- HLS 서버: 플레이리스트와 미디어 파일을 호스팅 하는 서버입니다.
HLS의 장점
- 적응형 스트리밍: 네트워크 상태에 따라 자동으로 비트레이트를 조절하여 최적의 스트리밍 품질을 유지해요.
- HTTP 기반 전송: HLS는 표준 HTTP를 사용하여 콘텐츠를 전송하므로, 방화벽이나 프록시를 쉽게 통과할 수 있어요.
- 광범위한 호환성: 다양한 기기와 플랫폼에서 지원되며, 특히 iOS와 macOS에서 최적화되어 있어요.
- 확장성: CDN(Content Delivery Network)을 활용하여 전 세계적으로 안정적인 서비스를 제공할 수 있어요.
- 보안: HTTPS를 통한 안전한 전송과 DRM(Digital Rights Management) 기술을 통한 콘텐츠 보호가 가능해요.
HLS의 단점
- 지연 시간: 세그먼트 전송 특성상 다른 스트리밍 프로토콜에 비해 지연 시간이 길어질 수 있어요. 보통 10초에서 30초 정도의 지연이 발생할 수 있다고 합니다. 친구랑 라이브로 같이 보는데 내가 10초나 뒤쳐진다면? 조금 답답할 수 있겠죠?
- 비교적 높은 복잡도: 다중 비트레이트 인코딩과 세그먼트 분할 등의 추가적인 준비 작업이 필요해요.
- 플레이어 호환성: 일부 오래된 브라우저나 비지원 디바이스에서는 HLS 재생이 어려울 수 있어요.
HLS 활용 사례
- 라이브 스트리밍: 실시간 이벤트, 스포츠 경기, 뉴스 방송 등에서 사용됩니다. HLS의 적응형 스트리밍 덕분에 네트워크 상태에 맞춰 끊김 없는 재생이 가능해요.
- VOD(주문형 비디오): 영화, 드라마, 교육 콘텐츠 등에서 사용됩니다.
- 교육 및 회의: 온라인 강의, 화상 회의 등에서도 HLS를 사용하여 안정적인 스트리밍 서비스를 제공해요.
- 게임 스트리밍: 게임 플레이를 실시간으로 스트리밍 하는 서비스에서도 HLS가 널리 사용됩니다.
HLS와 다른 스트리밍 프로토콜 비교
- HLS vs. RTMP:
- HLS: HTTP 기반으로 방화벽 통과가 용이하며, 적응형 스트리밍을 지원합니다. 다만, 지연 시간이 길 수 있어요.
- RTMP: 낮은 지연 시간을 제공하지만, RTMP 전용 서버가 필요하며, 방화벽을 통과하기 어려울 수 있어요.
- HLS vs. DASH:
- HLS: Apple 기기에서 최적화되어 있고, HTTP 기반 전송을 사용합니다.
- DASH: HLS와 유사한 적응형 스트리밍 프로토콜로, 다양한 기기와 플랫폼에서 지원되며, HLS에 비해 표준화가 더 잘 되어 있어요.
HLS 구현 방법
- 비디오 인코딩:
- 원본 비디오를 여러 비트레이트로 인코딩합니다. FFmpeg와 같은 도구를 사용할 수 있어요.
ffmpeg -i input.mp4 -codec: copy -start_number 0 -hls_time 10 -hls_list_size 0 -f hls index.m3u8
- 세그먼트 분할:
- 인코딩 된 비디오를 일정한 길이의 세그먼트로 분할합니다.
위 명령어에서 hls_time 옵션을 사용하여 세그먼트 길이를 지정할 수 있어요.
- 인코딩 된 비디오를 일정한 길이의 세그먼트로 분할합니다.
- 플레이리스트 생성:
- 세그먼트 파일의 URL을 포함한 M3U8 파일을 생성합니다. FFmpeg를 사용하면 자동으로 생성할 수 있어요.
- 서버 설정:
- 웹 서버에 플레이리스트와 세그먼트 파일을 호스팅 합니다. Apache나 Nginx 같은 웹 서버를 사용할 수 있어요.
- 클라이언트 재생:
- HLS 플레이어를 사용하여 스트리밍 콘텐츠를 재생합니다. HTML5 비디오 태그를 사용하거나, HLS.js 같은 라이브러리를 활용할 수 있어요.
<video controls>
<source src="index.m3u8" type="application/vnd.apple.mpegurl">
</video>
HLS 관련 도구 및 라이브러리
- FFmpeg: 비디오 인코딩 및 세그먼트 분할 도구로, HLS 스트리밍 준비에 널리 사용돼요.
- HLS.js: JavaScript 기반 HLS 클라이언트 라이브러리로, HTML5 환경에서 HLS 스트림을 재생할 수 있어요.
- Video.js: HTML5 비디오 플레이어로, HLS.js 플러그인을 통해 HLS 스트리밍을 지원해요.
- Wowza Streaming Engine: 전문적인 스트리밍 서버 솔루션으로, HLS를 포함한 다양한 스트리밍 프로토콜을 지원해요.
- Nginx with RTMP module: Nginx 웹 서버에 RTMP 모듈을 추가하여 HLS 스트리밍을 지원할 수 있어요.
이렇게 HLS에 대해 알아보았습니다.
프로젝트에서 데이터 사용량 문제(유튜브보다 데이터 사용량이 약 3~5배가량 많이 나오는 문제)를 해결하기 위해 HLS 방식을 고려하게 되었습니다.
전체적인 내용을 모두 알 수는 없었지만, 적응형 스트리밍의 장점이 저희 프로젝트에 적합하다는 판단이 들었어요.
이를 기반으로 서버팀과 적용에 대해 논의가 필요할 것 같습니다.
읽어주셔서 감사합니다!
잘못된 부분 혹은 새롭게 알려주실 부분 있으시면 언제든지 댓글 남겨주세요.💬
감사합니다. 🙇🏻♂️
그럼 다음에 또 만나요! 😊
'iOS > 공부' 카테고리의 다른 글
Library && Framework (0) | 2024.08.09 |
---|