고품질의 HLS 비디오
를 웹과 모바일에
제공하는 방법


비디오 퍼블리셔는 멀티 디바이스 전략의 중요성을 인식하고 있지만, 기존에는 모바일과 웹 플레이어에 동시에 스트리밍을 할 수 있는 포맷이 없었습니다. 하지만 이제 플레이어에서의 세그먼트형식 스트리밍 지원으로, 단일 포맷으로 모바일 브라우저와 웹 브라우저에 비디오를 전달하는 것이 매우 중요해졌습니다.

HLS 디바이스

HTTP 라이브 스트리밍(HLS)은 원래 Apple에서 iOS 운영 체제의 일부로 구현한 비디오 전송 프로토콜입니다.브라이트코브 Zencoder의 API 기반 비디오 인코딩 솔루션을 이용하면 HLS용 콘텐츠를 쉽게 준비할 수 있습니다. 비디오 퍼블리셔가 각 상황에 맞게 콘텐츠를 최적화하기 위해 몇 가지 알아두어야 할 사항이 있습니다.
본 안내서는 브라우저와 모바일 디바이스에서 HLS 비디오를 재생할 때 유념해야 할 사항을 정리해 드립니다. 아울러 인코딩 권장 사항도 소개합니다.

HLS란?

HLS 는 어댑티브 비트레이트 라이브와 온디맨비디오를 전송하기 위해서 세그먼트 형식의 H.265 MPEG-2 TS 비디오와 이에 대한 정보를 담고 있는 M3U8 파일을 사용합니다.
M3U8 파일은 사용자에게 어떤 스트림의 어떤 세그먼트가 사용가능한지 언제든 알아 낼 수 있도록 하는 인덱스 파일입니다.
디바이스는 사용가능한 인터넷 스피드와 CPU정보에 기반하여, 매니페스트 파일에서 가장 적합한 스트림을 자동으로 선택하고, 세그먼트파일을 다운로드 받아서 비디오 재생용 버퍼로 추가 하게 됩니다.

이름에서 보이듯이, HLS는 데이터를 HTTP프로토콜을 통해 전송하게 되므로, 기존에 사용되던 RTP 또는 RTMP 프로토콜 보다 다음과 같이 여러가지 개선된 장점이 있습니다.

  • 인프라 비용 절감
  • CDN과 기타 HTTP 캐싱 인프라에서의 "캐시 기능"
  • 프록시와 방화벽에서 차단당할 위험이 줄어듦
  • 클라이언트에 대한 추정을 통한 실시간 최적화
    (어댑티브 비트레이트)
  • 포맷으로 인한 안정성 향상
  • HTML5 플레이어 구현의 용이성
Apple Store

Apple App Store는 iOS 애플리케이션을 통해 제공되는 비디오에 대해 엄격한 요건을 두고 있습니다. 그것은 10분을 초과하거나 5분 안에 5MB의 데이터를 전송하는(133kbps) 비디오 콘텐츠에 대해서는 예외 없이 스트리밍을 요구하는 것입니다. 또한, Apple은 개발자가 최대 64kbps의 오디오 스트림을 무선 통신망의 대비책으로 제공할 것을 요구하기도 합니다. 이 요건을 충족하지 않는 애플리케이션은 App Store에 들어가지 못합니다. App Store의 비디오를 배포와 관련된 자세한 정보는 온라인에서 iOS 개발자 라이브러리의 Apple HHTP 라이브 스트리밍 개요 문서를 참조하십시오. http://bit.ly/zgHSJX

모바일 디바이스

일반적으로 새로 나온 디바이스가 처리 능력이 더 크며 H.264의 더 높은 프로파일을 지원할 수 있습니다. iPhone 4S 이상 버전이 출시되면서 iOS 디바이스는 H.264의 3가지 프로파일(Baseline, Main, High)을 지원합니다. Android는 디바이스가 워낙 다양하기 때문에 성능을 일반화하기가 쉽지 않습니다. 그러나 최신 Android 디바이스는 적어도 iPhone 4가 지원하는 수준은 지원합니다. 이 프로파일들과 해당 H.264 레벨은 특정 클라이언트 재생 기능을 분류하는 데 사용됩니다. 아래의 디바이스들에는 표준 HD 크기의 화면이 없지만, 일부는 Apple 디지털 AV 어댑터 또는 Apple VGA 어댑터를 사용하여 표준 HD 및 SD 해상도를 TV에 출력할 수 있습니다.

           IPHONE 1~3GS,
          IPOD TOUCH 1~3
IPHONE 4, IPAD 1, APPLE TV 1~2,
          IPOD TOUCH 4~5 및
             최신 ANDROIDS*
       IPHONE 4S+, IPAD 2~4,
                APPLE TV 3,
             최신 ANDROIDS*
프로파일 베이스라인 프로파일 메인 프로파일 하이 프로파일
레벨 레벨 3.0 레벨 3.1** 레벨 4.1***
오디오 AAC 오디오, 1~2개 채널 AAC 오디오, 1~2개 채널 AAC-LC 오디오, 1~2개 채널
최대 프레임률 30fps 30fps 30fps*
비디오 비트레이트 최대 1.5Mbps 최대 5Mbps 최대 5Mbps
오디오 비트레이트 최대 160kbps 최대 160kbps 최대 160kbps
오디오 샘플 레이트 48000이하 48000이하 48000이하
디스플레이 해상도 480x320 iPhone 4/4s: 960x640
iPad 1: 1024x768
iTouch: 1136x640
iPhone 5+: 1136x640
iPad 2: 1024x768
iPad 3/4: 2048x1536

*현재 iPhone 5S 및 최신 Android는 하이 프로파일 레벨 4.2, 60fps 지원
** iPod Touch 5는 레벨 4.1 이하 지원
*** Apple TV 3는 레벨 4.0 이하 지원

데스크톱 및 OTT

현재 HLS를 기본 지원하는 브라우저는 Safari(버전 4.0 이상)뿐이지만, Flash를 이용하면 다른 브라우저에서도 재생이 가능합니다. Video.js 는 자체 플래시 플레이어에서 HLS 지원을 제공하므로, 어느 브라우저에나 HLS를 사용할 수 있습니다. 여러 어플리케이션과 Quicktime, VLC, Apple TV, Roku, Google TV, XBMC와 같은 OTT 디바이스도 HLS를 지원합니다. 연결 속도에 따라 이 디바이스들은 High 프로파일까지도 지원합니다.

고급 기능

HLS 비디오는 끊임없이 진화하며 계속해서 새로운 기능도 추가됩니다. 현재 HLS는 다음을 비롯해 여러 가지 고급 기능을 지원합니다.

  • AES-128 암호화를 통한 콘텐츠 보안
  • TS (transport stream)에서의 CEA-608 자막
  • 라이브 스트리밍 및 주문형 비디오
  • 오디오 트랙에 비디오 스크린 샷 혹은 커버 아트와 같은
    스틸 이미지 삽입 가능
  • ID3 포맷을 사용하는 특정시점지정 메타데이터
    (Timed metadata) 등의 스트림 메타데이터

HLS 인코딩을 위한 6가지 도움말

HLS 인코딩을 제대로 활용하는 6가지 도움말을 소개합니다.
이 권장 사항은 라이브 트랜스코딩과 주문형 트랜스코딩에 똑같이 적용할 수 있습니다.

  1. HE-AAC 오디오를 사용하시기 바랍니다. 표준 AAC(일반적으로 AAC-LC라고 함)는 96kbps 이상의 비트레이트에서는 음질이 좋지만, 비트레이트가 낮아지면 압축됐다는 느낌을 줍니다. App Store는 대부분의 앱에 64kbps의 오디오 스트림을 요구하기 때문에 HE-AAC오디오는 HLS에게 있어서 중요합니다. HE-AAC("고효율 AAC") 프로파일은 낮은 비트레이트 사용에 맞게 최적화되어 있으며 64kbps 범위의 AAC-LC보다 사운드가 훨씬 더 좋기때문에 이는 HLS에게 매우 중요합니다.
  2. Apple은 잡음 방지를 위해 오디오 매개변수를 처음부터 끝까지 동일하게 유지하기를 권장합니다. 오디오의 스트림의 매개변수가 서로 다르면, 오디오의 비트레이트가 변경될 때, 결과적으로 일부 내용이 스킵될 수 있으며, "펑" 소리가 들릴 수 있습니다. 특정 스트림의 품질을 개선하기 위해 여러 가지 오디오 레이트를 제공해야 하는 경우에도 최소한 표준 샘플 레이트는 유지해야 합니다.
  3. 키프레임 레이트는 세그먼트 크기 내에서 균등한 간격으로 분포되어야 합니다. 예를 들어, 세그먼트 크기가 10초라면 키프레임 속도는 2초, 2.5초, 3.33초, 5초 또는 10초여야 합니다. Zencoder를 비롯한 일부 인코더는 키프레임을 적절한 위치에 자동으로 배치합니다. Zencoder의 force_keyframe_rate 설정을 이용하여 스트림 간에 키프레임을 적절히 할당하십시오.
  1. 포맷 오버헤드에 주의하십시오. MPEG-TS 포맷은 불필요하게 많은 패딩을 사용하며 최적화되지 않은 TS 멀티플렉서로 인해 HLS 크기는 MP4보다 전체적으로 10~20% 정도 더 클 때도 있습니다. Zencoder와 Apple 모두 TS 오버헤드를 최소화하는 고도로 최적화된 TS 멀티플렉서를 이용합니다.
         요청
    비트레이트
    오버헤드
    Zencoder에 최적화된 HLS 364kbps 4.83%
    최적화되지 않은 HLS 364kbps 16.34%
  2. 양질의 스트리밍 성능을 확보를 위해 비트레이드를 제한하는 방안도 있습니다. 보통 3~5초의 버퍼링 내에서 평균 비트레이트의 150%를 최고 비트레이트 (bitrate_cap)로 설정할 것을 권장합니다.
  3. 스트림 값에는 해당되는 모든 정보가 들어 있어야 합니다. 이것은 여러 H.264 프로파일을 제공하여 적절한 코덱 값을 넣을 때 특히 중요합니다. 이와 같은 설정으로 기존 디바이스에서 디코딩할 수 없는 세그먼트를 실수로 다운로드하는 것을 막을 수 있습니다. 예를 들어, 베이스라인 3.0 프로파일에는 “avc1.42E01F, mp4a.40.2" 값을 사용하고 메인 3.1에는 "avc1.42E01F, mp4a.40.2"를 이용하는 것입니다.

출력 및 재생

HLS 비디오는 다른 M3U8 파일을 참조하거나 각 비디오 세그먼트파일(.ts 세그먼트, 통상적으로 2~10초 길이)의 위치를 참조하는 인덱스 파일(.M3U8 XML 매니페스트)로 구성되어 있습니다. Zencoder를 이용할 때에는 인코딩 작업을 완료한 후 지정된 base_url 위치에 .M3U8 매니페스트의 위치를 지정합니다.

Zencoder 출력 재생

Apple의 HLS 파일 구조 표시

각각의 base_url을 이용하여 각 세그먼트 세트를 서로 다른 폴더에 위치 시킬 수도 있습니다.이 경우 API 요청시 playlist 부분의경로 값은 스트림의 폴더 위치를 정확하게 지정해야 합니다. 그렇지 않으면 존재 하지 않는 매니페스트 파일을 호출하게 될 수 있습니다. 클라이언트에서는 playlist.m3u8(기본 인덱스 파일)을 검색할 때 플랫폼과 네트워크 제약에 맞춰 재생해야 하는 스트림을 결정하게됩니다.

예: VIDEO.JS를 이용하는 기본 HTML5 테스트 플레이어

      
	<!DOCTYPE html>
	<html>
	<head>
		<title>HTTP Live Streaming Test Player </title>
		<link href="http://vjs.zencdn.net/c/video-js.css" rel="stylesheet" type="test/css">
		<script src="http://vjs.zencdn.net/c/video.js"></script>
        </head>
	<body>
		<video id="example_video_1" class="video-js vjs-default-skin" controls autoplay
		width="640" height="360" data-setup="{}">
			<source src="http://YourServerHere/playlist.m3u8" type="application/x-mpegURL" />
		</video>
	</body>
	</html>
			

인코딩 권장 사항

Zencoder는 이용자의 비디오가 멋지게 보이기를 바라지만, 비디오 압축은 주관적인 영역이기 때문에 초기 권장 사항만 제공할 수 있습니다. 이용자의 애플리케이션이 휴대 기기 또는 모바일 디바이스에 맞춰져 있는데 스펙트럼의 하단에 추가 스트림을 포함시키고 싶어질 수도 있습니다. 또한 애플리케이션이 보다 강력한 네트워크에 연결된 디바이스를 목표로 하는 바람에 제공해야 할 총 스트림 수를 제한할 수 있습니다. 원본 자료에 패닝, 모션 또는 컷이 많이 포함되어 있다면 원하는 결과를 얻기 위해 video_bitrate로 올려야 할 수도 있습니다.

모든 것은 비디오와 관련이 있으므로, 육안으로 전체 품질을 평가하십시오. 테스트 플레이어와 clip_length 매개변수를 이용하여 작은 테스트 스트림을 출력하고 설정을 적절하다고 생각하는 대로 수정하십시오. 위에 설명된 6가지 도움말만 잘 기억하면 비디오는 어떤 iOS 디바이스에서도 고품질로 재생될 것입니다.

해상도 프로파일 비트레이트 @16:9 @4:3 오디오 의견
1280x960 하이@4.0 4Mbps 1280x720 1280x960 64kbps HE-AAC
1024x768 메인@3.1 2Mbps 1024x576 1024x768 56kbps HE-AAC
960x640 메인@3.1 1.5Mbps 960x540 854x640 56kbps HE-AAC
640x432 메인@3.1 1Mbps 640x360 576x432 56kbps HE-AAC
480x320 베이스라인@3.0 600kbps 480x272 426x320 56kbps HE-AAC
400x288 베이스라인@3.0 400kbps 400x224 384x288 56kbps HE-AAC
400x288 베이스라인@3.0 200kbps 400x224 384x288 56kbps HE-AAC 프레임률 제거
(오디오 전용) (오디오 전용) (오디오 전용) (오디오 전용) (오디오 전용) 56kbps HE-AAC 스틸 이미지
      포함

참고

  1. 여기 소개하는 것은 권장 사항일 뿐입니다. 유효한 해상도와 비트레이트는 많으며, 다른 해상도와 비트레이트가 선호되는 상황도 있습니다. 예를 들어, 화면이 복잡한 콘텐츠는 더 높은 비트레이트를 필요로하고 내용의 변화가 적은 콘텐츠는 낮은 비트레이트를 사용할 수 있습니다.
  2. 이 6가지 해상도와 비트레이트는 대역폭에 상관 없이 대부분의 경우에 좋습니다. 분명히 더 많은 화질을 필요로 (Apple은 8가지를 권장함) 할 수 있으므로, 원하는 대로 해상도와 프로파일을 추가하거나 제외할 수 있습니다.
  3. 첫 번째 열은 일반화된 해상도입니다. 비디오 종횡비(4:3 또는 16:9)에 따라 최종 비디오는 4열과 5열에 보이는것 처럼 다른 해상도를 갖게 됩니다.
  4. 프레임레이트는 30이나 그 이하로 제한하는것이 좋습니다. 프레임레이트을 강제로 변경하지 마십시오. 비디오가 부드럽게 재생되기 위해서는 지나치게 높은 프레임레이트는 사용하지 않는것이 좋습니다. 최저 스트림의 경우 15 이하의 프레임레이트는 사용 하지 않는것이 좋습니다.
  1. iPhone 1 호환을 위해 베이스라인 스트림에 H.264 참조 프레임 하나만 사용하게 합니다.
  2. 키프레임 간격은 5 또는 10으로 설정하되 키프레임을 서로 맞춥니다.
  3. 호환성 확보를 위해 오디오 샘플 레이트를 44100 이하로 제한합니다.
  4. 비디오 재생이 부드럽게 되도록 하기 위해서 최대 비트레이트를 제한하는 방법을 고려해 봅니다. 좋은 화질과 부드러운 재생을 모두 잘 충족시키기 위해서, 최대 비트레이트를 평균 비트레이트의 150%로하고, 버퍼는 3~5초 정도로 지정하는것이 적정합니다.