이번 세미프로젝트의 주제가 Netflix 같은 스트리밍 서비스를 아주 간략히 해서 온프레미스 환경으로 인프라를 구축해보자 는 주제이다.

단순히 영상을 한 번에 보낼 수는 없고 잘게 나눠 보내야 된다는 걸 알았다.

하나의 파일을 나누는 것이 트랜스코딩 서버/HTTP로 나눈 조각들을 보내 주는게 스트리밍서버이다.

스트리밍의 개념과 스트리밍 서버에 대해 공부해 봐야겠다.

목차

  • 스트리밍
  • HSL
  • 스트리밍 서버
  • 정리
  • 마무리

스트리밍, 스트리밍 서버

스트리밍(Streaming) 은 영상이나 음성 파일을 전체 다운로드가 끝나기 전에,
데이터 일부를 받아 즉시 재생할 수 있도록 하는 기술이다.

 

이 기술은 보내려는 용량이 커질 수록 유리한 기술인데 최신 영상 자료들은 1080p를 넘어서

4K 8K 등의 해상도를 넘어서 매우 효율적이다.

 

 


왜 조각을 보내야할까

영상 파일은 일반적으로 크기가 매우 크다. (수백 MB ~ 수 GB)

전체 파일을 한번에 전송하면 다음과 같은 문제가 발생한다.

  • 사용자의 인터넷 속도에 따라 초기 대기 시간이 매우 길어진다.
  • 네트워크 전송 중 오류가 발생하면 전체 파일을 다시 받아야 한다.
  • 모바일 등 네트워크가 불안정한 환경에서는 안정적인 서비스가 어렵다.

이를 해결하기 위해 영상 파일을 수 초 단위로 조각 내어 전송하고,
브라우저나 플레이어가 이를 순차적으로 재생하는 방식을 사용한다.

대표적인 방식이 HLS(HTTP Live Streaming) 이다.

 

여기서 HLS 구조란

HLS 구조

HLS는 다음과 같이 동작한다.

  1. 전체 영상 파일을 2~10초 단위로 자른 ts 파일들을 만든다.
  2. 이 조각 파일 목록을 담은 m3u8 파일(플레이리스트)을 생성한다.
  3. 사용자가 스트리밍을 시작하면
    • 먼저 .m3u8 파일을 요청한다.
    • 이후 .ts 조각 파일들을 하나씩 요청하여 순차 재생한다.

 


 

스트리밍 서버

스트리밍 서버는 위와 같은 m3u8 + ts 조각 파일을 HTTP를 통해
클라이언트(웹 브라우저, 모바일 앱 등)에 제공하는 서버이다.

이번 프로젝트에서는 Nginx를 스트리밍 서버로 활용한다.

(파일을 나누는 도구로 ffmpeg을 사용할 것이다.)

 

Nginx 스트리밍 서버 구성 방법

  • 별도의 웹 프레임워크(Vue, Spring 등) 없이,
  • Nginx가 정적으로 .m3u8, .ts 파일을 제공하는 구조로 구성한다.

그냥 Nginx 패키지를 설치하고 설정파일에서

파일의 경로와 MIME 타입을 명시하면 사용 가능하다.

 

여기서 Nginx는 이 작은 파일들을 HTTP 프로토콜에 담아 전송하다.

Vue를 통해 프론트를 만들었는데

<Video> 태그를 통해 바로 재생할 수 있다.

이미 브라우저에 HLS 가 포함되어 있는 것이다.

예시

server {
    listen 8082;
    server_name _;

    location / {
        root /mnt/nfs;  # NFS로 마운트한 경로
        types {
            application/vnd.apple.mpegurl m3u8;
            video/mp2t ts;
        }
        autoindex on;
    }
}

 

정리

스트리밍: 영상을 조각내어 실시간으로 전송하고 재생하는 기술

스트리밍 서버: 조각 파일(ts)과 플레이리스트(m3u8)를 HTTP로 제공하는 역할

nginx로 구성

파일 저장하고 있는 위치와 MIME 명시해주기만 하면 NGINX가 서빙

 

 

마무리

짧은 프로젝트에서 스트리밍 서비스를 만들려니까 내부에 알아야할 프레임워크나 기술들이 엄청 많았다.

3주 정도 배운 온프레미스 인프라 구축이 주제였던 짧은 프로젝트에서 건들면 안되는 것이었는데

너무 쉽게 생각했다. 그래도 거의 없으면 못 사는 넷플릭스, 유튜브 같은 서비스가 어떻게 동작하는지에 대한

얄팍한 지식은 얻을 수 있었다.

 

아직 프로젝트가 끝나진 않았지만 처음 목표했던 영상 하나 재생할 수 있게하기를 할 수 있게 노력해봐야겠다.

 

추가적으로 파일을 나누주는 기술인 ffmpeg 에 대해서도 더 알아보고 그걸 해주는 트랜스코딩 서버에 대해서도 공부해야겠다.

jpeg의 경우는 4학년 때 과목으로 배웠는데 그 때는 하나의 이미지에 대해서여서 배우기 어렵지 않았는데 동영상은 조금은 더 어려울 것 같다.

 

ps. 가산디지털단지 쪽에서 지내고 있는데 업계 선배들을 학원 오고가면서 자주 본다. 

또 강의장이 혜화쪽이라 성균관대생 분들과 동선이 겹칠 때가 많다.

한참 놀고 싶을 때 열심히 공부하고 있는 학생들을 보니 열심히 임하지 못한 대학생활이 후회된다.

마지막 기회라고 생각하고 지금이라도 열심히 해 나도 빨리 자리잡고 내 커리어를 만들어 갈 수 있었으면 좋겠다.

+ Recent posts