> ## 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。

使用 Media3 播放器（`ExoPlayer`、`MediaController`）时，添加 `so.kontext:video-media3` 并直接交给 SDK；见 [Media3 播放器](https://docs.kontext.so/zh/video/sdk/kotlin/media3.md)：

```kotlin theme={null}
import so.kontext.video.media3.track

ads.track(exoPlayer)
```

使用 TTSDK 播放器（`TTVideoEngine`）时，添加 `so.kontext:video-ttsdk`，并以同样方式交给引擎：`ads.track(engine)`；见 [TTSDK 播放器](https://docs.kontext.so/zh/video/sdk/kotlin/ttsdk.md)。

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

```kotlin theme={null}
class MyPlayerAdapter(player: MyPlayer) : VideoAdsPlayer {
    private val player = WeakReference(player)
    override val currentPositionMillis: Long get() = player.get()?.positionMillis ?: 0
    override val isPlaying: Boolean get() = player.get()?.let { it.state == State.PLAYING || it.state == State.BUFFERING } ?: false
}

ads.track(MyPlayerAdapter(myPlayer))
```

如果你的播放器有自己的监听器，实现 `addListener` 和 `removeListener`，并在每次变化时调用 `VideoAdsPlayer.Listener`（`onIsPlayingChanged`、`onSeek`、`onContentChanged`）：观众一暂停叠加广告就会结束。否则叠加广告在屏幕上期间 SDK 每秒检查 `isPlaying` 四次。SDK 持有适配器直到 `destroy()` 或下一次 `track`，所以让适配器弱持有你的播放器。

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


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