콘텐츠로 이동

윈도우즈 크롬에서의 PlayReady SL3000 지원

이 가이드는 Windows Chrome 브라우저에서의 PlayReady Security Level 3000 (SL3000) 통합 및 지원에 대해 설명합니다. PlayReady SL3000은 Windows의 하드웨어 기반 DRM 경로를 활용하여 고가치 콘텐츠(4K/UHD, HDR, HEVC 등)를 보호합니다.

과거에는 Microsoft Edge에서만 사용할 수 있었던 이 기능은 이제 Windows 11 사용자를 위한 Google Chrome에서도 하드웨어 보안 재생을 지원합니다.

PlayReady SL3000을 활용하기 위해서는 최종 사용자 환경과 구현이 다음 요구 사항을 충족해야 합니다.

  • 운영 체제: Windows 11 21H2 (빌드 22000) 이상
  • 브라우저: Chrome 버전 140.0.7339.0 이상
  • 하드웨어: PlayReady SL3000을 지원하는 유효한 GPU 드라이버
  • 아키텍처 제한:
    • 지원됨: x64 (네이티브)
    • 지원되지 않음: x86 빌드, ARM64 빌드, 또는 WoW 에뮬레이션을 통해 ARM64에서 실행되는 x86_64 빌드

Chrome에서 PlayReady SL3000 키 시스템을 타겟팅하려면 구체적인 EME(Encrypted Media Extensions) 설정이 필요합니다.

다음과 같은 키 시스템 문자열과 강건성 설정이 권장됩니다.

  • 키 시스템 문자열: com.microsoft.playready.recommendation.3000
  • 비디오/오디오 강건성: 설정 안함 또는 빈 문자열 설정

키 시스템 문자열 자체에 하드웨어 수준의 강건성 적용이 포함되어 있으므로 별도의 Robustness 설정이 불필요합니다.

하드웨어 컨텍스트 재설정 처리

Section titled “하드웨어 컨텍스트 재설정 처리”

PlayReady SL3000 사용 시 하드웨어 컨텍스트 재설정이라는 고유한 문제가 발생할 수 있습니다. 이는 다음과 같은 시스템 이벤트로 인해 보안 미디어 경로가 중단될 때 발생합니다.

  • 장치가 절전 모드로 진입하거나 깨어날 때 (예: 노트북 덮개를 닫고 열 때)
  • 새 모니터를 연결하거나 그래픽 토폴로지가 변경될 때

이러한 상황이 발생하면 복호화 키가 손실되며, 브라우저는 별도의 조치 없이는 자동으로 재생을 재개할 수 없습니다.

재설정이 발생하면 다음과 같은 현상이 일어납니다.

  1. 브라우저가 "hardware-context-reset"이라는 이유로 모든 MediaKeySession 객체를 닫습니다.
  2. 미디어 엘리먼트에서 waitingforkey 이벤트가 발생합니다.
  3. 재생이 멈춥니다.

플레이어 애플리케이션은 반드시 이러한 이벤트를 감지하고 복구 로직을 처리해야 합니다.

복구 전략:

  1. MediaKeySession.closed 프라미스(Promise)를 모니터링합니다.
  2. 닫힌 이유가 hardware-context-reset인지 확인합니다.
  3. 확인된 경우, 반드시 MediaKeySession을 다시 생성하고 라이선스를 재요청한 뒤 미디어 엘리먼트를 업데이트해야 합니다.
  4. 또는, 플레이어 인스턴스를 리로드하거나 사용자에게 “재생” 버튼을 눌러 세션을 다시 시작하도록 유도합니다.

널리 사용되는 오픈 소스 플레이어를 사용하는 경우, 올바른 키 시스템 매핑을 위해 특정 설정이 필요합니다.

Shaka Player는 기본적으로 표준 PlayReady 키 시스템을 사용할 수 있습니다. 따라서 SL3000 문자열을 명시적으로 매핑해야 합니다.

drm: {
servers: {
'com.microsoft.playready': 'YOUR_LICENSE_URL',
},
keySystemsMapping: {
// 표준 PlayReady를 SL3000 특정 문자열로 매핑
'com.microsoft.playready': 'com.microsoft.playready.recommendation.3000'
}
}

특정 SL3000 키 시스템을 사용할 때, 브라우저는 요청 본문에 전체 <PlayReadyKeyMessage> XML을 전송합니다. 일부 라이선스 서버는 <Challenge> 데이터만 기대할 수 있으므로, getLicense 콜백에서 메시지를 파싱해야 할 수도 있습니다.

// getLicense 콜백 구현 의사 코드(Pseudocode)
getLicense: function(emeOptions, keyMessage, callback) {
// 1. 'keyMessage' (XML) 파싱
// 2. <Challenge> 태그 내부의 콘텐츠 추출
// 3. 추출된 챌린지를 라이선스 서버로 전송
}

재생을 초기화하기 전에 지원 여부를 확인하려면 navigator.mediaCapabilities.decodingInfo 기능 쿼리를 사용할 수 있습니다.

async function checkPlayReadySL3000H264() {
const config = {
type: 'media-source',
video: {
contentType: 'video/mp4; codecs="avc1.4d401f"', // 프로필/레벨에 맞게 조정
width: 1920, height: 1080, bitrate: 2000000, framerate: 30
},
keySystemConfiguration: {
keySystem: 'com.microsoft.playready.recommendation.3000', // SL3000 키 시스템
persistentStateRequired: 'true', // SL3000에 필수
video: { robustness: "" } // 빈 값 또는 "3000"
}
};
try {
const result = await navigator.mediaCapabilities.decodingInfo(config);
if (result.supported && result.keySystemAccess) {
console.log('PlayReady SL3000 H.264 is supported.');
} else {
console.log('PlayReady SL3000 H.264 is NOT supported.');
}
} catch (e) {
console.error('Capability check failed', e);
}
}

Windows에 HEVC 확장이 설치되어 있는지 확인합니다.

async function checkPlayReadySL3000HEVC() {
const config = {
type: 'media-source',
video: {
contentType: 'video/mp4; codecs="hvc1.1.6.L93.B0"', // HEVC 코덱 문자열 조정
width: 1920, height: 1080, bitrate: 2000000, framerate: 30
},
keySystemConfiguration: {
keySystem: 'com.microsoft.playready.recommendation.3000',
persistentStateRequired: 'true',
video: { robustness: "" }
}
};
// ... 위와 동일하게 decodingInfo 실행
}

재생이 실패하거나 키 시스템이 감지되지 않는 경우 다음 사항을 확인합니다.

Chrome 설정에서 하드웨어 보안 복호화가 활성화되어 있는지 확인합니다.

  • 주소창에 chrome://flags/#enable-hardware-secure-decryption 입력.
  • 설정값을 Enabled로 변경.

Chrome의 내부 로깅 기능을 사용하여 CDM 로드 및 오류를 디버깅합니다.

  • CDM 정보: chrome://media-internals#cdms
    • com.microsoft.playready.recommendation을 검색하여 등록 여부 확인.
  • 재생 로그: chrome://media-internals#players
    • PIPELINE_ERROR_DECODE 오류나 라이선스 교환 실패 로그 확인.

드물게 치명적인 오류가 발생할 경우, Windows가 HWDRM 기능을 자동으로 비활성화할 수 있습니다. 테스트 목적으로 콘솔을 통해 수동으로 다시 활성화하려면 다음을 수행합니다.

  1. MF_MEDIAKEYSESSION_TYPE_PERSISTENT_USAGE_RECORD 타입의 세션을 생성합니다.
  2. 세션 ID로 ResetHardwareDRMDisabled 1.0 문자열을 사용하여 Load를 호출합니다.

Windows에 설치된 코덱 버전을 확인하려면 PowerShell에서 다음 명령어를 실행합니다.

Terminal window
get-appxpackage *hevc* | Select-Object Version
get-appxpackage *av* | Select-Object Version