본문으로 건너뛰기

외부 화면 송출 (Screen Casting To TV)

iOS 환경에서 실시간 TV 스트림에 대체 광고를 삽입할 때, Flower SDK는 내부적으로 Proxy Server를 구동하여 원본 manifest(m3u8/mpd)를 실시간으로 가공합니다. 이로 인해 changeChannelUrl()이 반환하는 URL은 원본 CDN 주소가 아니라 앱 내부 Proxy Server를 가리키는 LoopBack(루프백) 주소입니다.

LoopBack 주소는 해당 URL을 생성한 기기 내부에서만 접근 가능합니다. 이 URL을 다른 화면(예: AirPlay, Chromecast, Smart TV 등 외부 TV)으로 그대로 전달하면 외부 화면에서 주소를 해석할 수 없어 재생이 실패합니다.

이러한 외부 화면 송출(Screen Casting) 시나리오에서는 FlowerAdsManager.getScreenCastingUrl()을 사용하여 외부 화면에서도 재생 가능한 URL을 받아 사용해야 합니다.

FlowerAdsManager.getScreenCastingUrl

외부 화면 송출에 사용 가능한 스트림 URL을 반환합니다.

매개변수유형설명
(없음)
반환값유형설명
screenCastingUrlString외부 화면에서 재생 가능한 URL.
송출용 URL을 생성할 수 없는 경우 원본 스트림 URL을 반환합니다.
changeChannelUrl() 호출 이전에 호출된 경우에는 빈 문자열("")을 반환합니다.
사용 조건
  • getScreenCastingUrl()은 반드시 changeChannelUrl()호출한 이후에 호출해야 합니다. 그 이전에 호출하면 Proxy Server가 아직 초기화되지 않았기 때문에 빈 문자열("")이 반환됩니다.
  • 내부 오류가 발생한 경우 SDK는 원본 스트림 URL을 그대로 반환하므로 호출 자체는 항상 안전하지만, 이 경우 외부 화면에서는 광고 대체가 적용되지 않습니다.

예시

private func playLinearTv() {
// TODO GUIDE: change original LinearTV stream url by adView.adsManager.changeChannelUrl
let changedChannelUrl = flowerAdView.adsManager.changeChannelUrl(
videoUrl: "https://XXX",
adTagUrl: "https://ad_request",
channelId: "100",
extraParams: ["custom-param": "custom-param-value"],
mediaPlayerHook: mediaPlayerHook,
adTagHeaders: ["custom-ad-header": "custom-ad-header-value"],
channelStreamHeaders: ["custom-stream-header": "custom-stream-header-value"],
prerollAdTagUrl: nil
)

// TODO GUIDE: 로컬 플레이어에는 LoopBack URL을 그대로 사용
player.replaceCurrentItem(with: AVPlayerItem(url: URL(string: changedChannelUrl)!))
player.play()
}

// TODO GUIDE: 외부 화면(예: TV)으로 송출할 때는 getScreenCastingUrl을 사용
func startCastingToTv() {
// 반드시 changeChannelUrl() 이후에 호출해야 합니다.
// 오류 시 원본 스트림 URL을 반환하므로 호출 자체는 항상 안전합니다.
let castingUrl = flowerAdView.adsManager.getScreenCastingUrl()

castSession.loadMedia(url: castingUrl)
}

사용 시점

상황사용할 URL
앱 내부 로컬 재생changeChannelUrl()이 반환한 URL
외부 화면으로 송출 (AirPlay 수신기, Chromecast, Smart TV 등)getScreenCastingUrl()이 반환한 URL