«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

VIDEOCUBE

HLS ( Http Live Streaming ) 분석하기 본문

분석

HLS ( Http Live Streaming ) 분석하기

라떼청년 2017. 12. 12. 22:16

HLS (Http Live Streaming ) 는 Apple 이 만들었다고 한다.

이는 Http 를 이용한 라이브 스트리밍 기술로서 HLS 이전에 RTSP/ RTP  등을 사용하던 라이브 스트리밍 기술은 서로 다른 네트워크를 이용하는 해당 기술들은 

도입비용에 상대적으로 많이 소모가 되는 단점에 비해 Http 를 이용한다는 점에서 도입비용 면에서나 접근성에서 상당한 장점을 가지고 있다

특히 캐시 CDN (Content Delivery Network) 서비스도 특별한 구조를 구성할 필요없이 단순 웹서비스로서 구현이 가능하다


iOS 3.0, Quick Time X 를 위해 2009년에 내놓은 구조로 MPEG-2 TS 를 세그먼팅 하여 M3U8에 해당 데이터의 인덱스를 표기 플레이어는 이를 분석하고

재생하기에 이른다.


표준화 작업을 통해 HLS 를 다른 업체들도 구현하게 되었으며, Google, MS 등도 이를 구현한 플레이어를 탑재하게 되었다.


m3u8 의 포맷

단순한 TEXT 파일로서 Latin-1 문자 집합만 적을 수 있으며, 라인별로 그 의미를 가진 지시자를 통하여 정보를 획득하게 된다.


#EXTM3U  

ㄴ 파일의 가장 첫줄에 m3u8포맷임을 명시한다.


#EXTINF: 재생시간:초, 제목

ㄴ 콘텐츠의 재생시간과 제목을 명시한다.


#EXT-X-TARGETDURATION:초 

ㄴ 파일 목록에 나열된 파일들의 최대 재생시간을 명시


#EXT-X-ENDLIST    

ㄴ플레이 리스트에서 재생할 컨텐츠가 더이상 없음을 명시한다. ( 이후의 컨텐츠는 무시함 ) 라이브는 해당 지시어가 없음


#EXT-X-DISCONTINUITY 

ㄴ명시된 Line 이후의 줄과 이전의 콘텐츠 정보가 변경되었음을 표시한다

ㄴ미디어 트랙, 파일포맷, 미디어 트랙 개수, 인코딩 정보, 재생 시간 등 변경 시에 명시하게 된다.


#EXT-X-MEDIA_SEQUENCE 

ㄴ미디어 시퀀스 정보 ( 파일의 일련번호를 명시 한다 )


#EXT-X-KEY: 암호화, key 

ㄴ암호화된 컨텐츠를 전송할 때 암호화 방식을 지정하고 복호화 가능한 key를 알려준다.

ㄴ인증을 별도르 받지 않은 상태에서 키까지 넘겨준다.. ( m3u8 파일과 ts 만 있으면 재생은 가능한데... )


#EXT-X-STREAM-INF

ㄴBandwidth, Program-id, codec 정보, Resolution 해상도


우선 다음 Javascript 로 된 hls.js 를 찾아보았다.

https://github.com/video-dev/hls.js/


Supported M3U8 tags


위에서 설명한 내용 외에 많은 지시어들을 확인 할 수 있었다.

--------

지금 진행 중인 Cube Project 에 m3u8 파일을 리턴해 보도록 수정해 보았다.

ㄴ http://videocube.tistory.com/entry/Cube-Media-Streaming-Server

https://github.com/pluto90k/cube 


location ~ \.(mp4|json|m3u8|ts)$ {

     rewrite ^/(.*) /cgi-bin/cube.py?file=$1 break;

     proxy_pass http://127.0.0.1:8000;

 }



다음과 같이 cube.py 수정


#HLS (Http Live Streaming)

def _hls(name, filename):

    print "Content-type:application/vnd.apple.mpegurl\r\n"

    print "#EXTM3U\r\n"

    print "#EXT-X-TARGETDURATION:10\r\n"


    for i in range(0, 10):

        print "#EXTINF:11,\n"

        print "%s-%d.ts\n" % ( name, i )


    print "#EXT-X-ENDLIST\r\n"



HLS 를 지원하는 사파리 브라우져에서 video tag 안에 m3u8 을 넣어 호출해 보았다.





root@linux-01:/data/cube> python -m CGIHTTPServer 8000 .

Serving HTTP on 0.0.0.0 port 8000 ...

localhost.localdomain - - [12/Dec/2017 22:55:46] "GET /cgi-bin/cube.py?file=BigBuckBunny.m3u8 HTTP/1.0" 200 -

localhost.localdomain - - [12/Dec/2017 22:55:46] "GET /cgi-bin/cube.py?file=BigBuckBunny-0.ts HTTP/1.0" 200 -

localhost.localdomain - - [12/Dec/2017 22:55:46] "GET /cgi-bin/cube.py?file=BigBuckBunny-1.ts HTTP/1.0" 200 -

localhost.localdomain - - [12/Dec/2017 22:55:46] "GET /cgi-bin/cube.py?file=BigBuckBunny-2.ts HTTP/1.0" 200 -

localhost.localdomain - - [12/Dec/2017 22:55:46] "GET /cgi-bin/cube.py?file=BigBuckBunny-3.ts HTTP/1.0" 200 -

localhost.localdomain - - [12/Dec/2017 22:55:47] "GET /cgi-bin/cube.py?file=BigBuckBunny-4.ts HTTP/1.0" 200 -

localhost.localdomain - - [12/Dec/2017 22:55:47] "GET /cgi-bin/cube.py?file=BigBuckBunny-5.ts HTTP/1.0" 200 -

localhost.localdomain - - [12/Dec/2017 22:55:47] "GET /cgi-bin/cube.py?file=BigBuckBunny-6.ts HTTP/1.0" 200 -

localhost.localdomain - - [12/Dec/2017 22:55:47] "GET /cgi-bin/cube.py?file=BigBuckBunny-7.ts HTTP/1.0" 200 -

localhost.localdomain - - [12/Dec/2017 22:55:47] "GET /cgi-bin/cube.py?file=BigBuckBunny-8.ts HTTP/1.0" 200 -localhost.localdomain - - [12/Dec/2017 22:55:47] "GET /cgi-bin/cube.py?file=BigBuckBunny-9.ts HTTP/1.0" 200 -


cube.py 파일에서 hls 를 리턴해 주고 플레이어에서는 해당 m3u8  파일을 인식하고 ts 파일을 요청하게 된다.

현재 mp4 파일을 세그먼팅 하여  ts 파일을 리턴해 주면 플레이 서버를 구현 할 수 있다.


mp4 > ts 를 변환시켜 주려면, ts 를 분석해 보자..









반응형
Comments