RTMP HLS 트랜스코딩으로 실시간 스트리밍 모바일

by 행복아이 posted Oct 16, 2014
?

단축키

Prev이전 문서

Next다음 문서

ESC닫기

크게 작게 위로 아래로 댓글로 가기 인쇄

jwplayer가 rtmp를지원해서 mp4형식의 영상을 PC및 모바일에서 VOD서비스는 편하게 가능하다.

하지만 모바일에서는 html5로 보여주어야하는데 html5에서 작동을 하려면 http 프로토콜이어야한다.


jwplayer PC - flash 재생(RTMP), 모바일-html5재생(http)


따라서 실시간 방송을 전송하기 위해서는 http 프로토콜로 전송해주어야한다.


Nginx rtmp모듈과 hls지원모듈이 컴파일된 nginx 를 사용하면 기본적으로 가능하게 된다.


구성요소를 살펴보자.

1. nginx.exe (rtmp + hls모듈된것)

2. nginx.conf 구성

은 다음과 같다.

nginx.conf


그리고 마임타입 - 이전 게시물에 있다.

mime.types


nginx.conf

내용을 열어보면

일단 http 항목에서

 server {

        listen 8080;

        server_name one2.kr;


포트와 서버도메인(ip)을 설정해주고,


rtmp를 HLS로 트랜스코딩해서 받아줄 로케이션을 하나 둔다. hls


      location /hls {

      types {

       application/x-mpegURL m3u8;

          video/mp2t ts;

      }

      alias F:/tmp;

      add_header Cache-Control no-cache;

    }


그러므로 최종 http주소는 이렇게 될것이다.

http://one2.kr:8080/hls/스트림명.m3u8


VLC플레이어에서 해보면 재생이 잘된다.


alias는 FFMpeg로 트랜스코딩시 m3u8을 저장할 폴더위치이다.



두번째 , RTMP섹션을 보자.


server {

listen 1936;

chunk_size 8192;


기본 포트는 1935인데(http 80처럼), 1936으로 변경해두었다.



application live1 {

live on;

meta copy;


여기 기본 rtmp 라이브방송을 내보낼 애플리케이션을 하나 만들어준다.

중요한것은 live on; 옵션을 주면 라이브가 되는 것이다.



# You should send x.264/aac RTMP Stream via ffmpeg to this application

application hls {

       allow play all;

live on;

    hls on;

      hls_path F:/tmp;

    }




이렇게 두면 FFMpeg로 스트리밍 트랜스코딩시 분할된 .ts파일을 F:\tmp폴더에 저장하게 된다. 

여기서 만약 F:/tmp/hls 식으로 Path를 주면


스트림의 경로는

http://one2.kr:8080/hls/hls/스트림명.m3u8 

이 된다. 잘 기억하고 혼동되지 않게 하자. 실제 m3u8이 저장되는 경로가 저 아래가 되기때문이다. 위 Alias를 잘보라.


3. Open Broadcasting Software (OBS)

여기서 실시간으로 내보낼 소스를 정하여 내보내기를 할 수 있다. 기능은 아주 많다.

캠코더나 PC화면이나, PC응용프로그램(게임, 웹게임,영상플레이어등의 소스들)도 그대로 전해줄수 있고

화면을 분할하여 캠영상과, PPT영상등 두가지를 동시에 내보내기 할 수 도있다.

자세한 설정은 다음에 하기로 하고,


여기에 설정항목에서 custom으로 사용자 주소를 작성해준다.


개념을 다시 설명하면 OBS는 인코더이며 rtmp실시간 서버는 nginx가 구동되고 있는 곳인 것이다.

obs21.jpg


위와 같이 rtmp주소를 적어준다.

그리고 하위 스트림을 적어준다. knubs로 적어주었다.

적어주면 암호화되어 표시됨


이해가 되는지 모르겠다.


이렇게 해서 방송시작을 눌러주면,


nginx서버로 데이타가 전송된다. 그래서 주소를 정리하면


obs --> rtmp://one2.kr:1936/live1/knubs 가된다.


자 이제 이 소스를 http로 바꾸어주기 위해서 FFMpeg를 사용한다.


4.FFMpeg 스트리밍

FFMpeg를 구해서 다음과 같이 CMD에서 실행해보자.


대략 찾아본 옵션들중에 제대로 되는 것은 다음과 같다. 공부를 더 해봐야하겠다.

ffmpeg -i rtmp://one2.kr:1936/live1/knubs -vcodec libx264 -preset veryfast -b:v 2000k -maxrate 2000k -bufsize 2000k -s 1280x720 -sws_flags lanczos -r 60 -acodec copy -f flv rtmp://one2.kr:1936/hls/knubs



보듯이 보라색이 기본 rtmp실시간소스이고, 빨간색이 hls서비스를 위해 트랜스될 주소이다.


ffmpeg.jpg


오류가 생기지 않고 위와 같은 화면이 나온다면 정상적으로 되는 셈이다.


즉 OBS에서 데이타를 받아서 nginx에서 hls로 트랜스코딩해주는 것이다.


주소정리를 다시 하면,


RTMP://one2.kr:1936/live1/knubs


RTMP://one2.kr:1936/hls/knubs


두개는 같은 소스인것이고 복제본인것이다. 


그리고 http://one2.kr:8080/hls/knubs.m3u8


이또한 같은 소스인것이다. nginx.conf내용을 다시 보라.


이렇게 해서 모바일에서도 실시간을 볼 수 있도록 Http Live Streaming , 즉 HLS스트리밍 m3u8을 생성하게 되었다.


VLC플레이어가 있다면 네트워크 스트림을 열어서 

http://one2.kr:8080/hls/knubs.m3u8 을 열어보면 실시간 방송이 보이게 된다.


이렇게 설정하니 30초 정도가 딜레이되는것 같다.


rtmp로 보면 4초 정도 딜레이..


왜이렇게 딜레이가 생기는지 모르겠다..

FFMpeg의 옵션을 조절해보아야 할 것 같다.


어쨌든 이렇게 해서 

MediaElement 나 videojs 나 Jwplayer에서 소스로 지정할 수 있으니 이것은 Player 게시판을 참조하라.