대역폭 별로 화질이 다른 미디어 파일을 읽도록 하여 네트워크 상태가 좋고 나빠짐에 따라 유동적으로 화질이 달라지는 것이다. 사용자 입장에서는 영상 시청 중 네트워크 상태가 나빠져도 끊김 없이 영상 시청을 할 수 있다.
Wi-Fi 환경과 휴대전화망 환경에 맞는 라이브 서비스를 동시에 제공하는 Adaptive Bitrate Streaming이 적용되어 있다면, 휴대전화망 환경의 라이브 서비스로 자동으로 옮겨감으로써 화면의 품질이나 해상도 등은 나빠지지만 끊기지 않고 계속 서비스를 이용할 수 있는 것이다.
HLS에서 Adaptive Bitrate Streaming을 지원하기 위한 m3u8 파일과 ts 파일의 구조는 다음과 같다.
전체를 대표하는 m3u8 파일이 있고, 대표 파일 내에서 다시 각각의 비트레이트별 플레이 리스트 파일을 가리키게 한다. 각 비트레이트별 플레이리스트 파일은 다시 각자의 비트레이트에 해당하는 ts 파일들을 가리킨다.
variant.m3u8 파일의 내용은 다음과 같다.
#EXTM3U #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1280000 a01a_L.m3u8 #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=2560000 a01a_M.m3u8 #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=7680000 a01a_H.m3u8
ffmpeg를 이용하여 HLS를 설정하며 화질도 변경한다
// 고화질 파일
ffmpeg -i /Users/jungh/Downloads/a05a.mp4 -profile:v high -level 4.0 -s 1280x720 -start_number 0 -hls_time 10 -hls_list_size 0 -b:v 6000k -hls_segment_filename /Users/jungh/Downloads/a05a_high_%01d.ts /Users/jungh/Downloads/a05a_H.m3u8
// 중간화질 파일
ffmpeg -i /Users/jungh/Downloads/a05a.mp4 -profile:v main -level 3.0 -s 640x360 -start_number 0 -hls_time 10 -hls_list_size 0 -b:v 800k -hls_segment_filename /Users/jungh/Downloads/a05a_medium_%01d.ts /Users/jungh/Downloads/a05a_M.m3u8
// 저화질 파일
ffmpeg -i /Users/jungh/Downloads/a05a.mp4 -profile:v baseline -level 3.0 -s 426x240 -start_number 0 -hls_time 10 -hls_list_size 0 -b:v 100k -hls_segment_filename /Users/jungh/Downloads/a05a_low_%01d.ts /Users/jungh/Downloads/a05a_L.m3u8
고화질 (High Quality):
비트레이트: 6000k (6 Mbps 이상)
해상도: 1280x720 (HD)
H.264 프로파일: high
H.264 레벨: 4.0
중간 품질 (Medium Quality):
비트레이트: 800k (0.8 Mbps)
해상도: 640x360 (360p)
H.264 프로파일: main
H.264 레벨: 3.0
저화질 (Low Quality):
비트레이트: 100k (0.1 Mbps)
해상도: 426x240 (240p)
H.264 프로파일: baseline
H.264 레벨: 3.0
주의사항 - 파일 이름을 a_%03d.ts으로 설정하여 001,002,003의 파일명으로 저장했으나, video.js에서 읽는 과정에서 뒷부분만 읽는 에러가 발생했다. 0,1,2,3의 파일 명을 배분하니 처음부터 잘 읽어옴을 확인 할 수 있었다.
파일을 읽어오는 video.js의 문제일 수도 있다.