ROG hardware a inovace BTF, design s Doomem i Hatsune Miku. Asus na Computexu 2025

23. 5. 2025

Sdílet

…nebo také skříně s dřevěným designem a bezdrátové řízení ventilátorů, nebo chladič, který má displej obtočený hned kolem dvou stran. Podívejte se na exponáty Asusu na Computexu 2025.

Máme letos kolegu na tchajwanském veletrhu Computex, který je spolu s CES vrcholem počítačového a hardwarového roku, na kterém výrobci předvádějí své největší novinky. Z jejich expozic jsme navštívili i Asus a vybrali některé zajímavosti, které firma ukazuje.

Magnetická klávesnice Falcata

Asus představil například tuto dělenou klávesnici, která se bude prodávat jako ROG Falcata. Kromě toho, že ji můžete používat vcelku nebo ergonomicky s dvěma polovinami natočenými, je zajímavá použitím magnetických spínačů, u kterých se dá nastavit hloubka stisku, při které dojde k sepnutí klávesnice. Také lze nastavit jak rychle po stisku klávesnice může registrovat další (Rapid Trigger mode). Frekvence pollingu je až 8000 Hz.

Hardware Asusu vystavovaný na Computexu 2025

Hardware Asusu vystavovaný na Computexu 2025

Autor: HWCooling (Jozef Dudáš)

Periférie ve stylu Vocaloid

Pro příznivce japonské popkultury a věcí sousedících s anime Asus nedávno uvedl edici hardwaru řady TUF s tématem Hatsune Miku. To je maskotka hudebního programu pro syntézu hlasu Vocaloid, kolem které si Japonci jako kolem dalších věcí vybudovali překvapivě velký „moe“ fandom.

Hardware Asusu vystavovaný na Computexu 2025

Hardware Asusu vystavovaný na Computexu 2025

Autor: HWCooling (Jozef Dudáš)
Hardware Asusu vystavovaný na Computexu 2025

Hardware Asusu vystavovaný na Computexu 2025

Autor: HWCooling (Jozef Dudáš)

Na Computexu byla vidět myš, podložka, sluchátka i klávesnice se speciálními popiskami z této řady periférií. Vedle těch by ale měl Asus v Asii nabízet i skříň, grafickou kartu a mATX základní desku, takže kdo je do vocaloidů blázen, může mít takto vyvedené kompletní PC a pracoviště. Podle informací od Asusu se minimálně periférie budou prodávat i u nás.

Hardware Asusu vystavovaný na Computexu 2025

Hardware Asusu vystavovaný na Computexu 2025

Autor: HWCooling (Jozef Dudáš)
Hardware Asusu vystavovaný na Computexu 2025

Hardware Asusu vystavovaný na Computexu 2025

Autor: HWCooling (Jozef Dudáš)

Grafiky: Doom i Noctua

Crossover z jiného soudku je grafika ROG Astral GeForce RTX 5080 Doom Edition, vydaná k aktuální hře Doom: The Dark Ages. Hardware by měl vycházet z klasické karty Astral, liší se hlavně vzhled. K Doomu měl Asus i tematickou skříň (ROG Hyperion GX701).

Hardware Asusu vystavovaný na Computexu 2025

Hardware Asusu vystavovaný na Computexu 2025

Autor: HWCooling (Jozef Dudáš)
Hardware Asusu vystavovaný na Computexu 2025

Hardware Asusu vystavovaný na Computexu 2025

Autor: HWCooling (Jozef Dudáš)

Naopak Asus GeForce RTX 5080 Noctua Edition je čistě praktická záležitost (charakteristické barvy ventilátorů Noctua zdá se dnes ne každý oceňuje) využívající špičkových akustických vlastností ventilátorů NF-A12×25 nové generace. Tato spolupráce tedy pokračuje i v generaci RTX 5000.

Hardware Asusu vystavovaný na Computexu 2025

Hardware Asusu vystavovaný na Computexu 2025

Autor: HWCooling (Jozef Dudáš)

ProArt

Asus také ukazoval hardware řady ProArt, což je designová věc, ale je to ten typ atraktivního vzhledu, který by prakticky nikde neměl udělat ostudu. Vedle desek a grafických karet má Asus i skříně ProArt, které kombinují černou s dřevěnými prvky. Určitě jedna z elegantnějších skříní, které dnes existují.

Hardware Asusu vystavovaný na Computexu 2025

Hardware Asusu vystavovaný na Computexu 2025

Autor: HWCooling (Jozef Dudáš)
Hardware Asusu vystavovaný na Computexu 2025

Hardware Asusu vystavovaný na Computexu 2025

Autor: HWCooling (Jozef Dudáš)
Hardware Asusu vystavovaný na Computexu 2025

Hardware Asusu vystavovaný na Computexu 2025

Autor: HWCooling (Jozef Dudáš)
Hardware Asusu vystavovaný na Computexu 2025

Hardware Asusu vystavovaný na Computexu 2025

Autor: HWCooling (Jozef Dudáš)

U tohoto exponátu jsem si nejdřív myslel, že jde o externí box pro grafickou kartu, ale ne – jde o plnotučnou sestavu XIKII Industry FF07 s Mini-ITX deskou (ROG Strix X870-I Gaming WiFi), Ryzenem 9 9900X a grafikou ROG Astral RTX 5080 OC. Napájení zajišťuje zdroj ROG Loki SFX-L 1000W Platinum.

Hardware Asusu vystavovaný na Computexu 2025

Hardware Asusu vystavovaný na Computexu 2025

Autor: HWCooling (Jozef Dudáš)

Desky Back To Future

Asus má také vlastní řadu základních desek BTF (Back To Future) s neviditelnými konektory na zadní straně PCB. Asus u těchto desek instaluje speciální konektor na PCB, kterým se dá napájet grafická karta – musíte si ale pořídit speciální model s tímto konektorem. Ten má rozměrné kontaktní plošky pro vedení proudu a měl by být bezproblémový, což se nedá říct o 12+4pinovém konektoru grafik Nvidia. I kvůli jeho problémům možná firmy tento design zkouší, primárně je ale smyslem to, abyste nemuseli vnitřkem skříně vést kabel k napájecím konektorům grafiky.

Hardware Asusu vystavovaný na Computexu 2025

Hardware Asusu vystavovaný na Computexu 2025

Autor: HWCooling (Jozef Dudáš)

Speciální karty s tímto konektorem mohou ale zase kolidovat v běžném PC. Teď na Computexu 2025 proto Asus předvádí modifikaci, kdy je tento konektor odnímatelný, můžete ho vidět zde. Uvnitř se modul s konektorem musí zasunout do dalšího konektoru tohoto typu.

Hardware Asusu vystavovaný na Computexu 2025

Hardware Asusu vystavovaný na Computexu 2025

Autor: HWCooling (Jozef Dudáš)
Hardware Asusu vystavovaný na Computexu 2025

Hardware Asusu vystavovaný na Computexu 2025

Autor: HWCooling (Jozef Dudáš)

Určitý otazník u tohoto designu je, že při použití tohoto systému se stejně musí přivést až 600 W výkonu ze zdroje kabelem 12V-2×6, ale v tomto případě ho zapojujete do konektoru na desce – a v případě problémů tedy spálíte konektor na ní. Navíc u BTF desek tento konektor bude schovaný za zadním panelem skříně, kde na poškození přijdete až po čase a není zde dobrá ventilace vzduchu, která by mohla snížit teploty konektoru a kabelu. Konektory 12V-2×6 jsou nicméně volba Nvidie, ne Asusu, firma s nimi nemůže moc dělat.

AIO s displeji

Na Computexu tento rok byly všude k vidění AIO chladiče s displejem. Zde je vidět ROG Ryuo IV SLC 360 ARGB, který má OLED displej ohnutý přes dvě strany vodního bloku s pumpou. Skříň počítače je také od Asusu, ROG Strix GX601S White.

Hardware Asusu vystavovaný na Computexu 2025

Hardware Asusu vystavovaný na Computexu 2025

Autor: HWCooling (Jozef Dudáš)
Hardware Asusu vystavovaný na Computexu 2025

Hardware Asusu vystavovaný na Computexu 2025

Autor: HWCooling (Jozef Dudáš)

Bezdrátové řízení ventilátorů

Zde je demo chladičů ROG Ryujin III 360 ARGB Extreme. Displej je také v oblasti zadních portů a chlazení VRM na desce ROG Crosshair X870E Extreme.

Hardware Asusu vystavovaný na Computexu 2025

Hardware Asusu vystavovaný na Computexu 2025

Autor: HWCooling (Jozef Dudáš)

Na tomto demu také stojí za pozornost kontrolér ventilátorů, které můžete vidět zapojené stranou. S ventilátory komunikuje kabelem, ale s deskou bezdrátově. Cílem je asi zejména omezit množství kabelů ve skříni.

zabbix_tip

Hardware Asusu vystavovaný na Computexu 2025

Hardware Asusu vystavovaný na Computexu 2025

Autor: HWCooling (Jozef Dudáš)

Šikovné by to mohlo být v momentě, kdy desku vyndaváte pro čištění nebo jiné účely, což asi ale není tak častí věc (a přece jen musíte i tak odpojovat další kabely).

Zdroje: Vlastní

'; document.getElementById('preroll-iframe').onload = function () { setupIframe(); } prerollContainer = document.getElementsByClassName('preroll-container-iframe')[0]; } function setupIframe() { prerollDocument = document.getElementById('preroll-iframe').contentWindow.document; let el = prerollDocument.createElement('style'); prerollDocument.head.appendChild(el); el.innerText = "#adContainer>div:nth-of-type(1),#adContainer>div:nth-of-type(1) > iframe { width: 99% !important;height: 99% !important;max-width: 100%;}#videoContent,body{ width:100vw;height:100vh}body{ font-family:'Helvetica Neue',Arial,sans-serif}#videoContent{ overflow:hidden;background:#000}#adMuteBtn{ width:35px;height:35px;border:0;background:0 0;display:none;position:absolute;fill:rgba(230,230,230,1);bottom:20px;right:25px}"; videoContent = prerollDocument.getElementById('contentElement'); videoContent.style.display = 'none'; videoContent.volume = 1; videoContent.muted = false; const playPromise = videoContent.play(); if (playPromise !== undefined) { playPromise.then(function () { console.log('PREROLL sound allowed'); // setUpIMA(true); videoContent.volume = 1; videoContent.muted = false; setUpIMA(); }).catch(function () { console.log('PREROLL sound forbidden'); videoContent.volume = 0; videoContent.muted = true; setUpIMA(); }); } } function setupDimensions() { prerollWidth = Math.min(iinfoPrerollPosition.offsetWidth, 480); prerollHeight = Math.min(iinfoPrerollPosition.offsetHeight, 320); } function setUpIMA() { google.ima.settings.setDisableCustomPlaybackForIOS10Plus(true); google.ima.settings.setLocale('cs'); google.ima.settings.setNumRedirects(10); // Create the ad display container. createAdDisplayContainer(); // Create ads loader. adsLoader = new google.ima.AdsLoader(adDisplayContainer); // Listen and respond to ads loaded and error events. adsLoader.addEventListener( google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, onAdsManagerLoaded, false); adsLoader.addEventListener( google.ima.AdErrorEvent.Type.AD_ERROR, onAdError, false); // An event listener to tell the SDK that our content video // is completed so the SDK can play any post-roll ads. const contentEndedListener = function () { adsLoader.contentComplete(); }; videoContent.onended = contentEndedListener; // Request video ads. const adsRequest = new google.ima.AdsRequest(); adsRequest.adTagUrl = iinfoVastUrls[iinfoVastUrlIndex]; console.log('Preroll advert: ' + iinfoVastUrls[iinfoVastUrlIndex]); videoContent.muted = false; videoContent.volume = 1; // Specify the linear and nonlinear slot sizes. This helps the SDK to // select the correct creative if multiple are returned. // adsRequest.linearAdSlotWidth = prerollWidth; // adsRequest.linearAdSlotHeight = prerollHeight; adsRequest.nonLinearAdSlotWidth = 0; adsRequest.nonLinearAdSlotHeight = 0; adsLoader.requestAds(adsRequest); } function createAdDisplayContainer() { // We assume the adContainer is the DOM id of the element that will house // the ads. prerollDocument.getElementById('videoContent').style.display = 'none'; adDisplayContainer = new google.ima.AdDisplayContainer( prerollDocument.getElementById('adContainer'), videoContent); } function unmutePrerollAdvert() { adVolume = !adVolume; if (adVolume) { adsManager.setVolume(0.3); prerollDocument.getElementById('adMuteBtn').innerHTML = ''; } else { adsManager.setVolume(0); prerollDocument.getElementById('adMuteBtn').innerHTML = ''; } } function onAdsManagerLoaded(adsManagerLoadedEvent) { // Get the ads manager. const adsRenderingSettings = new google.ima.AdsRenderingSettings(); adsRenderingSettings.restoreCustomPlaybackStateOnAdBreakComplete = true; adsRenderingSettings.loadVideoTimeout = 12000; // videoContent should be set to the content video element. adsManager = adsManagerLoadedEvent.getAdsManager(videoContent, adsRenderingSettings); // Add listeners to the required events. adsManager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, onAdError); adsManager.addEventListener( google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED, onContentPauseRequested); adsManager.addEventListener( google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED, onContentResumeRequested); adsManager.addEventListener( google.ima.AdEvent.Type.ALL_ADS_COMPLETED, onAdEvent); // Listen to any additional events, if necessary. adsManager.addEventListener(google.ima.AdEvent.Type.LOADED, onAdEvent); adsManager.addEventListener(google.ima.AdEvent.Type.STARTED, onAdEvent); adsManager.addEventListener(google.ima.AdEvent.Type.COMPLETE, onAdEvent); playAds(); } function playAds() { // Initialize the container. Must be done through a user action on mobile // devices. videoContent.load(); adDisplayContainer.initialize(); // setupDimensions(); try { // Initialize the ads manager. Ad rules playlist will start at this time. adsManager.init(1920, 1080, google.ima.ViewMode.NORMAL); // Call play to start showing the ad. Single video and overlay ads will // start at this time; the call will be ignored for ad rules. adsManager.start(); // window.addEventListener('resize', function (event) { // if (adsManager) { // setupDimensions(); // adsManager.resize(prerollWidth, prerollHeight, google.ima.ViewMode.NORMAL); // } // }); } catch (adError) { // An error may be thrown if there was a problem with the VAST response. // videoContent.play(); } } function onAdEvent(adEvent) { const ad = adEvent.getAd(); console.log('Preroll event: ' + adEvent.type); switch (adEvent.type) { case google.ima.AdEvent.Type.LOADED: if (!ad.isLinear()) { videoContent.play(); } prerollDocument.getElementById('adContainer').style.width = '100%'; prerollDocument.getElementById('adContainer').style.maxWidth = '640px'; prerollDocument.getElementById('adContainer').style.height = '360px'; break; case google.ima.AdEvent.Type.STARTED: window.addEventListener('scroll', onActiveView); if (ad.isLinear()) { intervalTimer = setInterval( function () { // Example: const remainingTime = adsManager.getRemainingTime(); // adsManager.pause(); }, 300); // every 300ms } prerollDocument.getElementById('adMuteBtn').style.display = 'block'; break; case google.ima.AdEvent.Type.ALL_ADS_COMPLETED: if (ad.isLinear()) { clearInterval(intervalTimer); } if (prerollLastError === 303) { playYtVideo(); } break; case google.ima.AdEvent.Type.COMPLETE: if (ad.isLinear()) { clearInterval(intervalTimer); } playYtVideo(); break; } } function onAdError(adErrorEvent) { console.log(adErrorEvent.getError()); prerollLastError = adErrorEvent.getError().getErrorCode(); if (!loadNext()) { playYtVideo(); } } function loadNext() { iinfoVastUrlIndex++; if (iinfoVastUrlIndex < iinfoVastUrls.length) { iinfoPrerollPosition.remove(); playPrerollAd(); } else { return false; } adVolume = 1; return true; } function onContentPauseRequested() { videoContent.pause(); } function onContentResumeRequested() { videoContent.play(); } function onActiveView() { if (prerollContainer) { const containerOffset = prerollContainer.getBoundingClientRect(); const windowHeight = window.innerHeight; if (containerOffset.top < windowHeight/1 && containerOffset.bottom > 0.0) { if (prerollPaused) { adsManager.resume(); prerollPaused = false; } return true; } else { if (!prerollPaused) { adsManager.pause(); prerollPaused = true; } } } return false; } function playYtVideo() { iinfoPrerollPosition.remove(); youtubeIframe.style.display = 'block'; youtubeIframe.src += '&autoplay=1&mute=1'; } }
'; document.getElementById('outstream-iframe').onload = function () { setupIframe(); } replayScreen = document.getElementById('iinfoOutstreamReplay'); iinfoOutstreamPosition = document.getElementById('iinfoOutstreamPosition'); outstreamContainer = document.getElementsByClassName('outstream-container')[0]; setupReplayScreen(); } function setupIframe() { outstreamDocument = document.getElementById('outstream-iframe').contentWindow.document; let el = outstreamDocument.createElement('style'); outstreamDocument.head.appendChild(el); el.innerText = "#adContainer>div:nth-of-type(1),#adContainer>div:nth-of-type(1) > iframe { width: 99% !important;height: 99% !important;max-width: 100%;}#videoContent,body{ width:100vw;height:100vh}body{ font-family:'Helvetica Neue',Arial,sans-serif}#videoContent{ overflow:hidden;background:#000}#adMuteBtn{ width:35px;height:35px;border:0;background:0 0;display:none;position:absolute;fill:rgba(230,230,230,1);bottom:-5px;right:25px}"; videoContent = outstreamDocument.getElementById('contentElement'); videoContent.style.display = 'none'; videoContent.volume = 1; videoContent.muted = false; if ( location.href.indexOf('rejstriky.finance.cz') !== -1 || location.href.indexOf('finance-rejstrik') !== -1 || location.href.indexOf('firmy.euro.cz') !== -1 || location.href.indexOf('euro-rejstrik') !== -1 || location.href.indexOf('/rejstrik/') !== -1 || location.href.indexOf('/rejstrik-firem/') !== -1) { outstreamDirectPlayed = true; soundAllowed = true; iinfoVastUrlIndex = 0; } if (!outstreamDirectPlayed) { console.log('OUTSTREAM direct'); setUpIMA(true); } else { if (soundAllowed) { const playPromise = videoContent.play(); if (playPromise !== undefined) { playPromise.then(function () { console.log('OUTSTREAM sound allowed'); setUpIMA(false); }).catch(function () { console.log('OUTSTREAM sound forbidden'); renderBanner(); }); } } else { renderBanner(); } } } function getWrapper() { let articleWrapper = document.querySelector('.rs-outstream-placeholder'); // Outstream Placeholder from RedSys manipulation if (articleWrapper && articleWrapper.style.display !== 'block') { articleWrapper.innerHTML = ""; articleWrapper.style.display = 'block'; } // Don't render OutStream on homepages if (articleWrapper === null) { if (document.querySelector('body.p-index')) { return null; } } if (articleWrapper === null) { articleWrapper = document.getElementById('iinfo-outstream'); } if (articleWrapper === null) { articleWrapper = document.querySelector('.layout-main__content .detail__article p:nth-of-type(6)'); } if (articleWrapper === null) { // Euro, Autobible, Zdravi articleWrapper = document.querySelector('.o-article .o-article__text p:nth-of-type(6)'); } if (articleWrapper === null) { articleWrapper = document.getElementById('sidebar'); } if (!articleWrapper) { console.error("Outstream wrapper of article was not found."); } return articleWrapper; } function setupDimensions() { outstreamWidth = Math.min(iinfoOutstreamPosition.offsetWidth, 480); outstreamHeight = Math.min(iinfoOutstreamPosition.offsetHeight, 320); } /** * Sets up IMA ad display container, ads loader, and makes an ad request. */ function setUpIMA(direct) { google.ima.settings.setDisableCustomPlaybackForIOS10Plus(true); google.ima.settings.setLocale('cs'); google.ima.settings.setNumRedirects(10); // Create the ad display container. createAdDisplayContainer(); // Create ads loader. adsLoader = new google.ima.AdsLoader(adDisplayContainer); // Listen and respond to ads loaded and error events. adsLoader.addEventListener( google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, onAdsManagerLoaded, false); adsLoader.addEventListener( google.ima.AdErrorEvent.Type.AD_ERROR, onAdError, false); // An event listener to tell the SDK that our content video // is completed so the SDK can play any post-roll ads. const contentEndedListener = function () { adsLoader.contentComplete(); }; videoContent.onended = contentEndedListener; // Request video ads. const adsRequest = new google.ima.AdsRequest(); if (direct) { adsRequest.adTagUrl = directVast; console.log('Outstream DIRECT CAMPAING advert: ' + directVast); videoContent.muted = true; videoContent.volume = 0; outstreamDirectPlayed = true; } else { adsRequest.adTagUrl = iinfoVastUrls[iinfoVastUrlIndex]; console.log('Outstream advert: ' + iinfoVastUrls[iinfoVastUrlIndex]); videoContent.muted = false; videoContent.volume = 1; } // Specify the linear and nonlinear slot sizes. This helps the SDK to // select the correct creative if multiple are returned. // adsRequest.linearAdSlotWidth = outstreamWidth; // adsRequest.linearAdSlotHeight = outstreamHeight; adsRequest.nonLinearAdSlotWidth = 0; adsRequest.nonLinearAdSlotHeight = 0; adsLoader.requestAds(adsRequest); } function setupReplayScreen() { replayScreen.addEventListener('click', function () { iinfoOutstreamPosition.remove(); iinfoVastUrlIndex = 0; outstreamInit(); }); } /** * Sets the 'adContainer' div as the IMA ad display container. */ function createAdDisplayContainer() { // We assume the adContainer is the DOM id of the element that will house // the ads. outstreamDocument.getElementById('videoContent').style.display = 'none'; adDisplayContainer = new google.ima.AdDisplayContainer( outstreamDocument.getElementById('adContainer'), videoContent); } function unmuteAdvert() { adVolume = !adVolume; if (adVolume) { adsManager.setVolume(0.3); outstreamDocument.getElementById('adMuteBtn').innerHTML = ''; } else { adsManager.setVolume(0); outstreamDocument.getElementById('adMuteBtn').innerHTML = ''; } } /** * Loads the video content and initializes IMA ad playback. */ function playAds() { // Initialize the container. Must be done through a user action on mobile // devices. videoContent.load(); adDisplayContainer.initialize(); // setupDimensions(); try { // Initialize the ads manager. Ad rules playlist will start at this time. adsManager.init(1920, 1080, google.ima.ViewMode.NORMAL); // Call play to start showing the ad. Single video and overlay ads will // start at this time; the call will be ignored for ad rules. adsManager.start(); // window.addEventListener('resize', function (event) { // if (adsManager) { // setupDimensions(); // adsManager.resize(outstreamWidth, outstreamHeight, google.ima.ViewMode.NORMAL); // } // }); } catch (adError) { // An error may be thrown if there was a problem with the VAST response. // videoContent.play(); } } /** * Handles the ad manager loading and sets ad event listeners. * @param { !google.ima.AdsManagerLoadedEvent } adsManagerLoadedEvent */ function onAdsManagerLoaded(adsManagerLoadedEvent) { // Get the ads manager. const adsRenderingSettings = new google.ima.AdsRenderingSettings(); adsRenderingSettings.restoreCustomPlaybackStateOnAdBreakComplete = true; adsRenderingSettings.loadVideoTimeout = 12000; // videoContent should be set to the content video element. adsManager = adsManagerLoadedEvent.getAdsManager(videoContent, adsRenderingSettings); // Add listeners to the required events. adsManager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, onAdError); adsManager.addEventListener( google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED, onContentPauseRequested); adsManager.addEventListener( google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED, onContentResumeRequested); adsManager.addEventListener( google.ima.AdEvent.Type.ALL_ADS_COMPLETED, onAdEvent); // Listen to any additional events, if necessary. adsManager.addEventListener(google.ima.AdEvent.Type.LOADED, onAdEvent); adsManager.addEventListener(google.ima.AdEvent.Type.STARTED, onAdEvent); adsManager.addEventListener(google.ima.AdEvent.Type.COMPLETE, onAdEvent); playAds(); } /** * Handles actions taken in response to ad events. * @param { !google.ima.AdEvent } adEvent */ function onAdEvent(adEvent) { // Retrieve the ad from the event. Some events (for example, // ALL_ADS_COMPLETED) don't have ad object associated. const ad = adEvent.getAd(); console.log('Outstream event: ' + adEvent.type); switch (adEvent.type) { case google.ima.AdEvent.Type.LOADED: // This is the first event sent for an ad - it is possible to // determine whether the ad is a video ad or an overlay. if (!ad.isLinear()) { // Position AdDisplayContainer correctly for overlay. // Use ad.width and ad.height. videoContent.play(); } outstreamDocument.getElementById('adContainer').style.width = '100%'; outstreamDocument.getElementById('adContainer').style.maxWidth = '640px'; outstreamDocument.getElementById('adContainer').style.height = '360px'; break; case google.ima.AdEvent.Type.STARTED: window.addEventListener('scroll', onActiveView); // This event indicates the ad has started - the video player // can adjust the UI, for example display a pause button and // remaining time. if (ad.isLinear()) { // For a linear ad, a timer can be started to poll for // the remaining time. intervalTimer = setInterval( function () { // Example: const remainingTime = adsManager.getRemainingTime(); // adsManager.pause(); }, 300); // every 300ms } outstreamDocument.getElementById('adMuteBtn').style.display = 'block'; break; case google.ima.AdEvent.Type.ALL_ADS_COMPLETED: if (ad.isLinear()) { clearInterval(intervalTimer); } if (outstreamLastError === 303) { if (isBanner) { renderBanner(); } else { replayScreen.style.display = 'flex'; } } break; case google.ima.AdEvent.Type.COMPLETE: // This event indicates the ad has finished - the video player // can perform appropriate UI actions, such as removing the timer for // remaining time detection. if (ad.isLinear()) { clearInterval(intervalTimer); } if (isBanner) { renderBanner(); } else { replayScreen.style.display = 'flex'; } break; } } /** * Handles ad errors. * @param { !google.ima.AdErrorEvent } adErrorEvent */ function onAdError(adErrorEvent) { // Handle the error logging. console.log(adErrorEvent.getError()); outstreamLastError = adErrorEvent.getError().getErrorCode(); if (!loadNext()) { renderBanner(); } } function renderBanner() { if (isBanner) { console.log('Outstream: Render Banner'); iinfoOutstreamPosition.innerHTML = ""; iinfoOutstreamPosition.style.height = "330px"; iinfoOutstreamPosition.appendChild(bannerDiv); } else { console.log('Outstream: Banner is not set'); } } function loadNext() { iinfoVastUrlIndex++; if (iinfoVastUrlIndex < iinfoVastUrls.length) { iinfoOutstreamPosition.remove(); outstreamInit(); } else { return false; } adVolume = 1; return true; } /** * Pauses video content and sets up ad UI. */ function onContentPauseRequested() { videoContent.pause(); // This function is where you should setup UI for showing ads (for example, // display ad timer countdown, disable seeking and more.) // setupUIForAds(); } /** * Resumes video content and removes ad UI. */ function onContentResumeRequested() { videoContent.play(); // This function is where you should ensure that your UI is ready // to play content. It is the responsibility of the Publisher to // implement this function when necessary. // setupUIForContent(); } function onActiveView() { if (outstreamContainer) { const containerOffset = outstreamContainer.getBoundingClientRect(); const windowHeight = window.innerHeight; if (containerOffset.top < windowHeight/1 && containerOffset.bottom > 0.0) { if (outstreamPaused) { adsManager.resume(); outstreamPaused = false; } return true; } else { if (!outstreamPaused) { adsManager.pause(); outstreamPaused = true; } } } return false; } let outstreamInitInterval; if (typeof cpexPackage !== "undefined") { outstreamInitInterval = setInterval(tryToInitializeOutstream, 100); } else { const wrapper = getWrapper(); if (wrapper) { let outstreamInitialized = false; window.addEventListener('scroll', () => { if (!outstreamInitialized) { const containerOffset = wrapper.getBoundingClientRect(); const windowHeight = window.innerHeight; if (containerOffset.top < windowHeight / 1 && containerOffset.bottom > 0.0) { outstreamInit(); outstreamInitialized = true; } } }); } } function tryToInitializeOutstream() { const wrapper = getWrapper(); if (wrapper) { const containerOffset = wrapper.getBoundingClientRect(); const windowHeight = window.innerHeight; if (containerOffset.top < windowHeight / 1 && containerOffset.bottom > 0.0) { if (cpexPackage.adserver.displayed) { clearInterval(outstreamInitInterval); outstreamInit(); } } } else { clearInterval(outstreamInitInterval); } } }
OSZAR »