AWS 기술 블로그

AI/ML을 기반으로 한 서버리스 라이브 스트리밍/VOD 서비스 시작하기

동영상 중심의 컨텐츠 소비 패턴이 계속해서 확대됨에 따라, 실시간 방송 스트리밍이나 OTT와 같은 미디어 서비스 구축에 많은 관심이 쏠리고 있습니다. 하지만 온프레미스 기반의 미디어 서비스의 경우 이벤트나 컨텐츠에 따라 트래픽을 예측하기 어렵고, 그렇기 때문에 최대 시청자 혹은 컨텐츠 소비자의 트래픽에 맞춰 인프라를 운영해야 합니다. 이는 비용면에서도 비효율적이며, 예상한 것보다 많은 트래픽에 맞춰 확장하기도 어렵습니다. 이러한 문제를 해결하기 위해, NetflixFox를 포함한 많은 고객들이 AWS 클라우드에서  미디어 서비스를 운영하고 있습니다.

AWS의 다양한 미디어 서비스를 사용하시면 라이브 스트리밍이나 VOD와 같은 OTT 서비스를 손쉽게 구축할 수 있습니다. 이와 함께 AWS의 이벤트 기반 서버리스 서비스, 그리고 AI/ML을 연동하면 서비스되고 있는 영상을 분석하여 컨텐츠 사용자에게 더 나은 경험을 제공할 수 있습니다. 그리고 AWS CDK를 활용하여 미디어 서비스에 필요한 모든 인프라와 백엔드 리소스를 하나의 코드 프로젝트 안에서 관리할 수 있습니다.  이번 글에서는 AWS에서 제공하는 다양한 미디어 서비스를 활용한 간단한 솔루션을 통해 위와 같은 장점을 직접 확인해 보도록 하겠습니다.

솔루션 개요

이 솔루션은 스포츠 경기와 같은 실시간 이벤트를 스트리밍하고, 스트리밍 중인 영상을 실시간으로 분석하여 필요한 영상만을 VOD로 제공하는 솔루션입니다. 스포츠 이벤트를 스트리밍하며 Man of the Match 선수의 하이라이트 영상만을 제공한다든지, 좋아하는 아이돌의 영상을 스트리밍하면서 특정 멤버의 쇼츠 영상을 제공하는 등 다양한 방식으로 활용될 수 있습니다.

솔루션 특징

이 솔루션의 특징은 다음과 같습니다.

AWS Elemental 서비스로 미디어 서비스 시작하기

이 솔루션은 다양한 AWS Elemental 서비스를 활용하여 어떻게 미디어 서비스를 시작할 수 있는지 보여줍니다.  Amazon Elemental MediaLive는 동영상을 실시간으로 인코딩하여 고품질 스트림으로 압축해 주는 실시간 동영상 처리 서비스입니다. MediaLive에서 인코딩된 동영상은 Amazon Elemental MediaPackage로 전달되어, 동영상 패키징 및 주요 DVR 기능 추가 등 배포를 위한 준비를 마칩니다. MediaPackage에 저장된 동영상은 Amazon CloudFront를 통해 낮은 응답속도와 빠른 전송 속도로 컨텐츠 소비자에게 전달됩니다.

서버리스 백엔드에서는 Amazon Elemental MediaConvert를 사용해 아주 간단히 원본 영상을 VOD로 서비스할 수 있도록 변환합니다. 이때 미리 생성해 놓은 작업 템플릿을 활용하여 복잡한 설정을 매번 하지 않고 일관된 화질의 영상을 사용자에게 제공할 수 있습니다.

AWS 인공지능 서비스를 활용한 손쉬운 영상 분석

이 솔루션에서는 원본 영상에 나오는 유명인(Celebrity)을 식별하기 위해 Amazon Rekognition 서비스를 사용합니다. Amazon Rekognition 서비스를 사용하면 복잡한 기계 학습 및 인프라 구축 과정 없이, API 호출 한 번으로 동영상을 분석할 수 있습니다. 수십만 명의 유명인을 자동으로 인식할 수 있도록 해줍니다. 데모 시나리오에 사용된 영상에 등장하는 인물들의 경우 이미 유명인으로 등록되어 있기 때문에 별도의 작업 없이 바로 API에 의해 식별됩니다. 만약 유명인으로 등록되지 않은 사람을 식별하기 위해서는 Rekognition의 Collection 기능을 사용할 수 있습니다.

Rekognition 외에도 AWS의 다양한 인공지능 서비스를 활용하면 고객 경험을 풍부하게 하고 미디어 컨텐츠의 생애 가치를 높일 수 있습니다. 예를 들어 Amazon Transcribe를 통해 동영상에 자막을 입히고, Amazon Personalize를 사용해 시청 기록을 바탕으로 사용자에게 추천 서비스를 제공할 수도 있을 것입니다. 다양한 인공지능 서비스를 사용할 경우 AWS Step Functions를 사용한다면 리소스나 시간에 대한 제약 없이 필요한 기능을 위한 비즈니스 로직을 구현할 수 있습니다.

서버리스 아키텍처에서 다양한 이벤트 처리하기

이 솔루션의 세 번째 특징은 이벤트 기반 시스템에서 발생할 수 있는 다양한 타입의 이벤트를 어떻게 활용하고 처리할 수 있는지 보여준다는 점입니다. 예를 들어 첫 번째 이벤트의 경우 Elemental MediaLive의 아카이브 출력 그룹에 의해 Amazon S3 버킷에 원본 영상이 저장되면 발생하고, AWS Lambda가 호출되어 이벤트에 대한 정보를  Amazon SQS로 전송합니다. 또한 SQS 대기열의 메시지가 들어왔을 때 어떻게 Lambda가 이를 자동으로 감지하고 큐에서 가져가는 방법, Elemental MediaConvert에 의해 영상 변환이 완료되었을 때 이벤트를 발생시키는 등의 방법을 이 솔루션을 통해 확인할 수 있습니다.

AWS CDK와 AWS Amplify를 연동하여 서버리스 Full Stack 개발하기

이 솔루션에 사용된 모든 인프라와 서버리스 리소스는 AWS Cloud Development Kit (AWS CDK)를 사용해 정의되고 배포됩니다. 그리고 데모 시연을 위한 간단한 프론트엔드 서비스는 AWS Amplify로 개발되었습니다.

AWS CDK는 익숙한 프로그래밍 언어를 사용하여 필요한 인프라를 정의할 수 있도록 합니다. 그뿐만 아니라 CDK를 활용하면 인프라 내에 정의된 서비스 사이의 관계와 서비스에 처리할 로직까지 한 번에 정의하여 서버리스 애플리케이션을 개발할 수 있습니다. 여기에 사용자에게 제공할 웹서비스 애플리케이션을 동일한 프로젝트 내에 별도의 디렉토리를 생성하여 관리하면, 프론트엔드와 백엔드, 인프라까지 서비스에 필요한 모든 리소스를 하나의 프로젝트 안에서 관리할 수 있습니다. 이러한 방식은 개발 및 관리가 용이해질 뿐만 아니라 지속적 통합 및 전달(CI/CD) 파이프라인과 통합되어 더 빠른 테스트 및 배포가 가능하도록 해줍니다.

AWS Amplify 역시 Amazon DynamoDBAmazon API Gateway와 같이 서버리스 서비스 개발에 필요한 인프라를 배포하는 기능을 가지고 있습니다. 그 때문에 Amplify를 CDK와 함께 사용하는 경우, 각각의 서비스에서 인프라를 배포하면  관리 지점이 늘어나 프로젝트가 복잡해질 수 있습니다.

이 솔루션은 이러한 문제를 어떻게 해결할 수 있는지 보여줍니다. 모든 인프라는 AWS CDK 내에서 배포하고, 이를 JSON 형태로 Export하여 Amplify에서 이를 Import하여 사용하면 모든 인프라는 CDK에서 배포 관리하면서 Amplify가 제공하는 좋은 기능을 활용할 수 있습니다.

단계 요약

이 솔루션은 아래와 같은 단계로 배포 및 테스트해 볼 수 있습니다.

  • 1 단계: CDK Code 다운로드 및 배포(deploy)
  • 2 단계: OBS를 사용하여 Amazon MediaLive Input으로 동영상 송출
  • 3 단계: 프론트 엔드를 실행하여 스트리밍 및 분석된 영상 컨텐츠 확인

사전 준비사항

솔루션을 배포하기 위해서는 아래와 같은 사항을 미리 준비해야 합니다.

  1. AWS 계정AWS 계정을 준비합니다.
  2. AWS CLI이 솔루션의 데모를 실행하기 위해서는 AWS CLI 환경에서 Profile이 설정되어 있어야 합니다. 다음 링크들을 참조하면, AWS CLI를 설치하고 AWS Profile을 구성하실 수 있습니다.
  3. AWS CDK와 AWS Amplify다음 링크를 활용하시면, 데모 실행에 필요한 AWS CDK와 Amplify를 설치하실 수 있습니다.

단계 1 : CDK Code 다운로드 및 배포(deploy)

이 단계에서는 AWS CDK와 AWS Amplify로 구성된 백엔드와 프론트엔드 코드를 사용해 필요한 인프라와 코드를 배포합니다.

  1. GitHub에서 저장소(repository)를 복제(clone)합니다.
    git clone https://github.com/aws-samples/serverless-smart-streaming-engine
  2. MediaReplayEngine 디렉토리로 들어가 npm install 명령어로 필요한 패키지를 설치합니다.
    cd serverless-smart-streaming-engine
    npm install
  3. 솔루션을 배포하고자 하는 사용자의 CLI 프로파일을 설정합니다.
    export AWS_PROFILE= <your aws account profile>
  4. (처음 CDK를 사용할 경우) 해당 AWS 계정을 부트스트래핑합니다.
    cdk bootstrap
  5. cdk deploy 명령어를 사용하여 CDK에 정의된 인프라를 배포합니다. -O 옵션을 사용해 배포된 인프라의 정보를 파일에 저장하여, 다음에 프론트엔드에서 import해 사용할 수 있도록 합니다.
    cdk deploy -O ./frontend/src/cdk-exports.json

단계 2 : OBS를 사용 MediaLive Input으로 동영상 송출

이 단계에서는 Open Broadcaster Software를 사용해 동영상을 직접 송출합니다. OBS를 사용해 로컬 컴퓨터에서 MediaLive로 영상을 송출하는 방법을 상세히 알고 싶으시면 이 링크를 참조하세요.

  1. 이제 MediaLive로 영상을 송출해 보도록 하겠습니다. 테스트 영상 송출을 위해서는 OBS(Open Broadcaster Software)가 필요합니다. 링크를 클릭하여 OBS를 다운로드 받아 설치합니다.
  2. MediaLive 채널을 시작합니다. 이 솔루션에서 배포한 MediaLive 채널은 단계 1의 step 5에서 생성된 cdk-exports.json 파일 안에 MyMediaLiveChannelArn 값의 채널 아이디(마지막 7개 숫자)를 확인하시면 됩니다."MyMediaLiveChannelArn": "arn:aws:medialive:<region>:<account id>:channel:<channel id>",위의 채널 ID를 옵션으로 아래 cli 명령어를 수행합니다.aws medialive start-channel --region <region> --channel-id <channel id>",채널 시작이 완료될 때까지는 몇 분 정도 소요됩니다.
  3. ./frontend/src/cdk-exports.json에서 MyMediaLiveChannelDestPri 값을 복사합니다. 복사한 값은 다음과 같은 포맷을 가지게 됩니다.rtmp://<ip address>:<port>/<stream key>
  4. OBS를 실행합니다. 창 오른쪽 하단에 Settings를 클릭하고, Stream을 선택합니다. Service는 Custom을 선택하고, Server와 Stream Key는 MediaLive Input의 MyMediaLiveChannelDestPri 값에 따라 설정합니다. 예를 들어 MediaLive Input의 endpoint rtmp:// rtmp://555.555.555.555:9999/live/myevent라면 다음과 같이 설정하면 됩니다.
    • Server: rtmp://555.555.555.555:9999/live
    • Stream Key: myevent

  5. 원하는 영상을 플레이합니다. 로컬 컴퓨터에 저장된 파일, 혹은 유튜브 영상도 가능합니다. 이번 데모에서는 2012 re:Invent Day 2: Fireside Chat with Jeff Bezos & Werner Vogels를 사용하여 Jeff Bezos와 Werner Vogels를 식별해 쇼츠 영상을 제작해 보도록 하겠습니다.
  6. OBS 하단의 Source에서 + 버튼을 클릭하고, Window Capture를 클릭합니다. 동영상이 재생되고 있는 윈도우를 선택하고, Start Streaming 버튼을 클릭하면 영상이 송출되기 시작합니다.

단계 3 : 프론트 엔드를 실행하여 스트리밍 및 분석된 영상 컨텐츠 확인

이 단계에서는 프론트엔드 애플리케이션을 실행하여, 스트리밍되고 있는 영상과 백엔드를 거쳐 분석이 완료된 클립을 직접 확인합니다.

  1. frontend 디렉토리로 들어가 패키지를 설치합니다.
    cd ./frontend
    npm install
  2. npm start로 프론트엔드 서비스를 시작합니다.
    npm start
  3. 처음 서비스를 시작하면 내비게이션 바 바로 아래 OBS를 통해 스트리밍되고 있는 영상이 서비스되는 것을 확인할 수 있습니다. 2~3분 정도 기다린 후 오른쪽 위 Celebrities 메뉴를 클릭하면 영상에 등장하는 배우 별로 버튼이 제공됩니다. 버튼을 클릭하면 해당 배우가 등장하는 1분짜리 쇼츠 영상을 확인할 수 있습니다.
  4. DynamoDB 테이블을 보면 영상에 등장한 모든 배우의 이름과 시간, 그리고 쇼츠 영상의 저장 경로가 저장된 것을 확인할 수 있습니다.

리소스 정리하기

이 솔루션에서 사용하는 모든 인프라는 CDK를 통해 생성, 배포되었으므로 cdk destroy 명령어만 수행하시면 됩니다.

cdk destroy

결론

이번 게시글에서는 AWS의 미디어와 서버리스, 인공지능 서비스를 활용하여 실시간 스트리밍 영상을 실시간으로 분석하여 VOD 클립으로 제공하는 서버리스 솔루션을 구현해 보았습니다. AWS Elemental 서비스를 사용하시면 클라우드 환경 위에서 빠르고 쉽게 고화질의 영상 서비스를 시작할 수 있습니다. 영상 변환 작업을 위한 워크플로우는 AWS 서버리스 서비스를 사용해 물리적 인프라 구축이나 운영에 대한 고민 없이 확장성이 뛰어난 시스템을 구축할 수 있습니다. 그리고 Amazon Rekognition과 같은 인공지능 서비스는 사전 훈련된 모델을 제공하여 API 호출만으로 간단히 동영상을 분석할 수 있도록 해줍니다. 마지막으로 서비스에 사용된 모든 리소스를 CDK와 Amplify를 사용해 손쉽게 개발, 관리, 배포할 수 있습니다. github의 코드를 다운로드 받아 더 다양한 인공지능 서비스로 영상을 분석하고, AWS Step Functions를 활용하여 Workflow를 구현하고, Amazon Cognito로 인증 서비스를 구현하는 등으로 변경, 활용해 보시면 어렵게 느껴졌던 클라우드 기반 미디어 서비스가 더 쉽고 친숙하게 느껴지실 것입니다.

현 진환

현 진환

현진환 솔루션즈 아키텍트는 다양한 워크로드에 대한 개발 경험을 바탕으로 고객이 최적의 솔루션을 선택하여 비즈니스 성과를 달성할 수 있도록 고객과 함께 효율적인 아키텍처를 구성하는 역할을 수행하고 있습니다.