إعداد قوائم تشغيل إعلانية تلقائيًا
تنظيم صفحاتك في مجموعات
يمكنك حفظ المحتوى وتصنيفه حسب إعداداتك المفضّلة.
تتيح أداة تطوير برامج HTML5 لإعلانات الوسائط التفاعلية قوائم تشغيل الإعلانات المبرمَجة بالكامل. تُستخدَم هذه الميزة لإدراج الفواصل الإعلانية في المحتوى على النحو المحدّد في
مدير إعلانات Google عند عرض إعلاناتك. ويبسّط هذا الإجراء أيضًا رمز مشغّل الفيديو
اللازم لتفعيل الفواصل الإعلانية، بما في ذلك إعلانات ما قبل التشغيل وأثناء التشغيل وما بعد التشغيل.
- عند إنشاء
AdsManager
، يتمّ تمرير contentPlayback
كائن باستخدام طلب getAdsManager. يجب أن يحتوي هذا العنصر
على سمة currentTime
تعرض موضع شريط التمرير الحالي
في الفيديو. إذا كنت تستخدم عنصر HTML5 video
لعرض المحتوى، يمكنك ببساطة تمرير هذا العنصر إلى حزمة تطوير البرامج (SDK). يُستخدَم هذا العنصر
لتتبُّع مستوى تقدّم تشغيل المحتوى حتى تتم إدراج الفواصل الإعلانية
تلقائيًا في الأوقات المحدّدة في "مدير إعلانات Google". عليك أيضًا إبلاغ
حزمة SDK بأنّك تريدها أن تتعامل مع حالة المحتوى نيابةً عنك.
var adsRenderingSettings = new google.ima.AdsRenderingSettings();
adsRenderingSettings.restoreCustomPlaybackStateOnAdBreakComplete = true;
adsManager = adsManagerLoadedEvent.getAdsManager(
videoContent, adsRenderingSettings); // See API reference for contentPlayback.
- لضمان تشغيل الإعلانات ما بعد التشغيل، عليك إبلاغ حزمة SDK عند انتهاء عرض المحتوى. هذه العملية معقّدة بعض الشيء، لأنّ حزمة SDK تستخدِم في بعض الحالات مشغّل
الفيديو لعرض الإعلانات، لذا عليك التأكّد من إعلام حزمة SDK فقط عند انتهاء
عرض المحتوى، وليس عند انتهاء عرض الإعلان. يمكنك إجراء ذلك باستخدام الرمز البرمجي التالي:
var videoContent = document.getElementById('contentElement');
var contentEndedListener = function() {adsLoader.contentComplete();};
videoContent.addEventListener('ended', contentEndedListener);
function onContentPauseRequested() {
contentElement.removeEventListener('ended', contentEndedListener);
...
}
function onContentResumeRequested() {
contentElement.addEventListener('ended', contentEndedListener);
...
}
- يتم استخدام الحدثَين
CONTENT_PAUSE_REQUESTED
وCONTENT_RESUME_REQUESTED
لإيقاف المحتوى مؤقتًا واستئنافه عند تشغيل الفواصل الإعلانية.
- إذا كان مشغّل الفيديو يتيح ميزة "السحب للتقديم أو الإيقاف"، وتغيّرت سمة الوقت الحالي
لمشغّل الفيديو أثناء سحب المستخدم للمحتوى، لا يمكن لحزمة SDK التمييز
بين تقدّم المحتوى بشكل طبيعي وتقديم المستخدم للمحتوى.
يجب استخدام عنصر contentPlayback مخصّص كمَعلمة لـ
getAdsManager
.
للحصول على مثال على حالة الاستخدام هذه، يمكنك الاطّلاع على المشاكل المتعلّقة بالتقديم/الترجيع.
ملاحظة: عند انتهاء تشغيل المحتوى أو
إيقاف المستخدم للتشغيل، احرص على استدعاء AdsLoader.contentComplete
لإعلام حزمة تطوير البرامج (SDK) بأنّ المحتوى قد انتهى. بعد ذلك، تشغّل حزمة SDK
الفاصل الإعلاني ما بعد التشغيل، إذا تم جدولته. يتمّ رفع الحدث ALL_ADS_COMPLETED
عند تشغيل كلّ الفواصل الإعلانية. بالإضافة إلى ذلك، تجدر الإشارة إلى أنّه
يبدأ تتبُّع المحتوى عند استدعاء init()
، ويجب
استدعاء init()
دائمًا قبل تشغيل المحتوى.
إيقاف التشغيل التلقائي للفواصل الإعلانية
في بعض الحالات، قد تحتاج إلى منع حزمة SDK من تشغيل الفواصل الإعلانية إلى أن تتمكّن من عرضها. في هذا السيناريو، يمكنك إيقاف التشغيل التلقائي للفواصل الإعلانية
بدلاً من إعلام حزمة SDK عندما تكون مستعدًا لتشغيل فاصل إعلاني. باستخدام هذه الإعدادات، بعد أن تحمّل حزمة SDK فاصل إعلاني، يتم بدء حدث
AD_BREAK_READY
. عندما يكون المشغّل جاهزًا لبدء عرض الفاصل الإعلاني،
يمكنك استدعاء adsManager.start():
function requestAds() {}
...
adsLoader.getSettings().setAutoPlayAdBreaks(false);
...
}
function onAdsManagerLoaded() {
...
// For non-auto ad breaks, listen for ad break ready
adsManager.addEventListener(
google.ima.AdEvent.Type.AD_BREAK_READY,
adBreakReadyHandler);
...
}
function adBreakReadyHandler() {
// Once we're ready to play ads. To skip this ad break, simply return
// from this handler without calling adsManager.start().
adsManager.start();
}
جرّبه الآن
اطّلِع على الرمز البرمجي التالي لمعرفة طريقة التنفيذ الصحيحة.
مشكلة التقديم أو الإيقاف
إذا كنت تستخدِم قواعد الإعلانات، قد تواجه مشكلة في الانتقال إلى محتوى معيّن بالنقر والسحب.
وعلى وجه التحديد، بعد أن ينقر المستخدم ويسحب لتخطّي عدة
مجموعات إعلانات بينية، قد يتم تشغيل مجموعتَين أو أكثر من هذه المجموعات الإعلانية متتاليتين قبل
استئناف عرض المحتوى. ويعود سبب ذلك إلى تعديل وقت شريط تشغيل الفيديو أثناء
تقديم أو ترجيع المستخدم للفيديو. إذا صادفت حزمة SDK طلبًا للحصول على الوقت الحالي أثناء
تقديم أو ترجيع المستخدم للفيديو بعد الإعلان، قد تعتقد أنّه يجب تشغيل الإعلان. عند إعادة تشغيل المحتوى، يتم عرض هذا الإعلان، ثم أحدث إعلان منذ التقديم أو الإيقاف. للاطّلاع على تمثيل بصري لهذه المشكلة، يُرجى الاطّلاع على الرسم البياني التالي:
احفظ الوقت الحالي عندما يبدأ المستخدم في التقديم أو الإيقاف السريع، وأبلِغ عن هذا الوقت عندما يطلبه حِزم تطوير البرامج (SDK)، إلى أن يستأنف المستخدم التشغيل العادي. للاطّلاع على تمثيل مرئي لهذا
الحلّ، يُرجى الاطّلاع على الرسم البياني التالي:
باستخدام هذا الحل، يمكنك تخطّي الإعلان أثناء التشغيل الذي تبلغ مدته 0:10 ثانية بشكل صحيح وتشغيل الإعلان أثناء التشغيل الذي تبلغ مدته 0:20 ثانية فقط.
ويتم ذلك باستخدام أداة تتبُّع مخصّصة لشريط التشغيل في مقتطف الرمز البرمجي التالي. يحتوي هذا الرمز على تعديلات (معروضة بخط عريض) على ads.js
في ملف HTML5 المتقدم، وهو متاح في
صفحة التنزيل.
var Ads = function(application, videoPlayer) {
...
this.currentTime = 0;
setInterval(this.updateCurrentTime, 1000);
};
Ads.prototype.updateCurrentTime = function() {
if (!this.videoPlayer_.contentPlayer.seeking) {
this.currentTime = this.videoPlayer_.contentPlayer.currentTime;
}
};
Ads.prototype.onAdsManagerLoaded_ = function(adsManagerLoadedEvent) {
this.application_.log('Ads loaded.');
this.adsManager_ = adsManagerLoadedEvent.getAdsManager(this);
this.processAdsManager_(this.adsManager_);
};
المشاكل المعروفة في متصفّح Safari للأجهزة الجوّالة
من المفترض أن تعمل هذه الطريقة على جميع المنصات باستثناء متصفّح Safari للأجهزة الجوّالة. على Safari المتوافق مع الأجهزة الجوّالة، لا يتم تنفيذ سمة التقديم/الترجيع لعلامة الفيديو بشكلٍ صحيح (تُعرِض
دائماً قيمة خاطئة). لحلّ هذه المشكلة، عليك التحقّق مما إذا كان المستخدم يتخطّى الفيديو. في ما يلي رمز نموذجي لهذه الطريقة. تجدر الإشارة إلى أنّ الخطوط المميّزة بالخطّ العريض هي تعديلات على الرمز الحالي.
var Ads = function(application, videoPlayer) {
...
this.currentTime = 0;
setInterval(this.updateCurrentTime, 1000);
this.seeking = false;
this.seekCheckInterval = 1000;
// You may need to adjust this value, depending on your platform
this.seekThreshold = 100;
this.previousTime = 0;
setInterval(
Application.bind(this, this.checkForSeeking),
this.seekCheckInterval);
};
Ads.prototype.updateCurrentTime = function() {
if (!this.seeking) {
this.currentTime = this.videoPlayer_.contentPlayer.currentTime;
}
};
Ads.prototype.checkForSeeking = function() {
var currentTime = this.videoPlayer_.contentPlayer.currentTime;
// How much time has passed since you last ran this method, in milliseconds
var diff = (currentTime - this.previousTime) * 1000;
// If that difference is greater than the time since you last ran this method,
// plus the threshold, the user was seeking
if (Math.abs(diff) > this.interval + this.threshold) {
this.seeking = true;
} else {
this.seeking = false;
}
// Grab the current video time again to make up for time spent in this method
previousTime = this.videoPlayer_.contentPlayer.currentTime;
};
Ads.prototype.onAdsManagerLoaded_ = function(adsManagerLoadedEvent) {
this.application_.log('Ads loaded.');
this.adsManager_ = adsManagerLoadedEvent.getAdsManager(this);
this.processAdsManager_(this.adsManager_);
};
بعد إجراء هذه التغييرات، تستخدم حزمة SDK الآن سمة currentTime لعنصر Ads
لتحديد وقت تشغيل الفواصل الإعلانية، وليس سمة currentTime
لمشغّل
فيديو المحتوى.
إنّ محتوى هذه الصفحة مرخّص بموجب ترخيص Creative Commons Attribution 4.0 ما لم يُنصّ على خلاف ذلك، ونماذج الرموز مرخّصة بموجب ترخيص Apache 2.0. للاطّلاع على التفاصيل، يُرجى مراجعة سياسات موقع Google Developers. إنّ Java هي علامة تجارية مسجَّلة لشركة Oracle و/أو شركائها التابعين.
تاريخ التعديل الأخير: 2025-08-31 (حسب التوقيت العالمي المتفَّق عليه)
[null,null,["تاريخ التعديل الأخير: 2025-08-31 (حسب التوقيت العالمي المتفَّق عليه)"],[[["\u003cp\u003eThe IMA HTML5 SDK enables automated ad playlists, simplifying ad integration and supporting pre-rolls, mid-rolls, and post-rolls by leveraging Google Ad Manager.\u003c/p\u003e\n"],["\u003cp\u003eTo ensure proper ad playback, developers must signal content completion using \u003ccode\u003eAdsLoader.contentComplete()\u003c/code\u003e and manage content state synchronization with the SDK.\u003c/p\u003e\n"],["\u003cp\u003eCustom content playback objects can be used to address seeking issues and provide finer control over ad break timing and behavior.\u003c/p\u003e\n"],["\u003cp\u003eThe SDK provides events like \u003ccode\u003eCONTENT_PAUSE_REQUESTED\u003c/code\u003e, \u003ccode\u003eCONTENT_RESUME_REQUESTED\u003c/code\u003e, and \u003ccode\u003eAD_BREAK_READY\u003c/code\u003e for developers to manage content playback and ad interactions.\u003c/p\u003e\n"],["\u003cp\u003eSpecific code adjustments are necessary to handle seeking accurately on mobile Safari due to platform limitations.\u003c/p\u003e\n"]]],[],null,["# Automate ad playlists\n\nIMA HTML5 SDK supports fully automated ad playlists. This feature\ninserts ad breaks into the content as specified in\n[Google Ad Manager](//www.google.com/dfp)\nwhen trafficking your ads. It also greatly simplifies the video player code\nnecessary to support ad breaks, including pre-rolls, mid-rolls and post-rolls.\n\n- When creating the `AdsManager`, a `contentPlayback` object is passed in using the [getAdsManager](/interactive-media-ads/docs/sdks/html5/client-side/reference/interface/google.ima.AdsManagerLoadedEvent#google.ima.AdsManagerLoadedEvent.getAdsManager) call. This object must have a `currentTime` property that returns the current playhead position of the video. If you're using an HTML5 `video` element to display your content, you can just pass that element to the SDK. This object is used to track the progress of the content playback so ad breaks are automatically inserted at the times specified in Ad Manager. You also need to let the SDK know that you want it to handle content state on your behalf. \n\n ```javascript\n var adsRenderingSettings = new google.ima.AdsRenderingSettings();\n adsRenderingSettings.restoreCustomPlaybackStateOnAdBreakComplete = true;\n adsManager = adsManagerLoadedEvent.getAdsManager(\n videoContent, adsRenderingSettings); // See API reference for /interactive-media-ads/docs/sdks/html5/client-side/reference/interface/google.ima.AdsManagerLoadedEvent#google.ima.AdsManagerLoadedEvent.getAdsManager.\n ```\n- To ensure post-rolls are played, you need to let the SDK know when your content is finished. This is a bit tricky, because in some cases the SDK uses your video player to play ads, so you need to make sure you're only letting the SDK know when your content is finished, and not when an ad is finished. You can do that using the following code: \n\n ```javascript\n var videoContent = document.getElementById('contentElement');\n var contentEndedListener = function() {adsLoader.contentComplete();};\n\n videoContent.addEventListener('ended', contentEndedListener);\n\n function onContentPauseRequested() {\n contentElement.removeEventListener('ended', contentEndedListener);\n ...\n }\n\n function onContentResumeRequested() {\n contentElement.addEventListener('ended', contentEndedListener);\n ...\n }\n ```\n- The [CONTENT_PAUSE_REQUESTED](/interactive-media-ads/docs/sdks/html5/client-side/reference/namespace/google.ima.AdEvent#google.ima.AdEvent.Type) and [CONTENT_RESUME_REQUESTED](/interactive-media-ads/docs/sdks/html5/client-side/reference/namespace/google.ima.AdEvent#google.ima.AdEvent.Type) events are used to pause and resume the content when ad breaks are played.\n- If your video player supports drag-to-seek, and the current time property of the video player updates while the user is dragging, the SDK can't differentiate between content progressing normally and a user seeking through the content. You must use a custom contentPlayback object as your parameter to `getAdsManager`. For an example of this use case, see [The Trouble with Seeking](#trouble-with-seeking).\n\n**Note:** When the content has finished playing or\nthe user has stopped playback, be sure to call AdsLoader.contentComplete\nin order to signal to the SDK that the content is done. The SDK then plays\nthe post-roll ad break, if one has been scheduled. The `ALL_ADS_COMPLETED`\nevent is raised when ALL ad breaks have been played. In addition, note\nthat content tracking begins when `init()` is called and you should\nalways call `init()` before playing content.\n\nDisable automatic playback of ad breaks\n---------------------------------------\n\nIn some circumstances you may want to prevent the SDK from playing ad breaks until\nyou're ready for them. In this scenario, you can disable automatic playback of ad breaks\nin favor of letting the SDK know when you're ready for an ad break to play. With this\nconfiguration, once the SDK has loaded an ad break, it fires an\n`AD_BREAK_READY` event. When your player is ready for the ad break to start,\nyou can call adsManager.start(): \n\n```javascript\nfunction requestAds() {}\n ...\n adsLoader.getSettings().setAutoPlayAdBreaks(false);\n ...\n}\n\nfunction onAdsManagerLoaded() {\n ...\n // For non-auto ad breaks, listen for ad break ready\n adsManager.addEventListener(\n google.ima.AdEvent.Type.AD_BREAK_READY,\n adBreakReadyHandler);\n ...\n}\n\nfunction adBreakReadyHandler() {\n // Once we're ready to play ads. To skip this ad break, simply return\n // from this handler without calling adsManager.start().\n adsManager.start();\n}\n```\n\nTry it out\n----------\n\nSee the following code for a working implementation.\nSee the Pen \\\u003ca href='http://codepen.io/imasdk/pen/QyBNrq/'\\\u003eManual Ad Breaks\\\u003c/a\\\u003e by IMA SDK (\\\u003ca href='http://codepen.io/imasdk'\\\u003e@imasdk\\\u003c/a\\\u003e) on \\\u003ca href='http://codepen.io'\\\u003eCodePen\\\u003c/a\\\u003e.\n\nThe trouble with seeking\n------------------------\n\nIf you use ad rules, you may run into a problem with click-and-drag seeking.\nSpecifically, after a user clicks and drags to seek through video past multiple\nmidroll pods, they may see 2 or more of those pods play back to back before\ncontent resumes. This is caused by the video playhead time updating while the\nuser is seeking; if the SDK happens to poll for the current time while the user\nseeks past an ad, it may think that ad should be played. When the content\nresumes, it plays that ad, and then the most recent ad since the seek. For a\nvisual representation of this problem, see the following diagram:\n\nSave the current time when the user starts seeking, and report that time when the SDK\nasks for it until the user resumes normal playback. For a visual representation of this\nsolution, see the following diagram:\n\nWith this solution, you properly skip the 0:10 mid-roll and only play the 0:20 mid-roll.\nThis is done using a custom playhead tracker in the following code snippet. This code\ncontains modifications (shown in bold) of `ads.js` in the advanced HTML5\nsample available on our\n[download page](/interactive-media-ads/docs/sdks/html5/download). \n\n```javascript\nvar Ads = function(application, videoPlayer) {\n ...\n this.currentTime = 0;\n setInterval(this.updateCurrentTime, 1000);\n};\n\nAds.prototype.updateCurrentTime = function() {\n if (!this.videoPlayer_.contentPlayer.seeking) {\n this.currentTime = this.videoPlayer_.contentPlayer.currentTime;\n }\n};\n\nAds.prototype.onAdsManagerLoaded_ = function(adsManagerLoadedEvent) {\n this.application_.log('Ads loaded.');\n this.adsManager_ = adsManagerLoadedEvent.getAdsManager(this);\n this.processAdsManager_(this.adsManager_);\n};\n```\n\n### Known issues with mobile Safari\n\nThis method should work on every plaform except mobile Safari. On mobile\nSafari, the seeking property of the video tag is not properly implemented (it\nalways returns false). To get around that, you need to do your own check to\nsee if the user is seeking through the video. The sample code for this method\nfollows. Again, the bolded lines are modifications to existing code. \n\n```javascript\nvar Ads = function(application, videoPlayer) {\n ...\n this.currentTime = 0;\n setInterval(this.updateCurrentTime, 1000);\n this.seeking = false;\n this.seekCheckInterval = 1000;\n // You may need to adjust this value, depending on your platform\n this.seekThreshold = 100;\n this.previousTime = 0;\n setInterval(\n Application.bind(this, this.checkForSeeking),\n this.seekCheckInterval);\n};\n\nAds.prototype.updateCurrentTime = function() {\n if (!this.seeking) {\n this.currentTime = this.videoPlayer_.contentPlayer.currentTime;\n }\n};\n\nAds.prototype.checkForSeeking = function() {\n var currentTime = this.videoPlayer_.contentPlayer.currentTime;\n // How much time has passed since you last ran this method, in milliseconds\n var diff = (currentTime - this.previousTime) * 1000;\n // If that difference is greater than the time since you last ran this method,\n // plus the threshold, the user was seeking\n if (Math.abs(diff) \u003e this.interval + this.threshold) {\n this.seeking = true;\n } else {\n this.seeking = false;\n }\n // Grab the current video time again to make up for time spent in this method\n previousTime = this.videoPlayer_.contentPlayer.currentTime;\n};\n\nAds.prototype.onAdsManagerLoaded_ = function(adsManagerLoadedEvent) {\n this.application_.log('Ads loaded.');\n this.adsManager_ = adsManagerLoadedEvent.getAdsManager(this);\n this.processAdsManager_(this.adsManager_);\n};\n```\n\nWith these changes, the SDK is now using the currentTime property of your `Ads`\nobject to determine when to play ad breaks, not the `currentTime` property of the\ncontent video player."]]