保存和加载广告连播书签
使用集合让一切井井有条
根据您的偏好保存内容并对其进行分类。
本指南介绍了在为视频点播 (VOD) 串流使用动态广告插播 (DAI) 时,如何使用 IMA DAI SDK 实现书签功能。这假定您已成功实现 IMA DAI,例如开始使用中所述的实现。
什么是书签?
书签功能可用于保存内容流中的某个具体点,方便之后返回同一位置。假设一位用户观看某内容 5 分钟后离开了相应视频流,然后又返回观看。由于书签可保存用户在视频流中的位置,因此用户返回时便可从上次停下的位置继续观看,畅享流畅一致的体验。
DAI 书签的内部运作
为 DAI 直播添加书签时,您必须记录直播 ID 和用户离开视频的时间。当用户返回时,重新请求数据流并跳转到保存的时间点。由于请求的直播的每个实例都可能包含时长不同的广告插播,因此仅保存直播时间是行不通的。您真正想做的是从同一内容时间继续播放。
转化方法大显身手
IMA DAI SDK 提供了一对方法,用于请求给定直播时间的内容时间,以及给定内容时间的直播时间。使用这些转换方法,您可以存储书签的内容时间,然后在数据流的新实例中跳转到相应的数据流时间。以下是该方法,其中包含指向一个示例应用的链接,该示例应用展示了有效的书签实现。
保存和加载广告连播书签
在内容播放器暂停时保存书签。
onPause() {
var bookmarkTime = Math.floor(
streamManager.contentTimeForStreamTime(videoElement.currentTime));
}
正在加载书签
重新请求数据流时加载书签。
function loadUrl(url) {
hls.on(Hls.Events.MANIFEST_PARSED, () => {
var startTime = 0;
if (bookmarkTime) {
var startTime = streamManager.streamTimeForContentTime(bookmarkTime);
// Seeking on load triggers the onSeekEnd event, so treat this seek as
// if it's snapback. Without this, resuming at a bookmark kicks you
// back to the ad before the bookmark.
isSnapback = true;
}
hls.startLoad(startTime);
videoElement.addEventListener('loadedmetadata', () => { videoElement.play(); });
});
hls.loadSource(url);
hls.attachMedia(videoElement);
}
示例应用
下载示例应用,查看书签实现。
如未另行说明,那么本页面中的内容已根据知识共享署名 4.0 许可获得了许可,并且代码示例已根据 Apache 2.0 许可获得了许可。有关详情,请参阅 Google 开发者网站政策。Java 是 Oracle 和/或其关联公司的注册商标。
最后更新时间 (UTC):2025-08-21。
[null,null,["最后更新时间 (UTC):2025-08-21。"],[[["\u003cp\u003eThis guide explains how to implement bookmarking in video-on-demand (VOD) streams using the IMA DAI SDK for a seamless viewing experience when users return to previously watched content.\u003c/p\u003e\n"],["\u003cp\u003eBookmarking with DAI involves saving the content time, not the stream time, to ensure accurate resumption due to potential ad break variations.\u003c/p\u003e\n"],["\u003cp\u003eThe IMA DAI SDK provides methods \u003ccode\u003econtentTimeForStreamTime\u003c/code\u003e and \u003ccode\u003estreamTimeForContentTime\u003c/code\u003e to convert between stream and content time for bookmarking functionality.\u003c/p\u003e\n"],["\u003cp\u003eA sample app demonstrating a working bookmarking implementation is available for download and reference.\u003c/p\u003e\n"]]],[],null,["# Save and load ad stream bookmarks\n\nThis guide shows how to implement bookmarking using the IMA DAI SDK\nwhen using Dynamic Ad Insertion (DAI) for video-on-demand (VOD) streams.\nThis assumes a working IMA DAI implementation, such as the one presented in\n\n[Get Started](/interactive-media-ads/docs/sdks/html5/dai-quickstart).\n\n\nWhat is bookmarking?\n--------------------\n\nBookmarking is the ability to save and then return to a specific point\nin the content stream. Suppose a user watches five minutes of content,\nleaves the video stream, and then returns to it. Bookmarking saves the\nuser's position in the stream so the stream can pick up from where it\nleft off, providing a seamless experience to the viewer.\n\nDAI bookmarking under the hood\n------------------------------\n\nWhen bookmarking a DAI stream, you must record the stream id and time\nwhen the user leaves the video. When the user returns, re-request the\nstream and seek to the saved time. Since each instance of the requested\nstream can have ad breaks of different durations simply saving the stream\ntime won't work. What you really want to do is continue from the same\n**content time**.\n\nConversion methods to the rescue\n--------------------------------\n\nThe IMA DAI SDK provides a pair of methods to request the **content time**\nfor a given **stream time** and the **stream time** for a given **content\ntime** . Using these conversion methods you can store the bookmarked\n**content time** and then seek to the corresponding **stream time** in\nthe new instance of the stream. Here's the approach, including a link\nto a sample app that shows a working bookmarking implementation.\n\nSave and load ad stream bookmarks\n---------------------------------\n\nSave a bookmark when the content player is paused. \n\n onPause() {\n var bookmarkTime = Math.floor(\n streamManager.contentTimeForStreamTime(videoElement.currentTime));\n }\n\nLoading bookmarks\n-----------------\n\nLoad the bookmark when re-requesting a stream. \n\n function loadUrl(url) {\n hls.on(Hls.Events.MANIFEST_PARSED, () =\u003e {\n var startTime = 0;\n if (bookmarkTime) {\n var startTime = streamManager.streamTimeForContentTime(bookmarkTime);\n // Seeking on load triggers the onSeekEnd event, so treat this seek as\n // if it's snapback. Without this, resuming at a bookmark kicks you\n // back to the ad before the bookmark.\n isSnapback = true;\n }\n hls.startLoad(startTime);\n videoElement.addEventListener('loadedmetadata', () =\u003e { videoElement.play(); });\n });\n hls.loadSource(url);\n hls.attachMedia(videoElement);\n }\n\nSample app\n----------\n\n[Download the Sample app](//github.com/googleads/googleads-ima-html5-dai)\nto see a bookmarking implementation."]]