> ## Documentation Index
> Fetch the complete documentation index at: https://docs.kontext.so/llms.txt
> Use this file to discover all available pages before exploring further.

# 你的播放器

> 把你的内容播放器交给 SDK：部分播放器开箱即用，其他播放器实现 VideoAdsPlayer。

每次请求和事件都带有观众在这一集中的位置，叠加广告和暂停广告也会跟随播放：叠加广告只在内容播放时展示，观众一暂停就消失；暂停广告在展示期间内容暂停过、之后再次播放时消失，无论观众如何恢复。剧集开始播放后，把播放器交给 SDK。

使用 `AVPlayer` 时，直接交给 SDK；SDK 会读取它的时间并关注它的播放（见 [AVPlayer](https://docs.kontext.so/zh/video/sdk/swift/avplayer.md)）：

```swift theme={null}
ads.track(player)
```

使用 TTSDK 播放器（`TTVideoEngine`）时，添加同一个包中的 `KontextVideoTTSDK` 产品并交给引擎：`ads.track(ttVideoEngine: engine) { episode.id }`；见 [TTSDK 播放器](https://docs.kontext.so/zh/video/sdk/swift/ttsdk.md)。

使用其他播放器时，让它遵循 `VideoAdsPlayer`：它的位置（秒），以及它是否在播放。缓冲和拖动进度都算作播放。

```swift theme={null}
extension MyPlayer: VideoAdsPlayer {
    var currentTime: TimeInterval { position }
    var isPlaying: Bool { state == .playing || state == .buffering }
}

ads.track(myPlayer)
```

如果你的播放器已经发布自己的状态，把它作为 `isPlayingPublisher` 返回，观众一暂停叠加广告就会结束；否则叠加广告在屏幕上期间 SDK 每秒检查 `isPlaying` 四次。SDK 会保留你的 `VideoAdsPlayer` 直到 `destroy()` 或下一次 `track(_:)`，因此一个小的包装类型不需要额外的引用；`AVPlayer` 被弱持有，因为它归你的应用所有。引用了 `VideoAds`（或拥有它的对象）的包装类型会让两者一直存活到 `destroy()`：观众离开时调用 `destroy()`，或者不要在其中引用广告。

在这一集开始播放时调用 `track(_:)`，而不是在创建 `VideoAds` 时：在那之前播放器的时间属于上一集。在那之前 SDK 发送 0，这对预取来说是正确的。


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.