VIDEOCUBE
HLS ( Http Live Streaming ) 분석하기 본문
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
#EXTM3U
#EXTINF
#EXT-X-STREAM-INF
(adaptive streaming)#EXT-X-ENDLIST
(Live playlist)#EXT-X-MEDIA-SEQUENCE
#EXT-X-TARGETDURATION
#EXT-X-DISCONTINUITY
#EXT-X-DISCONTINUITY-SEQUENCE
#EXT-X-BYTERANGE
#EXT-X-MAP
#EXT-X-KEY
(https://tools.ietf.org/html/draft-pantos-http-live-streaming-08#section-3.4.4)#EXT-X-PROGRAM-DATE-TIME
(https://tools.ietf.org/html/draft-pantos-http-live-streaming-18#section-4.3.2.6)EXT-X-START:TIME-OFFSET=x
(https://tools.ietf.org/html/draft-pantos-http-live-streaming-18#section-4.3.5.2)
위에서 설명한 내용 외에 많은 지시어들을 확인 할 수 있었다.
--------
지금 진행 중인 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 를 분석해 보자..
'분석' 카테고리의 다른 글
OBS Studio 분석 (1) - 준비 (1) | 2021.02.21 |
---|---|
[MPEG TS] 구조 분석 (0) | 2018.01.02 |
[MP4] 파일 미디어 샘플과 시간 정보를 구하는 방법 (0) | 2017.11.29 |
[MP4] 분석 하기 | MPEG-4 파트 14 | MP4Box 설치 (5) | 2017.11.26 |
네트워크명령어 [ ping ] 분석 (0) | 2017.11.23 |