SSAI (Server Side Ads Insert) 적용하기 -2 (AWS MediaLive, MediaTailor, CloudFront)

예진욱·2025년 3월 4일

SSAI

목록 보기
2/2

SSAI (Server Side Ads Insert) 적용하기 - 1 (AWS S3, MediaConvert, MediaPackage, MediaTailor, CloudFront)

위 포스팅에 이어서 작성한다.
사전지식이나 개념은 이전에 대부분 설명했으니,
간단하게 MediaLive 와 RTMP, SCTE-35, CUE 가 무엇이고 구성은 어떻게 할지만 간략하게 소개하고 구현해보자.



사전지식


AWS MediaLive?

클라우드 기반의 방송 수준 라이브 비디오 처리 서비스이다.
즉, 실시간으로 들어오는 비디오와 오디오 신호를 다양한 장치에서 재생할 수 있도록 변환(인코딩)하는 역할을 한다.
전통적인 방송 장비 없이도 고품질의 라이브 스트리밍을 구축하고 운영할 수 있도록 지원하며, 안정성, 확장성, 유연성을 제공한다.

주요 기능:

  • 다양한 입력 소스(SDI, RTP, RTMP 등) 지원
    이전 포스팅에서 HLS 가 출력형식임을 배웠다. 여기서는 스트리밍 영상을 클라우드에 전송하기 위해 RTMP 프로토콜을 사용할 예정이다.
  • 다양한 출력 형식(HLS, DASH 등) 지원
  • 고품질 비디오 인코딩 및 트랜스코딩
  • 채널별 설정 및 관리
  • 광고 삽입 및 워터마킹 기능

RTMP?

Real-Time Messaging Protocol의 약자로, Adobe 에서 개발한 스트리밍 프로토콜이다.
주로 라이브 스트리밍에서 비디오와 오디오 데이터를 서버로 전송하는 데 사용된다.
낮은 지연 시간과 높은 안정성을 제공하여 실시간 방송에 적합하다.


SCTE-35?

Society of Cable Telecommunications Engineers 35의 약자로, 디지털 프로그램 삽입 신호를 정의하는 표준이다.
즉, 광고 삽입, 블랙아웃, 콘텐츠 대체와 같은 이벤트를 트리거하는 데 사용되는 신호라고 할 수 있다.
라이브 스트리밍에서 광고를 정확한 시간에 삽입하거나 특정 지역의 콘텐츠를 제한하는 데 필수적인 역할을 한다.

주요 기능:

  • 광고 삽입 신호 전송
  • 콘텐츠 블랙아웃 신호 전송
  • 콘텐츠 대체 신호 전송
  • 정확한 시간 기반 이벤트 트리거

CUE-OUT/IN Marker?


SCTE-35 신호의 일부로, 광고 삽입 또는 콘텐츠 대체 시점을 나타내는 마커라고 할 수 있다.
CUE-OUT 마커는 광고 또는 대체 콘텐츠가 시작되는 시점을,
CUE-IN 마커는 광고 또는 대체 콘텐츠가 종료되는 시점을 나타낸다.
이 마커를 통해 라이브 스트리밍 플랫폼은 정확한 시간에 광고를 삽입하거나 콘텐츠를 대체할 수 있\다.

역할:

  • 정확한 광고 삽입 시점 지정
  • 정확한 콘텐츠 대체 시점 지정
  • 매끄러운 광고 및 콘텐츠 전환 제공





구성도


구성도 스크린샷 및 설명...






OBS Studio 로 테스트 스트리밍 세팅


https://obsproject.com/ 에서 OS 에 맞는 파일을 다운받아 설치한다.

이후 카메라 또는 화면을 송출하도록 소스 목록 에 추가한다.


설정 에서는 방송, 출력, 비디오 탭만 신경쓰면 된다.

방송 은 라이브 스트리밍을 어느 서버에 전송할 것인지 설정하는 탭이다.
아직 서버 설정이 되지 않았으므로, 이런 설정이 있다는 것만 인지해두자.


출력 은 라이브 스트리밍 영상의 비트레이트, 인코더 등을 설정할 수 있다.
OBS 를 시작하면 사용자의 목적, 송출할 영상에 따라 설정을 추천해주어 기본값을 지정해주지만.. 그래도 설정은 한 번 보고 넘어가보자.
비트레이트 값이 너무 크면 영상의 크기가 커져 AWS 비용이 많이 나올 수 있어 적절한 값으로 설정했고,
인코더는 OBS 에서 기본적으로 추천한 값을 사용했다.
오디오까지는 디테일하게 테스트하지 않을 것이므로 오디오 관련 설정은 건너뛰자.


비디오 탭에서는 영상의 해상도 및 FPS(Frame Per Sec) 를 지정할 수 있다.
이 역시 AWS 과금이 두려워 적절하게 낮은 값으로 설정했다.

이제 MediaPackage, MediaLive 를 설정해보자.






MediaPackage 채널 생성


앞선 포스팅에서 Mediapackage 는 VOD 대상이었으므로, S3 로부터 Assets 을 설정했었다.
하지만 여기선 라이브 스트리밍을 송출할 것이므로, 채널 을 생성해보자.

AWS MediaPackage 의 좌측 탭의 라이브 v1 -> 채널 -> 채널 생성으로 진입한다.

나는 미리 테스트용으로 하나 만들어 둔 상태라 원래는 채널이 없는 상태여야 한다.

이후 채널의 ID 및 설명을 이것이 라이브 스트리밍 테스트용이라는 것을 쉽게 인지할 수 있게 지정해 생성해보자.

그러면 HLS 수집 endpoint 가 자동으로 두 개 생성된다.
여기서 Origin endpoint 를 따로 추가해야 한다.
이 Origin endpoint 역시 테스트용으로 미리 하나 만들어 둔 것으로, 원래는 채널을 생성했다고 바로 origin endpoint 가 생성되지 않는다.

이제 origin enpoint 에 대한 ID, 설명을 작성하고
패키징을 이전 포스팅과 같이 HLS 로 설정,
세그먼트 duration 은 적절하게 설정한다. (10초 이내)






MediaLive 생성 및 MediaPackage, OBS Studio 연동


AWS MediaLive 에서 입력 을 우선 생성해보자.

이 입력탭은 obs studio 와 같은 외부에서 어떤 프로토콜로 보낼건지, 방화벽 설정은 어떻게 할 것인지 등의 설정을 하는 탭이다.


입력 이름을 obs-studio 와 같은 값으로 입력하고,
입력 유형을 RTMP(푸시) 로 설정하자.


보안그룹은 테스트를 위해서 모든 IP 에서 접근 가능하게 0.0.0.0/0 으로 설정한다.

입력 대상은 STANDARD_INPUT 으로 설정 후 application name 과 instance
이름을 적절하게 설정하자.

  • 여기서 설정하는 값들은 해당 input 하는 서버의 rtmp endpoint 가 된다.
  • 입력 서버는 안정성을 위해 기본적으로 두 개를 제공한다.

이제 MediaLive 의 채널 탭에 진입해 채널 생성을 해보자.
여기서 생성되는 채널은 MediaPackage 로 송출하는 역할이라고 보면 된다.


우선 채널 및 입력 세부 정보 에서

  • 채널 이름
  • IAM 역할
    여기서는 기존 역할을 사용했으나, 템플릿에서 역할 생성을 통해 추천 제공되는 IAM Role 도 사용 가능하다.
  • 채널 템플릿
    HTTP Live Streaming (MediaPackage) 를 선택한다.
  • 채널 클래스
    STANDARD 를 선택

이후 해상도, 최대 입력 비트레이트 값은 막대한 과금 방지를 위해 적절한 값을 설정하고, 입력 코덱은 AVC 로 정상 동작이 확인되었다.
출력 전송은 퍼블릭으로 설정하자.


이후 좌측 탭의 입력 첨부 -> 입력 첨부로 진입해 방금 MediaLive 에서 만든 입력(input)과 연동한다.
이름도 적절하게 입력하자.


이후 출력그룹에 생성된 MediaPackage 에 대한 출력의 채널탭 설정을 해보자.
HLS 출력 사용 설정, ID 설정, 이름 등을 적절하게 설정한다.

여기서 주의할 점은 출력 10: 에 이상한 embedded 출력이 껴있었는데,
이걸 제거하지 않으면 채널 생성이 되지 않는다.
이거 때문에 몇 분을 날린지 모르겠다.. 아직은 AWS Media 서비스 자체가 B2C 가 아닌 B2B 서비스이다 보니 이런 자잘한 설정들이 불친절한 것들이 매우 많은 것 같다.. AWS 분발하자


자, 이제는 정상적으로 idle(유휴) 상태 채널 생성이 완료되었다.
우측 상단의 시작 을 눌러 송출을 시작해보자.


그러면 OBS Studio 에서 방송 영상 전송 대상 서버를 확인하기 위해 다시 입력 탭에 진입한다.

입력 보안 그룹의 허용 목록 규칙이 0.0.0.0/0 인지,
입력의 유형이 RTMP_PUSH 인지 다시 한 번 확인한 후 엔드포인트를 보자.

형식이 rtmp://ip:1935/$application_name/$application_instance 와 같이 두 개가 설정되어 있다.
이는 아까 설정했던 endpoint 값이 /applicationname/application_name/application_instance 형태로 붙은 것으로 확인된다.

이 중에 하나를 복사하자. 둘 중에 아무거나 해도 상관없다.


다시 OBS Studio 로 돌아와 설정의 방송 탭에 아래와 같이 입력한다.

  • 서버 : rtmp://IP주소:1935/$application_name
  • 스트림 키 : $application_instance

그리고 방송 시작 을 하고,
다시 AWS MediaLive Channel 에서 생성한 채널로 진입해 정상적으로 방송 송출이 잘 되는지 확인해보자.


채널 상태가 Running 이고, 정상적으로 라이브 스트리밍이 잘 송출되는 것을 볼 수 있다.
이 화면에서는 Pipeline 1 으로 송출되고 있고, Pipeline 0 에는 OBS Studio 를 연결하지 않았으므로 error alert 이 노출된다.
물론 실제 기업 방송에서는 이중화 송출을 하겠지만 여기서는 송출이 잘 되는지만 확인해도 충분하다.

이제는 hls.js 에서 확인해보자.
AWS MediaPackage 의 채널에서 생성된 채널을 진입 후,


미리보기 를 진입하면 VOD 처럼 hls.js 로 연결된다.

MediaPackage 의 도메인으로도 잘 송출되는 것을 확인할 수 있다.






MediaTailor, CloudFront 연동


AWS MediaTailor
에서 -> 구성 생성에 진입하자.

이름을 적절히 지정하고,
콘텐츠 소스는 방금 전 hls.js 의 ?src= 뒤의 https 주소를 입력하자. (파일명 제외)
광고 결정 서버는 이전 포스팅에서 사용한 값을 그대로 사용해보자.

https://pubads.g.doubleclick.net/gampad/ads?iu=/21775744923/external/single_ad_samples&sz=640x480&cust_params=sample_ct%3Dlinear&ciu_szs=300x250%2C728x90&gdfp_req=1&output=vast&unviewed_position_start=1&env=vp&impl=s&correlator=

추가적으로 개인화 세부 정보에서 광고를 커스텀하게 설정할 수도 있으나, 일단 동작 확인이 우선이므로 여기서는 스킵하고 구성을 생성해보자.


이제는 AWS CloudFront 를 진입해 Live Streaming 용 도메인을 생성해보자.


Origin Domain : 방금 생성한 Live Streaming 용 MediaTailor 채널의 도메인
Origin Path : 없음
이름 : 자동 생성된 값을 사용하거나 인식 가능한 값을 삽입
Origin Shield : 조금 더 빠른 캐싱을 위해 서울 리전을 선택


캐시 정책은 CachingOptimized 보다는 MediaPackage 정책을 지정하고,
WAF (방화벽) 은 켜놓기만 해도 몇 달러가 그냥 나가니 우선 비활성화로 두고 이 CloudFront 서비스는 잠깐만 쓰고 비활성화 해두자.


CloudFront 까지 연동되었으면 이제 다시 hls.js 로 CloudFront 도메인으로 요청해보자.
https://hlsjs.video-dev.org/demo/?src= +
https://cloudfront도메인 +
MediaTailor의endpoint ex) /v1/master/abc/def/AdCampaign2 +
파일명 -> 여기서 파일명은 MediaTailor 의 Origin 이 MediaPackage 이므로 MediaPackage 에서 접근 가능한 파일명으로 지정하면 된다.

최종적으로,
ex) https://hlsjs.video-dev.org/demo/?src=https://qwer.cloudfront.net/v1/master/abc/def/AdCampaign2/index.m3u8
와 같이 요청해보자.

정상적으로 잘 송출될 것이다.






광고 삽입, SCTE-35 적용

TODO..






hls.js 네트워크 분석 -> CUE-OUT/IN 동작 확인

TODO..

profile
Spring 백엔드 개발자

0개의 댓글