ADS
To use ads you need to configure AVDoris properly
let playerViewController = AVPlayerViewController()
let adsOverlayView = UIView()
let adsConfig = DorisAdsConfig(adContainerVC: playerViewController, adContainerView: adsOverlayView)
let dorisConfig = AVDorisConfig(uiType: .native(playerViewController: playerViewController), playerConfig: .default, adsConfig: adsConfig)
avDoris = AVDorisFactory.create(player: AVPlayer(), config: dorisConfig, output: self)
Note
You have to manage adsOverlayView visibility based on DorisAdsEvent
CSAI (Client-side ads)
VOD Example(VMAP or VAST adTagUrl)
let adURL = "https://pubads.g.doubleclick.net/gampad/ads?sz=640x480&iu=/124319096/external/ad_rule_samples&ciu_szs=300x250&ad_rule=1&impl=s&gdfp_req=1&env=vp&output=vmap&unviewed_position_start=1&cust_params=deployment%3Ddevsite%26sample_ar%3Dpreonly&cmsid=496&vid=short_onecue&correlator="
let contentURL = URL(string: "https://storage.googleapis.com/gvabox/media/samples/stock.mp4")!
let streamType = DorisCSAIImaStreamType.vod(contentURL, adUrl: adURL)
let csaiProvider = DorisCSAIProvider.ima(streamType)
let sourceType = DorisSourceType.csai(csaiProvider)
let source = DorisSource(type: sourceType)
avDoris.load(source: source)
LIVE Example(only VAST adTagUrl)
let vastAdURL = "https://pubads.g.doubleclick.net/gampad/ads?iu=/21775744923/external/single_preroll_skippable&sz=640x480&ciu_szs=300x250%2C728x90&gdfp_req=1&output=vast&unviewed_position_start=1&env=vp&impl=s&correlator="
let contentURL = URL(string: "https://cph-p2p-msl.akamaized.net/hls/live/2000341/test/master.m3u8")!
//if your Live stream has SCTE markers that indicates where to play ads, you can also set any vastAdURL as midrollUrl
let streamType = DorisCSAIImaStreamType.live(contentURL, prerollUrl: vastAdURL, midrollUrl: nil)
let csaiProvider = DorisCSAIProvider.ima(streamType)
let sourceType = DorisSourceType.csai(csaiProvider)
let source = DorisSource(type: sourceType)
avDoris.load(source: source)
Note
content of Live stream will play in background muted when ads are playing
SSAI (Server-side ads)
Yospace SSAI Provider (VOD)
let yospaceStreamUrlString = ""
let streamType = DorisSSAIYospaceStreamType.vod(url: yospaceStreamUrlString)
let ssaiProvider = DorisSSAIProvider.yospace(streamType)
let sourceType = DorisSourceType.ssai(ssaiProvider)
let source = DorisSource(type: sourceType)
avDoris.load(source: source)
Yospace SSAI Provider (LIVE)
let yospaceStreamUrlString = ""
let streamType = DorisSSAIYospaceStreamType.dvrLive(url: yospaceStreamUrlString)
let ssaiProvider = DorisSSAIProvider.yospace(streamType)
let sourceType = DorisSourceType.ssai(ssaiProvider)
let source = DorisSource(type: sourceType)
avDoris.load(source: source)
Google IMA SSAI Provider (VOD)
let imaSSAIVODData = DorisImaVODData(contentSourceId: "2528370", videoId: "tears-of-steel", authToken: nil, adTagParameters: nil)
let streamType = DorisSSAIImaStreamType.vod(imaSSAIVODData)
let ssaiProvider = DorisSSAIProvider.ima(streamType)
let sourceType = DorisSourceType.ssai(ssaiProvider)
let source = DorisSource(type: sourceType)
avDoris.load(source: source)
Google IMA SSAI Provider (LIVE)
let imaSSAIData = DorisImaLiveData(assetKey: "sN_IYUG8STe1ZzhIIE_ksA", authToken: nil, adTagParameters: nil, adTagParametersValidFrom: .distantPast, adTagParametersValidUntil: .distantFuture)
let streamType = DorisSSAIImaStreamType.live(imaSSAIData)
let ssaiProvider = DorisSSAIProvider.ima(streamType)
let sourceType = DorisSourceType.ssai(ssaiProvider)
let source = DorisSource(type: sourceType)
avDoris.load(source: source)
IMA SSAI (LIVE) Ad tag parameters
AVDoris ships with an automated solution to invalidate and request up-to-date ad tag parameters for live IMA streams.
The default ad tag parameters can be provided initially for DorisImaLiveData
AdTagParameters Example:
let adTagParameters = [
// Provide key value pairs.
"iu": "/network_id/directory/ad_unit",
"ppid": "12JD92JD8078S8J29SDOAKC0EF230337",
// Custom parameters can also be provided as a nested dictionary.
// The player will serialize these in the required format.
"cust_params": [
"neighborhood": "drama"
"row": "indienovelas"
]
]
Note
Only String
values, and [String : String]
(for cust_params
) are accepted. Invalid values will be omitted from the stream request.
To enable automatic ad tag parameter invalidation, provide the a time range adTagParametersValidFrom and adTagParametersValidUntil for which the parameters are valid. If nil is provided for this values it is considered by AVDoris that initial parameters are permanently valid during stream playback
When the ad tag parameters expire, AVDoris
will request new parameters through it’s delegate callback.
If the ad tag parameters are requested as a result of a seek, the seek operation will be suspended until valid parameters are provided.
extension ViewController: DorisPlayerOutputProtocol {
func onAdvertisementEvent(_ event: DorisAdsEvent) {
switch event {
case .adTagParametersRequired(let data):
// Date provided for which ad parameters are requested.
let date = data.date
// Provide new ad tag parameters
avdoris.replaceAdTagParameters(
adTagParameters: [:],
validFrom: date.addingTimeInterval(-30),
validUntil: date.addingTimeInterval(+30))
default: return
}
}
}
ADS events
You can handle ads related events by confirming to DorisPlayerOutputProtocol
extension ViewController: DorisPlayerOutputProtocol {
func onAdvertisementEvent(_ event: AVDoris.DorisAdsEvent) {
switch event {
case .adBreakStarted(let adBreak, let pendingSeekPosition): break
case .adBreakEnded(let adBreakEndedData): break
case .adProgressChanged(let adProgressChangedData): break
default: break
}
}
}
Note all possible events can be found here
DorisAdsEvent