Azure Media Services 연동 가이드

개요

본 문서는 Azure Media Services를 통한 콘텐츠 인코딩 및 패키징 과정에서 PallyCon 멀티DRM 서비스를 연동하는 방법을 설명합니다.

Azure Media Services(AMS)는 브로드캐스트 품질의 비디오 스트리밍을 구현하고, 접근성과 배포를 향상시키며, 콘텐츠를 분석하는 등 여러 작업을 수행하는 솔루션을 빌드할 수 있게 하는 클라우드 기반 플랫폼입니다.

연동 샘플

PallyCon AMS 패키징 샘플.NET 6.0 SDK를 사용하여 PallyCon 멀티 DRM과 AMS v3를 연동하는 방법을 보여줍니다. 이 샘플은 DRM 연동에 중점을 두었기 때문에 기본적인 VOD 패키징 시나리오만 구현되어 있습니다.

샘플은 아래와 같은 두 가지 유형의 콘텐츠 패키징 시나리오를 지원합니다.

  1. DASH_PlayreadyAndWidevine
  2. HLS_FairPlay

AMS에서 제공하는 다양한 기능에 대한 사항은 AMS SDK 링크를 참고하시기 바랍니다.

요구 사항

본 연동 샘플을 테스트하려면 다음과 같은 사항이 준비되어야 합니다.

  • 윈도우즈 10/11 PC
  • Visual Studio 2022 (Windows 10/11)
  • .NET 6.0 SDK: 다운로드 페이지
  • Azure Media Services 계정: 관련 가이드 참고
  • PallyCon KMS와의 CPIX API 통신에 사용되는 KMS 토큰: PallyCon 서비스 가입 시 생성되는 API 인증 토큰으로 PallyCon 콘솔 사이트에서 확인할 수 있습니다.

샘플 프로젝트 실행

  1. 샘플 저장소에서 코드를 클론하거나 다운로드합니다.
  2. 프로젝트 루트의 /PallyConAMSv3DotnetSample.sln 파일을 Visual Studio에서 열고 실행할 프로젝트를 선택합니다.
  3. appsettings.json 파일을 수정해 PallyConEncToken(KMS 토큰) 값을 포함한 각종 설정을 입력합니다. 자세한 사항은 AMS 가이드를 참고하시기 바랍니다.
  4. 소스 코드에 SourceUriContentId 값을 입력합니다.
  5. 프로젝트를 실행합니다.

PallyConKMSClientWrapper

PallyCon KMS 서버와 통신하기 위해 C++ 라이브러리(PallyConKmsClient_MD.lib)를 래핑하는 C++/CLI 프로젝트입니다. _getContentPackagingInfoFromKmsServer_ 함수를 사용하면 KMS 서버에서 패키징 정보를 얻을 수 있습니다.

bool PallyConKmsClientWrapper::getDashAndHlsPackagingInfoFromKmsServer(String^ content_id, String^% key_id, String^% key, String^% hls_key_uri, String^% iv, String^% pssh_widevine, String^% pssh_playready)
{
 try
 {
  PallyConKmsClient kmsClient = new PallyConKmsClient(msclr::interop::marshal_as<std::string>(strKmsURL), msclr::interop::marshal_as<std::string>(strEncToken))
        
  ContentPackagingInfo packInfos = kmsClient->getContentPackagingInfoFromKmsServer(
    msclr::interop::marshal_as<std::string>(content_id), "", PackType::DASH|PackType::HLS);
  key_id = gcnew String(packInfos.keyId.c_str());
  key = gcnew String(packInfos.key.c_str());
  hls_key_uri = gcnew String(packInfos.hlsKeyUri.c_str());
  iv = gcnew String(packInfos.iv.c_str());
  pssh_widevine = gcnew String(packInfos.pssh_widevine.c_str());
  pssh_playready = gcnew String(packInfos.pssh_playready.c_str());
 }
 catch (std::exception& e)
 {
  std::cout << e.what();
 }

  return true;
}

참고 링크

이전