تحميل الوسائط مسبقًا
تنظيم صفحاتك في مجموعات
يمكنك حفظ المحتوى وتصنيفه حسب إعداداتك المفضّلة.
تتيح حزمة تطوير البرامج لإعلانات الوسائط التفاعلية (IMA SDK) تحميل مواد عرض إعلانات الفيديو مسبقًا.
يمكنك تفعيل هذه الميزة في عملية دمج حزمة SDK
لتوفير انتقال أكثر سلاسة بين الإعلانات والمحتوى.
يتناول هذا الدليل التفاصيل الفنية لتنفيذ ميزة "تحميل الوسائط مسبقًا" باستخدام حزمة تطوير البرامج (SDK) لإعلانات الوسائط التفاعلية.
المتطلبات الأساسية
يتطلب التحميل المُسبَق توفُّر الإصدار 3.17.0 أو إصدار أحدث من حزمة تطوير البرامج (SDK) لنظام التشغيل Android من IMA.
تفعيل التحميل المُسبَق
لتفعيل التحميل المُسبَق، استخدِم
AdsRenderingSettings.setEnablePreloading()
لضبط التحميل المُسبَق على true. يجب تنفيذ ذلك في
onAdsManagerLoaded()
callback:
@Override
public void onAdsManagerLoaded(AdsManagerLoadedEvent adsManagerLoadedEvent) {
...
AdsRenderingSettings adsRenderingSettings =
ImaSdkFactory.getInstance().createAdsRenderingSettings();
adsRenderingSettings.setEnablePreloading(true);
mAdsManager.init(adsRenderingSettings);
}
إتاحة التحميل المُسبَق باستخدام VideoAdPlayer مخصّص
ننصحك باستخدام
إضافة ExoPlayer-IMA
التي يتم استخدامها في
مثال تطبيق Android ExoPlayer.
عند دمج إضافة ExoPlayer-IMA، يتم تفعيل التحميل المُسبَق تلقائيًا،
ويتضمّن التحميل المُسبَق ميزات مدمجة.
في حال تنفيذ التحميل المُسبَق بدون إضافة ExoPlayer-IMA،
يجب إجراء تغييرات إضافية بعد استدعاء setEnablePreloading()
. لكي يتوافق مشغّل الفيديو مع ميزة "التحميل المُسبَق للإعلانات"، يجب أن يتتبّع AdMediaInfo
العناصر التي يتم تمريرها في طلبات البيانات من loadAd()
وplayAd()
، ويُدرِج AdMediaInfo
الصحيح في طلبات AdPlayerCallback
. قد يتطلّب ذلك
إنشاء بنية بيانات لإدارة عناصر AdMediaInfo
، لأنّ loadAd()
لإعلان AdMediaInfo
لاحق قد يحدث أثناء تشغيل إعلان AdMediaInfo
سابق
حاليًا. يوضّح المثال التالي بعض التغييرات
التي قد تحتاج إلى إجرائها لكي يتيح تطبيقك ميزة "التحميل المُسبَق":
// enum for cases of PlayerState.
static enum PlayerState {
IDLE,
LOADED,
PLAYING,
PAUSED,
}
...
private final List<VideoAdPlayer.VideoAdPlayerCallback> callbacks;
private final ArrayList<AdMediaInfo> mediaInfos = new ArrayList<>();
private PlayerState playerState;
private boolean adCurrentlyLoaded;
...
@Override
public void playAd(AdMediaInfo adMediaInfo) {
switch (playerState) {
case LOADED:
for (VideoAdPlayerCallback callback : callbacks) {
callback.onPlay(adMediaInfo);
}
break;
case PAUSED:
for (VideoAdPlayerCallback callback : callbacks) {
callback.onResume(adMediaInfo);
}
break;
case PLAYING:
// Intentionally and silently ignore since it is already playing from a prior media item,
// note that onPlay is triggered by positionDiscontinuity.
return;
case IDLE:
throw new IllegalStateException("Call to playAd when player state is not LOADED.");
}
playerState = PlayerState.PLAYING;
player.setPlayWhenReady(true);
}
@Override
public void loadAd(AdMediaInfo adMediaInfo, AdPodInfo adPodInfo) {
if (adCurrentlyLoaded == true) {
mediaInfos.add(adMediaInfo);
return;
}
player.stop();
player.seekTo(0);
mediaInfos.clear();
mediaInfos.add(adMediaInfo);
player.setPlayWhenReady(false);
player.loadMedia(adMediaInfo.getUrl());
playerState = PlayerState.LOADED;
adCurrentlyLoaded = true;
}
@Override
public void stopAd(AdMediaInfo adMediaInfo) {
if (allAdsInBreakHavePlayed()) {
if (isFinalAd(adMediaInfo)) {
// handle clean up after all ads have played.
} else {
seekToNextItem(player);
}
} else {
mediaInfos.remove(adMediaInfo);
}
}
private boolean allAdsInBreakHavePlayed() {
// Code to determine if all the ads in the current ad break have completed.
}
private boolean isFinalAd(AdMediaInfo adMediaInfo) {
// Code to determine if this adMediaInfo is the final ad.
}
private void seekToNextItem(YourPlayerClass player) {
// Code to seek your player to the next media item.
}
اختبار عمليات التنفيذ المخصّصة للتحميل المُسبَق
بالنسبة إلى عمليات تنفيذ التحميل المُسبَق المخصّصة، يُنصح
باختبار الحالات القصوى التالية للتأكّد من إعداد التحميل المُسبَق بشكلٍ صحيح:
- إعلان واحد قبل عرض المحتوى
- إعلان ما قبل التشغيل في مجموعة إعلانات متسلسلة تضم 3 إعلانات
- مجموعة إعلانات متسلسلة تتضمّن 3 إعلانات أثناء التشغيل
- الانتقال إلى إعلان أثناء التشغيل ثانٍ بعد بدء تحميل إعلان أثناء التشغيل الأول ولكن قبل تشغيله
- تشغيل الإعلانات ما بعد التشغيل
التوقيت
يلخّص الجدول التالي التغييرات في توقيت تحميل الإعلانات عند تفعيل ميزة التحميل المُسبَق:
الحدث |
مع التحميل المُسبَق |
بدون التحميل المُسبَق |
طلب إعلانات VAST |
AdsLoader.requestAds() |
AdsLoader.requestAds() |
تم تحميل إعلان ما قبل التشغيل (إعلان واحد) |
AdsManager.init() |
AdsManager.start() |
تم تحميل إعلان ما قبل التشغيل (VMAP/قواعد الإعلانات) |
AdsManager.init() |
AdsManager.init() |
تحميل إعلان أثناء التشغيل أو إعلان ما بعد التشغيل |
بالنسبة إلى الإعلان الأول في الفاصل الإعلاني، قبل 8 ثوانٍ من وقت بدء الإعلان
بالنسبة إلى الإعلانات المتتالية، عند بدء عرض الإعلان السابق. |
في وقت بدء الإعلان |
الأسئلة الشائعة
- هل يؤدي تحميل الوسائط مسبقًا إلى تحميل تصميم الإعلان بالكامل؟
- لا، لا يتم عادةً تحميل تصميم الإعلان بالكامل عند بدء تشغيل الإعلان.
يهدف التحميل المُسبَق إلى تحسين تجربة المستخدِم من خلال تقليل المدّة التي يستغرِقها تحميل الإعلان. ولا يهدف إلى إتاحة عرض الإعلانات بلا اتصال بالإنترنت.
- هل يجب تفعيل ميزة "تحميل الوسائط مسبقًا" لنموذج عرض إعلانات الفيديو (VAST) والوسائط أيضًا؟
- لا، تحمّل حزمة تطوير البرامج (SDK) دائمًا ملف VAST للإعلان بغض النظر عن إعداد التمهيد المُسبَق
هذا.
إنّ محتوى هذه الصفحة مرخّص بموجب ترخيص Creative Commons Attribution 4.0 ما لم يُنصّ على خلاف ذلك، ونماذج الرموز مرخّصة بموجب ترخيص Apache 2.0. للاطّلاع على التفاصيل، يُرجى مراجعة سياسات موقع Google Developers. إنّ Java هي علامة تجارية مسجَّلة لشركة Oracle و/أو شركائها التابعين.
تاريخ التعديل الأخير: 2025-08-31 (حسب التوقيت العالمي المتفَّق عليه)
[null,null,["تاريخ التعديل الأخير: 2025-08-31 (حسب التوقيت العالمي المتفَّق عليه)"],[[["\u003cp\u003eThe IMA SDK supports preloading video ad assets to create smoother transitions between ads and content, requiring version 3.17.0 or higher of the IMA Android SDK.\u003c/p\u003e\n"],["\u003cp\u003ePreloading is enabled using \u003ccode\u003eAdsRenderingSettings.setEnablePreloading(true)\u003c/code\u003e within the \u003ccode\u003eonAdsManagerLoaded()\u003c/code\u003e callback.\u003c/p\u003e\n"],["\u003cp\u003eWhile the ExoPlayer-IMA extension has built-in preloading, custom implementations require managing \u003ccode\u003eAdMediaInfo\u003c/code\u003e objects to ensure proper ad playback.\u003c/p\u003e\n"],["\u003cp\u003ePreloading primarily focuses on minimizing initial ad load times and does not guarantee full creative download or offline ad serving.\u003c/p\u003e\n"]]],[],null,["# Preload media\n\nThe IMA SDK supports preloading video ad assets.\nYou can enable this feature in your SDK integration\nto provide a more seamless transition between ads and content.\nThis guide goes over the technical details of implementing\nmedia preload with the IMA SDK.\n\nPrerequisite\n------------\n\nPreloading requires version 3.17.0 or higher of the IMA Android SDK.\n\nEnable preloading\n-----------------\n\nTo enable preloading, use [`AdsRenderingSettings.setEnablePreloading()`](/interactive-media-ads/docs/sdks/android/client-side/api/reference/com/google/ads/interactivemedia/v3/api/AdsRenderingSettings#setEnablePreloading(boolean)) to set preloading to true. This must be done within the `onAdsManagerLoaded()` callback:\n\n\u003cbr /\u003e\n\n @Override\n public void onAdsManagerLoaded(AdsManagerLoadedEvent adsManagerLoadedEvent) {\n ...\n AdsRenderingSettings adsRenderingSettings =\n ImaSdkFactory.getInstance().createAdsRenderingSettings();\n adsRenderingSettings.setEnablePreloading(true);\n mAdsManager.init(adsRenderingSettings);\n }\n\nSupporting preloading with a custom VideoAdPlayer\n-------------------------------------------------\n\nWe recommend the\n[ExoPlayer-IMA extension](//github.com/androidx/media/tree/release/libraries/exoplayer_ima)\nthat is used in the\n[Android ExoPlayer example app](//github.com/googleads/googleads-ima-android/tree/main/ExoPlayerExample).\nWhen integrated, the ExoPlayer-IMA extension has preloading enabled by default\nand includes built-in preloading support.\n\nIf you are implementing preloading without the ExoPlayer-IMA extension,\nadditional changes are required once `setEnablePreloading()` is called. In order\nfor a video player to support preloading ads, it must keep track of the\n`AdMediaInfo` objects which are passed in calls from `loadAd()` and `playAd()`,\nand include the correct `AdMediaInfo` on the `AdPlayerCallback` calls. This may\nrequire a data-structure to manage `AdMediaInfo` objects, given that `loadAd()`\nfor a subsequent `AdMediaInfo` may occur while a prior `AdMediaInfo` is\ncurrently playing back. The following example demonstrates some of the changes\nyou may need to make for your app to support preloading: \n\n // enum for cases of PlayerState.\n static enum PlayerState {\n IDLE,\n LOADED,\n PLAYING,\n PAUSED,\n }\n\n ...\n\n private final List\u003cVideoAdPlayer.VideoAdPlayerCallback\u003e callbacks;\n private final ArrayList\u003cAdMediaInfo\u003e mediaInfos = new ArrayList\u003c\u003e();\n private PlayerState playerState;\n private boolean adCurrentlyLoaded;\n\n ...\n\n @Override\n public void playAd(AdMediaInfo adMediaInfo) {\n switch (playerState) {\n case LOADED:\n for (VideoAdPlayerCallback callback : callbacks) {\n callback.onPlay(adMediaInfo);\n }\n break;\n case PAUSED:\n for (VideoAdPlayerCallback callback : callbacks) {\n callback.onResume(adMediaInfo);\n }\n break;\n case PLAYING:\n // Intentionally and silently ignore since it is already playing from a prior media item,\n // note that onPlay is triggered by positionDiscontinuity.\n return;\n case IDLE:\n throw new IllegalStateException(\"Call to playAd when player state is not LOADED.\");\n }\n playerState = PlayerState.PLAYING;\n player.setPlayWhenReady(true);\n }\n\n @Override\n public void loadAd(AdMediaInfo adMediaInfo, AdPodInfo adPodInfo) {\n if (adCurrentlyLoaded == true) {\n mediaInfos.add(adMediaInfo);\n return;\n }\n player.stop();\n player.seekTo(0);\n mediaInfos.clear();\n mediaInfos.add(adMediaInfo);\n player.setPlayWhenReady(false);\n player.loadMedia(adMediaInfo.getUrl());\n playerState = PlayerState.LOADED;\n adCurrentlyLoaded = true;\n }\n\n @Override\n public void stopAd(AdMediaInfo adMediaInfo) {\n if (allAdsInBreakHavePlayed()) {\n if (isFinalAd(adMediaInfo)) {\n // handle clean up after all ads have played.\n } else {\n seekToNextItem(player);\n }\n } else {\n mediaInfos.remove(adMediaInfo);\n }\n }\n\n private boolean allAdsInBreakHavePlayed() {\n // Code to determine if all the ads in the current ad break have completed.\n }\n\n private boolean isFinalAd(AdMediaInfo adMediaInfo) {\n // Code to determine if this adMediaInfo is the final ad.\n }\n\n private void seekToNextItem(YourPlayerClass player) {\n // Code to seek your player to the next media item.\n }\n\n### Testing custom preloading implementations\n\nFor custom preloading implementations, testing the following edge-cases is\nrecommended to verify a correct preloading setup:\n\n- Single ad preroll\n- 3 ad pod preroll\n- 3 ad pod midroll\n- Seeking to a second midroll after the first midroll has begun preloading but before it has played\n- Postroll playback\n\nTiming\n------\n\nThe following table summarizes the changes in ad-load timing when preloading\nis enabled:\n\n| Event | With Preload | Without Preload |\n|---------------------------------|--------------------------------------------------------------------------------------------------------------------------|--------------------------|\n| Ad VAST requested | `AdsLoader.requestAds()` | `AdsLoader.requestAds()` |\n| Pre-roll loaded (single ad) | `AdsManager.init()` | `AdsManager.start()` |\n| Pre-roll loaded (VMAP/Ad rules) | `AdsManager.init()` | `AdsManager.init()` |\n| Mid-roll or post-roll loaded | For the 1st ad in an ad break, 8 seconds before ad start time. For consecutive ads, when the previous ad starts playing. | At ad start time. |\n\nFAQ\n---\n\nDoes media preloading load the full creative?\n: No, the creative is usually not fully loaded when ad playback begins.\n Preloading is intended for improving the user experience by minimizing the time\n it takes for the ad to load. It is not intended to support offline ad serving.\n\nDoes media preloading need to be enabled for the ad's VAST as well as media?\n: No, the SDK always preloads the ad's VAST, regardless of this preload\n setting."]]