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

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

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

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

미디어 형식 요구사항

YouTube HLS 인그레스에는 동영상 및 오디오 콘텐츠에 관한 다음 요구사항이 있습니다.

  • 동영상과 오디오는 M2TS 형식으로 다중화되어야 합니다.
  • 지원되는 동영상 코덱은 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 비선형 휘도여야 합니다.
  • 제한된 범위 (또는 MPEG 범위) 및 전체 범위 (또는 JPEG 범위) 샘플 값이 모두 지원됩니다. 범위는 콘텐츠에서 사용하는 샘플 값 범위에 따라 설정해야 합니다. 제한된 범위의 샘플 값을 사용하는 것이 좋습니다.

HLS 처리 URL 가져오기

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

전체 처리 URL을 가져오려면 인코더가 YouTube 라이브 스트리밍 API를 사용하여 다음 속성으로 liveStream 리소스를 삽입하면 됩니다.

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

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

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

YouTube 크리에이터 스튜디오 웹 인터페이스에서 크리에이터가 '스트림 만들기'를 클릭하면 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은 불완전한 템플릿입니다. 각 URL은 빈 file= 쿼리 매개변수로 끝납니다. 최종 URL을 형성하려면 인코더가 미디어 재생목록 또는 미디어 세그먼트의 파일 이름을 URL 끝에 추가하여 file= 매개변수를 완성해야 합니다.

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

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

HLS 프로토콜 요구사항

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

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

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

  • 사용자에게 제공하려는 최고 해상도의 인코딩된 스트림을 정확히 하나 전송합니다 (단일 해상도 및 코덱).
  • 오디오와 동영상을 멀티플렉싱합니다.
  • 모든 요청에 HTTPS와 영구 연결을 사용합니다.

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

미디어 재생목록

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

요구사항

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

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

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

  • 미디어 재생목록에는 분리된 세그먼트가 5개를 초과해서는 안 됩니다. 서버가 세그먼트를 수신하지 않았거나 수신을 확인하지 않은 경우 세그먼트는 미해결 상태입니다.

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

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

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

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

  • 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여야 합니다.
  • 콘텐츠
    • 동영상과 오디오는 다중화되어야 합니다.
    • 지원되는 동영상 코덱은 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에서는 클라이언트가 삭제를 전송하지 않는 것이 좋습니다.

202(허용됨)

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

400 (Bad Request)

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

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

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

405 (허용되지 않는 메서드)

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

500 (내부 서버 오류)

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