HLS를 통해 라이브 YouTube 콘텐츠 제공

이 문서에서는 HTTP 라이브 스트리밍 (HLS) 프로토콜을 사용하여 인코더에서 YouTube로 실시간 데이터를 스트리밍하는 방법을 설명합니다. 이 문서는 제품에 HLS 처리 지원을 추가하려는 인코더 공급업체를 대상으로 합니다. HLS 처리는 상대적으로 지연 시간이 긴 고화질 및 고해상도가 필요한 프리미엄 콘텐츠에 적합합니다. YouTube 라이브 스트리밍에서 지원하는 다양한 처리 프로토콜을 간략하게 비교하려면 YouTube 라이브 스트리밍 처리 프로토콜 비교를 참고하세요.

HLS를 사용하여 실시간 데이터를 스트리밍하려면 인코더가 HTTP PUT 또는 POST 요청을 사용하여 일련의 미디어 재생목록과 미디어 세그먼트를 YouTube의 HLS 엔드포인트로 전송해야 합니다. 인코더의 관점에서 YouTube HLS 엔드포인트는 수동 HTTP 서버로 보입니다.

각 미디어 세그먼트는 1~4초 길이의 스트림의 짧은 부분에 대한 실제 멀티미디어 콘텐츠를 나타냅니다. 각 미디어 재생목록은 미디어 세그먼트를 올바른 스트림 순서로 재조합하는 방법을 설명합니다.

미디어 형식 요구사항

YouTube HLS 처리에는 동영상 및 오디오 콘텐츠에 관한 다음 요구사항이 적용됩니다.

  • 동영상과 오디오는 M2TS 형식으로 mux되어야 합니다.
  • 지원되는 동영상 코덱은 H.264 및 HEVC입니다.
  • 최대 60fps의 프레임 속도가 지원됩니다.
  • 폐쇄형 GOP만 지원됩니다.
  • 지원되는 오디오 코덱은 AAC이며 단일 트랙 오디오만 지원됩니다.

자세한 요구사항은 미디어 세그먼트 섹션을 참고하세요.

HDR

HDR (High Dynamic Range) 동영상은 HEVC 코덱을 사용하여 지원되며 다음과 같은 추가 요구사항이 있습니다.

  • 지원되는 색상 표준은 10비트 PQ 및 비정상적인 밝기의 HLG입니다. 구체적으로 다음 사항을 확인하세요.
    • 크로마 형식은 YUV 4:2:0 10비트여야 합니다.
    • 전송 함수는 PQ (SMPTE ST 2084라고도 함) 또는 HLG(ARIB STD-B67이라고도 함)여야 합니다.
    • 원색은 Rec. 2020이어야 합니다.
    • 매트릭스 계수는 Rec. 2020 NCL(비선형 휘도)이어야 합니다.
  • 제한된 범위 (또는 MPEG 범위) 샘플 값과 전체 범위 (또는 JPEG 범위) 샘플 값이 모두 지원됩니다. 콘텐츠에서 사용하는 샘플 값 범위에 따라 범위를 설정하는 것이 중요합니다. 제한된 범위의 샘플 값을 사용하는 것이 좋습니다.

HLS 처리 URL 가져오기

YouTube API에서 HLS 처리 URL 가져오기

전체 처리 URL을 가져오기 위해 인코더는 YouTube Live Streaming API를 사용하여 다음 속성이 있는 liveStream 리소스를 삽입할 수 있습니다.

"cdn": {
  "ingestionType": "hls",
  "frameRate": "variable",
  "resolution": "variable"
}

API 응답에서 cdn.ingestionInfo.ingestionAddress 필드는 기본 처리 URL을 지정하고 cdn.ingestionInfo.backupIngestionAddress 필드는 백업 처리 URL을 지정합니다. 자세한 내용은 liveStreams 리소스 문서를 참고하세요.

YouTube 크리에이터 스튜디오에서 HLS 처리 URL 가져오기

크리에이터가 YouTube 스튜디오 웹 인터페이스에서 '스트림 만들기'를 클릭하면 영숫자 문자와 하이픈으로 구성된 '스트림 키'가 표시됩니다. 이 보안 비밀 키는 크리에이터와 YouTube로 스트리밍되는 콘텐츠를 모두 식별합니다.

다음과 같이 이 스트림 키에서 HLS URL을 생성할 수 있습니다.

https://a.upload.youtube.com/http_upload_hls?cid=$STREAM_KEY&copy=0&file=

여기서 $STREAM_KEY는 웹 인터페이스에 표시된 스트림 키입니다. 예를 들면 다음과 같습니다. https://a.upload.youtube.com/http_upload_hls?cid=abcd-efgh-ijkl-mnop-qrst&copy=0&file=

안정성을 높이려면 처리의 중복된 두 번째 사본을 이 백업 URL로 전송할 수 있습니다.

https://b.upload.youtube.com/http_upload_hls?cid=$STREAM_KEY&copy=1&file=

백업에는 기본 URL과 두 가지 차이점이 있습니다. 호스트 이름과 copy= 매개변수가 모두 변경되었습니다. 백업 처리는 스트림 손상을 방지하기 위해 기본 처리와 다른 copy= 매개변수 값을 전송해야 합니다.

HLS 처리 URL 완료

두 방법 중 하나를 사용하여 가져온 URL은 불완전한 템플릿입니다. 각각은 빈 file= 쿼리 매개변수로 끝납니다. 최종 URL을 형성하려면 인코더가 미디어 재생목록 또는 미디어 세그먼트의 파일 이름을 URL 끝에 추가하여 file= 매개변수를 완성해야 합니다.

file= 매개변수 값에는 다음 규칙이 적용됩니다.

  • 인코더는 영숫자 문자, 밑줄, 슬래시, 하이픈, 마침표로 미디어 재생목록 또는 미디어 세그먼트 파일 이름을 구성할 수 있습니다. 다른 문자는 지원되지 않습니다.
  • 인코더는 파일 이름을 URL 인코딩해서는 안 됩니다.
  • 인코더는 파일 이름에 상대 또는 절대 경로 구성요소를 포함할 수 있지만, 이는 필수가 아닙니다. 인코더가 미디어 세그먼트 파일 이름 내에 경로 구성요소를 포함하는 경우 상응하는 재생목록 항목에서 동일한 경로를 참조해야 합니다.

HLS 프로토콜 요구사항

인코더에서 전송하는 미디어 재생목록과 미디어 세그먼트는 HTTP 라이브 스트리밍 2판 사양을 준수해야 합니다.

HLS 사양은 미디어 재생목록과 마스터 재생목록이라는 두 가지 유형의 재생목록을 정의합니다. YouTube는 스트리밍된 콘텐츠를 다양한 해상도와 비트 전송률로 트랜스코딩하므로 인코더는 비트 전송률이 다른 콘텐츠를 YouTube로 전송할 필요가 없습니다. 따라서 YouTube는 HLS 처리를 위해 미디어 재생목록만 지원하며 마스터 재생목록은 무시됩니다. 마스터 재생목록은 각각 동일한 콘텐츠의 다른 버전을 설명하는 대안 스트림 세트를 제공합니다.

인코더는 다음을 충족해야 합니다.

  • 사용자에게 제공하려는 가장 높은 해상도 (단일 해상도 및 코덱)로 인코딩된 스트림을 정확히 하나만 전송합니다.
  • 오디오와 동영상을 mux합니다.
  • 모든 요청에 HTTPS 및 영구 연결을 사용합니다.

다음 섹션에는 미디어 재생목록 및 미디어 세그먼트에 관한 보다 구체적인 요구사항이 포함되어 있습니다.

미디어 재생목록

미디어 재생목록에는 연결하여 연속적이고 디코딩 가능한 멀티미디어 스트림을 나타낼 수 있는 미디어 세그먼트 목록이 포함됩니다. 미디어 재생목록은 서버에 예상되는 미디어 세그먼트와 재조합된 스트림에서 이를 올바르게 정렬하는 방법을 알려줍니다.

요구사항

  • 미디어 재생목록 파일 이름은 .m3u8 또는 .m3u로 끝나야 합니다.

  • 스트림에 전송된 첫 번째 미디어 재생목록은 시퀀스 번호 0에서 시작해야 하며 시퀀스 번호는 단조 증가해야 합니다.

  • EXT-X-MEDIA-SEQUENCE 태그는 재생목록에 나열된 첫 번째 미디어 세그먼트의 시퀀스 번호를 식별해야 합니다.

  • 미디어 재생목록에는 미완성 세그먼트가 5개를 초과해서는 안 됩니다. 서버가 세그먼트를 수신하지 않았거나 수신 확인을 하지 않은 경우 세그먼트는 대기 중입니다.

    각 미디어 재생목록에 우수한 세그먼트 외에도 확인된 세그먼트도 몇 개 포함합니다. 이렇게 하면 서버 측에서 미디어 재생목록이 손실되는 경우 세그먼트가 건너뛰어질 가능성이 줄어듭니다. 예를 들어 각 미디어 재생목록에 확인된 세그먼트는 최대 2개, 미해결 세그먼트는 최대 5개까지 포함할 수 있습니다.

    서버는 세그먼트 업로드에 대해 200 (OK) 또는 202 (Accepted) 응답을 반환하여 미디어 세그먼트 수신을 확인합니다. 202 응답은 서버가 해당 세그먼트를 식별하는 재생목록 전에 세그먼트를 수신했음을 나타냅니다.

  • 미디어 재생목록이 손실된 경우 서버가 빠르게 복구할 수 있도록 모든 미디어 세그먼트에 대해 업데이트된 미디어 재생목록을 전송합니다.

  • 서버가 미디어 세그먼트 수신을 확인하면 EXT-X-MEDIA-SEQUENCE 태그 값을 증분하여 미디어 재생목록이 너무 길어지지 않도록 할 수 있습니다. 예를 들어 서버가 이미 처음 9개 미디어 세그먼트의 수신을 확인한 경우 다음 미디어 재생목록에는 여덟 번째, 아홉 번째, 열 번째 미디어 세그먼트가 표시될 수 있습니다.

  • EXT-X-KEYEXT-X-SESSION-KEY 태그는 지원되지 않습니다.

다음 목록은 인코더가 전송할 것으로 예상되는 파일의 예를 보여줍니다.

Media Playlist file with seqnum #0
Media Segment file #0
Media Playlist file with seqnum #0-#1
Media Segment file #1
Media Playlist file with seqnum #0-#2
Media Segment file #2
Media Playlist file with seqnum #1-#3
Media Segment file #3
...

다음 예는 라이브 동영상 스트림 중간에 전송된 미디어 재생목록을 보여줍니다. 이 예시는 스트림 중간에서 가져온 것이므로 EXT-X-MEDIA-SEQUENCE 태그의 값이 0이 아닙니다.

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:4
#EXT-X-MEDIA-SEQUENCE:2680

#EXTINF:3.975,
fileSequence2680.ts
#EXTINF:3.941,
fileSequence2681.ts
#EXTINF:3.975,
fileSequence2682.ts

미디어 세그먼트

다음 목록은 미디어 세그먼트의 요구사항을 나타냅니다.

  • 파일 이름
    • URL의 미디어 세그먼트 파일 이름에는 .ts 파일 이름 확장자가 있어야 하며 재생목록의 파일 이름과 일치해야 합니다.
    • 미디어 세그먼트 파일 이름은 인코더 재부팅 및 스트림 다시 시작 간에 고유해야 합니다.
  • 형식
    • 미디어 세그먼트는 M2TS 형식이어야 하며 자체 초기화되어야 합니다.
    • 각 M2TS 세그먼트는 단일 MPEG-2 프로그램을 포함해야 합니다.
    • M2TS 세그먼트는 PAT와 PMT를 포함해야 하며 세그먼트의 처음 두 전송 스트림 패킷은 PAT와 PMT여야 합니다.
  • 콘텐츠
    • 동영상과 오디오는 mux되어야 합니다.
    • 지원되는 동영상 코덱은 H.264 및 HEVC입니다.
    • HEVC를 사용한 HDR이 지원됩니다 (HDR 요구사항 참고).
    • 최대 60fps의 프레임 속도가 지원됩니다.
    • 폐쇄형 GOP만 지원됩니다.
    • 지원되는 오디오 코덱은 AAC이며 단일 트랙 오디오만 지원됩니다.
    • 미디어 세그먼트의 길이는 다음 섹션에서 설명한 대로 1~4초가 권장됩니다. 미디어 세그먼트의 길이는 5초를 초과해서는 안 됩니다.
    • 미디어 세그먼트는 HTTPS를 사용하여 TLS/SSL 레이어에서만 암호화해야 합니다. 다른 암호화 메커니즘은 지원되지 않습니다.

미디어 세그먼트 길이

HLS 처리는 고화질 및 고해상도가 필요한 프리미엄 콘텐츠에 사용될 것으로 예상됩니다. HLS 처리는 세그먼트 기반이므로 일반적으로 RTMP 및 WebRTC 기반 처리보다 지연 시간이 더 깁니다.

미디어 세그먼트 길이는 1~4초가 좋습니다. 미디어 세그먼트가 짧을수록 지연 시간이 줄어들지만 재버퍼링 빈도가 높아지고 인코딩 효율이 떨어집니다. 이전 섹션에서 언급했듯이 미디어 세그먼트는 5초 이하여야 합니다.

전송률

YouTube 고객센터에서 비트 전송률 설정에 관한 가이드라인을 확인하세요.

HEVC는 일반적으로 H.264에 비해 동일한 동영상 품질에서 25~50% 더 많은 데이터 압축을 제공합니다. 따라서 권장 범위의 하단에 있는 비트 전송률 값을 HEVC와 함께 사용하여 대역폭을 절약할 수 있으며, 이는 특히 4K 콘텐츠에 유용합니다.

기타 요구사항

  • 인코더는 제조업체 이름, 모델 이름, 버전이 포함된 다음 문법을 사용하여 HTTP 요청에서 User-Agent 헤더를 설정해야 합니다.

    User-Agent: <manufacturer> / <model> / <version>
    

자막

HLS 처리는 자막 전송을 위한 두 가지 옵션을 지원합니다.

  • 별도의 HTTP POST 요청을 사용하여 자막을 전송합니다. 이는 모든 HLS 처리에 적용됩니다.
  • 삽입된 608/708 자막은 H264 동영상 코덱을 사용하는 HLS 처리에서는 작동하지만 HEVC 동영상 코덱을 사용하는 처리에서는 작동하지 않습니다. 자세한 내용은 YouTube 고객센터의 실시간 자막 요구사항을 참고하세요.

HTTP 응답 코드

다음 섹션에서는 HLS를 사용하여 전송된 미디어 세그먼트 및 미디어 재생목록에 대한 응답으로 YouTube가 반환하는 응답 코드를 설명합니다.

200 (OK)

PUT 또는 POST 요청에 대한 응답으로 HTTP 200 (OK) 응답은 YouTube 서버가 예상 작업을 수신하여 성공적으로 처리했음을 나타냅니다.

DELETE 요청에 대한 응답으로 HTTP 200 (OK) 응답은 YouTube 서버가 요청을 수신하고 무시했음을 나타냅니다. YouTube 서버는 클라이언트가 스트림의 리소스를 삭제하도록 요구하지 않으며 삭제 요청을 무시합니다. 성능상의 이유로 YouTube는 클라이언트가 DELETE를 전송하지 않는 것이 좋습니다.

202(허용됨)

HTTP 202 (수락됨) 응답은 YouTube 서버가 해당 미디어 세그먼트가 포함된 미디어 재생목록을 수신하기 전에 미디어 세그먼트를 수신했음을 나타냅니다. 이는 클라이언트에게 해당 세그먼트의 처리가 지연되지 않도록 최대한 빨리 해당 미디어 세그먼트가 포함된 미디어 재생목록을 전송해야 한다고 나타냅니다. 인코더가 모든 미디어 세그먼트에 대해 업데이트된 미디어 재생목록을 전송하는 경우에는 문제가 되지 않습니다.

400 (Bad Request)

HTTP 400 (잘못된 요청) 응답은 다음 문제 중 하나가 발생했음을 나타냅니다.

  • 잘못된 URL
  • 재생목록을 파싱할 수 없거나 지원되지 않는 태그가 포함되어 있습니다.
401 (Unauthorized)

HTTP 401 (Unauthorized) 응답은 YouTube HLS 엔드포인트의 기본 URL에 있는 cid 매개변수가 손상되었거나 만료되었음을 나타냅니다. 계속하려면 클라이언트가 cid 매개변수를 업데이트해야 합니다.

405 (허용되지 않는 방식)

HTTP 405 (허용되지 않는 방식) 응답은 요청이 POST, PUT 또는 DELETE 요청이 아니었음을 나타냅니다.

500 (내부 서버 오류)

HTTP 500 (내부 서버 오류) 응답은 서버가 요청을 처리할 수 없음을 나타냅니다. 이 오류의 경우 지수 백오프를 사용하여 요청을 다시 시도하는 것이 좋습니다.