알쓸전컴(알아두면 쓸모있는 전자 컴퓨터)

HLS를 위한 m3u8 메타 파일 만들기[ffmpeg 사용] 본문

멀티미디어/HTTP Live Streaming

HLS를 위한 m3u8 메타 파일 만들기[ffmpeg 사용]

백곳 2017. 9. 30. 16:18

HLS를 위한 m3u8 메타 파일 만들기[ffmpeg] 사용


먼저 

https://ffmpeg.org/download.html


m3u8 메타 파일을 만들수 있는 ffmpeg 프로그램을 다운 받아야 합니다. 



이미 빌드가 되어 바로 사용할수 있는 프로그램으로 다운 받겠습니다. 


다운을 받고 나면 


ffmpeg-3.3.3-win64-static\bin 에 들어가면 



위와 같은 파일이 있습니다. 


여기서 저희가 사용할것은 


ffmpeg.exe 파일입니다. 


제가 사용할 파일은 샘플 비디오 파일은 


samplevideo.mkv


입니다. 


윈도우 CMD 커맨더로 ffmpeg 가 있는 폴더로 들어 갑니다. 


그리고 명령어로 


D:\ffmpeg-3.3.3-win64-static\bin>ffmpeg.exe -i D:\samplevideo.mkv -profile:v baseline -level 3.0 -s 640x360 -start_number 0 -hls_time

 10 -hls_list_size 0 -f hls index.m3u8



진행중인 화면 



결과로 


index.m3u8


#EXTM3U

#EXT-X-VERSION:3

#EXT-X-TARGETDURATION:11

#EXT-X-MEDIA-SEQUENCE:0

#EXTINF:10.006333,

index0.ts

#EXTINF:10.000000,

index1.ts

#EXTINF:10.178000,

index2.ts

#EXTINF:3.334000,

index3.ts

#EXT-X-ENDLIST


로 이전에 설명했던 강의(http://idlecomputer.tistory.com/93)에서 나온 내용들이 적혀 나옵니다. 

그리고 다음 팟플레이어로 m3u8 파일을 재생하면 재상이 됩니다. 

m3u8 메타 데이터 명령어
지시어형식역할
#EXTM3U#EXTM3U파일의 가장 첫 줄에 명시하여 파일이 m3u8 포맷임을 명시한다.
#EXTINF#EXTINF: <재생 시간:초>,<제목>이 지시어의 다음에 명시된 콘텐츠의 재생 시간과 제목을 명시한다.
#EXT-X-TARGETDURATION#EXT-X-TARGETDURATION: <시간: 초>파일 목록에 나열된 각 파일의 최대 재생 시간을 명시한다.
#EXT-X-ENDLIST#EXT-X-ENDLIST플레이 리스트에서 재생할 콘텐츠가 더 이상 없음을 의미한다. 이 지시어가 표시된 줄 이후의 콘텐츠는 무시한다.
#EXT-X-DISCONTINUITY#EXT-X-DISCONTINUITY이 지시어가 표지된 줄을 기준으로 이전 줄과 이후 줄에서 재생하는 콘텐츠의 정보가 변경되었음을 표시한다. 예를 들어 이전 콘텐츠와 이후 콘텐츠의 파일 포맷, 파일이 갖고 있는 미디어 트랙의 개수, 인코딩 정보, 재생 시간 정보 등이 변경되면 이 지시어를 플레이리스트에서 정보가 바뀌는 파일 사이에 명시하여 플레이어가 새로운 정보를 사용해야 하는 시점을 알려 준다..
#EXT-X-MEDIA-SEQUENCE#EXT-X-MEDIA-SEQUENCE: <첫 파일의 일련번호>제일 먼저 플레이해야하는 파일의 일련번호를 명시한다. 예를 들어 그림 1의 경우와 같이 0,1,2의 파일이 있을 경우 이 지시어의 값은 0이 된다. 이 지시어가 포함되지 않은 경우 첫 분할 파일의 일련 번호는 0으로 간주한다.
#EXT-X-KEY#EXT-X-KEY: <암호화 방법>[, <key>]암호화된 파일을 해독하는 키 값을 명시한다. HTTP Live Streaming에서는 재생 시간에 따라 분할된 각 파일을 암호화하여 전송할 수 있다. 암호화된 파일을 해독할 때 필요한 키 값을 플레이어에게 알려 주기 위해 사용한다.
#EXT-X-STREAM-INF#EXT-X-STREAM-INF이 지시어 다음 줄의 콘텐츠에 대한 정보를 제공한다. #EXTINF는 재생 시간에 대한 정보만 제공하고, #EXT-X-STREAM-INF는 다음과 같은 정보를 제공한다.
  • BANDWIDTH: 10진수로 표시한 bps 값
  • PROGRAM-ID: 플레이 리스트 파일에 있는 콘텐츠가 갖는 고유 값
  • CODEC: 해당 콘텐츠에 적용된 코텍(codec) 정보
  • RESOLUTION: 해상도

이전에 설명 한적이 있습니다. 


하지만 이것으로 완료 된것은 아닙니다. 


HLS은 화질별로 m3u8 로 나누고 재생할때 1파일로 묶어 줘야 합니다. 


예를 들면 


지금 로컬로 파일을 바로 실행 하면 




재생목록이 생기고 1개의 파일로 합쳐지지 않고 재생중에 파일을 바꿀때 뚝뚝 끈기기도 합니다. 


이문제를 해결하지 위해서는 우리는 웹서버가 필요합니다. 


HLS(HTTP Live Streaming) 이기 때문에 http 서버에서 동작할때 정상적으로 작동합니다. 


저같은 경우는 우분투에 아파치 2를 설치 해서 사용 합니다. 


아파치 웹서버의 경우 인터넷을 찾아 보시면 금방 설치 하실수 있습니다. 


저 같은 경우 아파치 웹서버에 m3u8test 라는 폴더를 만들고 




넣어 주고 

stream.m3u8 파일을 묶어주는 메타 파일이 필요합니다. 그러니 작성해 주겠습니다. 


stream.m3u8


#EXTM3U

#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=187738

http://10.23.10.232/m3u8test/index.m3u8


위와 같이 작성 해 줍니다. 




stream.m3u8 을 다운 받아 실행 시켜 줍니다 .




그러면 1개 파일로 묶이게 됩니다. 뚝뚝 끊기는 현상은 없어 집니다. 


그리고 index.m3u8 에 

#EXT-X-DISCONTINUITY 옵션을 주면 실시간 인터넷 방송 처럼 스트리밍을 사용할수 있습니다. 


index.m3u8

#EXTM3U

#EXT-X-VERSION:3

#EXT-X-TARGETDURATION:11

#EXT-X-MEDIA-SEQUENCE:0

#EXTINF:10.006333,

index0.ts

#EXTINF:10.000000,

index1.ts

#EXT-X-DISCONTINUITY


처럼 바꾸고 재생을 하면 



시간을 지정할수 있는 버튼이 사라지게 됩니다. 


그리고 중간 중간에  재생이 끊나기 전에 추가 리스트 동영상 파일을추가하면 

index.m3u8

#EXTM3U

#EXT-X-VERSION:3

#EXT-X-TARGETDURATION:11

#EXT-X-MEDIA-SEQUENCE:0

#EXTINF:10.000000,

index1.ts

#EXTINF:10.178000,

index2.ts

#EXTINF:3.334000,

index3.ts

#EXT-X-DISCONTINUITY


처럼 메타 파일을 바꾸면 계속 해서 다음 리스트 index2.ts index3.ts 을 계속 해서 재생 하게 됩니다. 


추후에 잠시 동안 녹화한 동영상 파일을 계속 해서 추가 하고 시간이 지난 동영상 파일을 지워 주고 하면 


실시간 인터넷 방송을 프로그램 할수 있을듯 합니다. 


다음 강의에는 메타 파일(m3u8)과 ffmpeg 사용 옵션에 대해서 공부 하겠습니다. 


그다음에 MPEG-TS 프로토콜을 실제 ts 파일을 보면서 분석 하도록 하겠습니다. 


참고로 ffmpeg 는 ts 파일을 만들때 MPEG-TS 프로토콜을 만들어 주고 파일을 나눠주는 역활을 합니다. 


이번 강의는 m3u8을 사용한 스트리밍 서비스가 어떻게 재생되는지 커터란 틀만 공부 한듯합니다. 

Comments