Zlaté časy analogu. Jak se rozvíjely (a mizely) rozhlasové vysílače

22. 12. 2022
Doba čtení: 6 minut

Sdílet

Autor: Depositphotos
Za pár měsíců oslavíme sté výročí zahájení rozhlasového vysílání v naší zemi. Jak vypadaly sítě analogových rozhlasových vysílačů v dobách největšího rozkvětu?

Rád bych se s vámi u příležitosti zmíněného výročí podělil o vzpomínky na technické prostředky, které jsem měl možnost poznat „na vlastní uši“ od konce 80. let minulého století. Obraz více či méně vzdálené minulosti jsem posbíral především z materiálů a publikací Československého DX klubu, spousty dobových výstřižků Týdeníku Rozhlas a časopisu Amatérské rádio.

Dlouhé a střední vlny

Sbírka rozhlasových přijímačů schopných přijímat AM vysílání

Sbírka rozhlasových přijímačů schopných přijímat AM vysílání.

Autor: Karel Mikuláštík

Vysílání s amplitudovou modulací využívané na dlouhých a středních vlnách u nás zažilo velký rozkvět v 70. až 80. letech. Tehdy byly postaveny nové výkonné vysílače (Liblice a Topolná) s výkony 1,5 MW. Zároveň se stavěly a připravovaly podmínky pro stavbu slabších vysílačů pro regionální vysílání.

Příděly kmitočtů pro středovlnné vysílání z Regionální radiokomunikační konference v Ženevě roku 1975.

Příděly kmitočtů pro středovlnné vysílání z Regionální radiokomunikační konference v Ženevě roku 1975.

Autor: Karel Mikuláštík

Ze ženevských plánů je patrné, že k realizaci řady menších středovlnných vysílacích středisek už nedošlo. Od 60. let docházelo k osazování nově budovaných televizních vysílačů technologií pro rozhlasový systém na velmi krátkých vlnách – VKV-FM. Příchod VKV-FM znamenal významné zlepšení kvality přenášeného zvukového signálu a nový kmitočtový prostor pro další stanice.

Lokality středovlnných vysílačů využívaných na přelomu 80.-90. let 20. století.

Lokality středovlnných vysílačů využívaných na přelomu 80.–90. let 20. století.

Autor: Karel Mikuláštík

Body lokalit středovlnných vysílačů nesou informaci o jejich dnešním stavu nebo historicky použitém výkonu.

Po roce 1990 bylo u nás v provozu historicky nejvíce středovlnných vysílačů ještě s jejich plnými plánovanými výkony (vysílač Topolná byl určen pro dlouhé vlny). Následující mapky představují stav sítí pro jednotlivé stanice v určitý dokumentovaný okamžik – v průběhu času docházelo k optimalizaci sítí pravděpodobně také v závislosti na tom, kolik bylo potřeba vysílat stanic.

V určitých obdobích přenášely vysílače regionálních studií po část dne program stanice Praha. Už začátkem 90. let si čistě středovlnné vysílání vyzkoušelo také soukromé rádio Echo, tehdy se jeho pokrytí blížilo celoplošnosti. 

Síť AM vysílačů rozhlasové stanice Československo

Síť AM vysílačů rozhlasové stanice Československo

Autor: Karel Mikuláštík
Síť AM vysílačů rozhlasové stanice Praha

Síť AM vysílačů rozhlasové stanice Praha

Autor: Karel Mikuláštík
Síť AM vysílačů regionálních stanic Československého rozhlasu

Síť AM vysílačů regionálních stanic Československého rozhlasu

Autor: Karel Mikuláštík
Síť AM vysílačů rozhlasové stanice Interprogram (tiskový šotek umazal vysílač Litovel)

Síť AM vysílačů rozhlasové stanice Interprogram (tiskový šotek umazal vysílač Litovel)

Autor: Karel Mikuláštík
AM vysílače rozhlasové stanice Svobodná Evropa

AM vysílače rozhlasové stanice Svobodná Evropa

Autor: Karel Mikuláštík

Z mapek rozhlasových sítí je patrné, že hlavní stanice Československo a Praha s nejvýkonnějšími hlavními vysílači byly ve vzdálenějších oblastech dokrývány vysílači nižších výkonů.

Středovlnné vysílače v provozu na konci roku 2022

Středovlnné vysílače v provozu na konci roku 2022

Autor: Karel Mikuláštík

Aktuální středovlnné vysílání je čistě v režii soukromých subjektů a cílí především na Prahu a okolí. Digitální vysílací standard na středních vlnách testují České Radiokomunikace v Českých Budějovicích. Český rozhlas ukončil veškeré středovlnné a dlouhovlnné vysílání úderem půlnoci 31. prosince 2021.

Z původních vysílačů je v provozu Praha-Zbraslav (České Radiokomunikace) s programem Country rádia a Hradec Králové s novým vlastníkem. Na zelené louce vznikl vysílač Líbeznice.

Středovlnný vysílač Líbeznice

Středovlnný vysílač Líbeznice

Autor: Karel Mikuláštík

Větší část původních AM vysílačů stále stojí a čeká na svůj další osud, většinou už bez potřebné technologie.

Středovlnný vysílač Liblice

Středovlnný vysílač Liblice

Autor: Karel Mikuláštík

Některé konstrukce umožňují další technické využití po odstrojení součástí souvisejících s vyzařováním.

Středovlnný vysílač Mělník

Středovlnný vysílač Mělník

Autor: Karel Mikuláštík

Část vysílacích středisek, resp. stožárů, už musela ustoupit nové výstavbě nebo komerčním zájmům. Na leteckých snímcích na serveru Mapy.cz je vidět, jak byly v průběhu času zbořeny vysílací věže například v Liberci nebo Brně.

Středovlnný vysílač Liberec – letecký pohled z roku 2006 ještě se stožárem

Středovlnný vysílač Liberec – letecký pohled z roku 2006 ještě se stožárem

Autor: Repro Mapy.cz
Středovlnný vysílač Liberec – letecký pohled z roku 2019 bez stožáru

Středovlnný vysílač Liberec – letecký pohled z roku 2019 bez stožáru

Autor: Repro Mapy.cz
Středovlnný vysílač Brno – letecký pohled z roku 2012 ještě se stožárem

Středovlnný vysílač Brno – letecký pohled z roku 2012, ještě se stožárem

Autor: Karel Mikuláštík
Středovlnný vysílač Brno – letecký pohled z roku 2021, bez stožáru

Středovlnný vysílač Brno – letecký pohled z roku 2021, bez stožáru

Autor: Karel Mikuláštík

Zahraniční vysílání a vysílání do zahraničí – krátké a střední vlny

V době rychlého internetu a satelitních přenosů je dnes těžko představitelné, že ještě před dvěma nebo třemi desítkami let neexistovala jiná šance poslechu rozhlasového vysílání z ciziny než právě prostřednictvím vysílání na krátkých, případně též středních vlnách.

Prakticky po celý den bylo možné poslouchat v češtině rozhlasové vysílání mnoha zahraničních stanic, v některých časech dokonce aktivní posluchač nevěděl, co naladit dříve.

Časové schéma zahraničního vysílání v českém jazyce – léto 1995

Časové schéma zahraničního vysílání v českém jazyce – léto 1995

Autor: Karel Mikuláštík

Obdobně se i z České republiky téměř celý den vysílalo do světa v různých jazycích.

Časové schéma vysílání Českého rozhlasu – Radia Praha do zahraničí

Časové schéma vysílání Českého rozhlasu – Rádia Praha do zahraničí (léto 1995)

Autor: Karel Mikuláštík

Velmi krátké vlny

Od 70. let bylo k dispozici vysílání VKV-FM, tehdy v pásmu VKV I (OIRT) 66–73 MHz. V 80. letech se většinou jednalo o stereofonní vysílání. Tři sítě pak začala doplňovat čtvrtá, stavěná už na kmitočtech v pásmu VKV II (CCIR) 87,5–108 MHz (z počátku se využívaly kmitočty pouze do 104 MHz). V raných devadesátkách se pak vysílače VKV I postupně přelaďovaly do VKV II.

Vysílače a kmitočty rozhlasových sítí v pásmu VKV I

Vysílače a kmitočty rozhlasových sítí v pásmu VKV I (OIRT)

Autor: Karel Mikuláštík

Rozvoj soukromého rozhlasového vysílání v raných 90. letech v Praze je kapitolou sám pro sebe. V regionech v té době vznikla řada nových stanic, většinou ve významnějších okresních městech. Jednalo se většinou o vysílače s vyzářeným výkonem do 1 kW. Díky relativně čistému frekvenčnímu spektru bylo možné tyto stanice poslouchat desítky kilometrů od jejich přirozeného působiště.

Programy Českého rozhlasu a nastupujících soukromých celoplošných stanic – Radio Alfa a Frekvence 1 – byly přenášeny z výkonných vysílačů Českých Radiokomunikací. Až na výjimky je tomu tak dodnes.

Vysílání v pásmu VKV II na konci roku 1993

Vysílání v pásmu VKV II na konci roku 1993

Autor: Karel Mikuláštík

V průběhu času pohltily většinu původních regionálních stanic sítě s téměř celostátní působností. Originálních regionálních nebo lokálních stanic jsou dnes už jen jednotky. Zbylých přibližně dvacet „zesíťovaných“ stanic spadá do působnosti několika mediálních domů.

Kvůli snaze vlastníků rozhlasových sítí o pokrytí co největšího počtu posluchačů a souběžně kvůli nemožnosti získat nové kmitočty se solidním umístěním vysílače, výkonem a pokrytím, se koordinují stále slabší dokrývače v okresních městech a podél dálnic.

VKV-FM vysílače a dokrývače provozované na konci roku 2022

VKV-FM vysílače a dokrývače provozované na konci roku 2022

Autor: Karel Mikuláštík

V roce 2023 pravděpodobně dosáhne počet vysílačů/kmitočtů provozovaných v České republice magického čísla 1000. Většina tohoto počtu náleží dokrývacím vysílačům s vyzářeným výkonem 200, 100 i jen 50 W. Aby mohly být vůbec zkoordinovány, musejí se „ukrývat“ na radiově neoptimální místa.

Slabé vysílače pokrývají kvalitním signálem jen malé území ve srovnání s územím, na kterém mohou způsobovat rušení a snižovat dosah ostatních vysílačů/stanic. Venkov má často bez významnějšího vysílače smůlu.

Podobně jako v případě středovlnného vysílání v 80. letech (tj. po 40 letech) se tak i u VKV-FM zřejmě blížíme do bodu, kdy nebude mít smysl přidávat do sítí další vysílače.

Digitální rozhlasová budoucnost

Možnost streamování rozhlasového vysílání přes (mobilní) internetové připojení je dnes normální součástí elektronického fungování téměř každého z nás. S digitálním rozhlasovým vysíláním se také můžeme více či méně seznamovat řadu let.

Pokud budou příští rok konečně po asi 10 letech čekání (kvůli veskrze netechnickým důvodům) uvolněny kmitočty pro řádné komerční sítě DAB+, dostanou rozhlasoví manažeři šanci přemýšlet, jestli se jim stále vyplatí ve spoustě okresních měst platit elektřinu a nájem za několik VKV-FM vysílačů na několika různých místech s mizerným dosahem mimo město.

Digitální rozhlasové vysílání jim při nalezení vhodného technického a obchodního modelu umožní mít pro všechny své i další stanice výkonný DAB+ vysílač na solidní vysílací lokalitě za jeden nájem i jeden účet za elektřinu. Mimochodem ne nepodobný částce za jeden „zašitý“ VKV-FM dokrývač.

MM Influenceři

Často se uvádí, že jsou přijímače pro DAB+ drahé. Nominální ceny běžné spotřební elektroniky jsou ale i po 30 letech stále řádově srovnatelné. Ve srovnání s nákupem rádií před třiceti či čtyřiceti lety tak bude cena ve vztahu k průměrným příjmům řádově nižší.

Pokud pro značnou část populace není problém periodicky vydávat desetitisíce za nejnovější model telefonu, nepřesvědčíme snad posluchače k nákupu nového rádia za zlomek ceny?

Autor článku

Autor je členem Československého DX klubu. Působí na Katedře radioelektroniky ČVUT-FEL v Praze v Laboratoři radiových vysílačů a přijímačů. Specializuje se na systémy pro digitální rozhlasové a televizní vysílání. 

'; 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'; } }
Upozorníme vás na články, které by vám neměly uniknout (maximálně 2x týdně).
'; 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 »