Azure Media Services 연동 가이드
개요
본 문서는 Azure Media Services를 통한 콘텐츠 인코딩 및 패키징 과정에서 PallyCon 멀티DRM 서비스를 연동하는 방법을 설명합니다.
Azure Media Services(AMS)
는 브로드캐스트 품질의 비디오 스트리밍을 구현하고, 접근성과 배포를 향상시키며, 콘텐츠를 분석하는 등 여러 작업을 수행하는 솔루션을 빌드할 수 있게 하는 클라우드 기반 플랫폼입니다.
연동 샘플
PallyCon AMS 패키징 샘플 Github 저장소PallyCon AMS 패키징 샘플
은 .NET 6.0 SDK를 사용하여 PallyCon 멀티 DRM과 AMS v3를 연동하는 방법을 보여줍니다. 이 샘플은 DRM 연동에 중점을 두었기 때문에 기본적인 VOD 패키징 시나리오만 구현되어 있습니다.
샘플은 아래와 같은 두 가지 유형의 콘텐츠 패키징 시나리오를 지원합니다.
- DASH_PlayreadyAndWidevine
- 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 콘솔 사이트에서 확인할 수 있습니다.
샘플 프로젝트 실행
- 샘플 저장소에서 코드를 클론하거나 다운로드합니다.
- 프로젝트 루트의
/PallyConAMSv3DotnetSample.sln
파일을 Visual Studio에서 열고 실행할 프로젝트를 선택합니다. appsettings.json
파일을 수정해 PallyConEncToken(KMS 토큰) 값을 포함한 각종 설정을 입력합니다. 자세한 사항은 AMS 가이드를 참고하시기 바랍니다.- 소스 코드에
SourceUri
와ContentId
값을 입력합니다. - 프로젝트를 실행합니다.
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;
}