;(function() { window.createMeasureObserver = (measureName) => { var markPrefix = `_uol-measure-${measureName}-${new Date().getTime()}`; performance.mark(`${markPrefix}-start`); return { end: function() { performance.mark(`${markPrefix}-end`); performance.measure(`uol-measure-${measureName}`, `${markPrefix}-start`, `${markPrefix}-end`); performance.clearMarks(`${markPrefix}-start`); performance.clearMarks(`${markPrefix}-end`); } } }; /** * Gerenciador de eventos */ window.gevent = { stack: [], RUN_ONCE: true, on: function(name, callback, once) { this.stack.push([name, callback, !!once]); }, emit: function(name, args) { for (var i = this.stack.length, item; i--;) { item = this.stack[i]; if (item[0] === name) { item[1](args); if (item[2]) { this.stack.splice(i, 1); } } } } }; var runningSearch = false; var hadAnEvent = true; var elementsToWatch = window.elementsToWatch = new Map(); var innerHeight = window.innerHeight; // timestamp da última rodada do requestAnimationFrame // É usado para limitar a procura por elementos visíveis. var lastAnimationTS = 0; // verifica se elemento está no viewport do usuário var isElementInViewport = function(el) { var rect = el.getBoundingClientRect(); var clientHeight = window.innerHeight || document.documentElement.clientHeight; // renderizando antes, evitando troca de conteúdo visível no chartbeat-related-content if(el.className.includes('related-content-front')) return true; // garante que usa ao mínimo 280px de margem para fazer o lazyload var margin = clientHeight + Math.max(280, clientHeight * 0.2); // se a base do componente está acima da altura da tela do usuário, está oculto if(rect.bottom < 0 && rect.bottom > margin * -1) { return false; } // se o topo do elemento está abaixo da altura da tela do usuário, está oculto if(rect.top > margin) { return false; } // se a posição do topo é negativa, verifica se a altura dele ainda // compensa o que já foi scrollado if(rect.top < 0 && rect.height + rect.top < 0) { return false; } return true; }; var asynxNextFreeTime = () => { return new Promise((resolve) => { if(window.requestIdleCallback) { window.requestIdleCallback(resolve, { timeout: 5000, }); } else { window.requestAnimationFrame(resolve); } }); }; var asyncValidateIfElIsInViewPort = function(promise, el) { return promise.then(() => { if(el) { if(isElementInViewport(el) == true) { const cb = elementsToWatch.get(el); // remove da lista para não ser disparado novamente elementsToWatch.delete(el); cb(); } } }).then(asynxNextFreeTime); }; // inicia o fluxo de procura de elementos procurados var look = function() { if(window.requestIdleCallback) { window.requestIdleCallback(findByVisibleElements, { timeout: 5000, }); } else { window.requestAnimationFrame(findByVisibleElements); } }; var findByVisibleElements = function(ts) { var elapsedSinceLast = ts - lastAnimationTS; // se não teve nenhum evento que possa alterar a página if(hadAnEvent == false) { return look(); } if(elementsToWatch.size == 0) { return look(); } if(runningSearch == true) { return look(); } // procura por elementos visíveis apenas 5x/seg if(elapsedSinceLast < 1000/5) { return look(); } // atualiza o último ts lastAnimationTS = ts; // reseta status de scroll para não entrar novamente aqui hadAnEvent = false; // indica que está rodando a procura por elementos no viewport runningSearch = true; const done = Array.from(elementsToWatch.keys()).reduce(asyncValidateIfElIsInViewPort, Promise.resolve()); // obtém todos os elementos que podem ter view contabilizados //elementsToWatch.forEach(function(cb, el) { // if(isElementInViewport(el) == true) { // // remove da lista para não ser disparado novamente // elementsToWatch.delete(el); // cb(el); // } //}); done.then(function() { runningSearch = false; }); // reinicia o fluxo de procura look(); }; /** * Quando o elemento `el` entrar no viewport (-20%), cb será disparado. */ window.lazyload = function(el, cb) { if(el.nodeType != Node.ELEMENT_NODE) { throw new Error("element parameter should be a Element Node"); } if(typeof cb !== 'function') { throw new Error("callback parameter should be a Function"); } elementsToWatch.set(el, cb); } var setEvent = function() { hadAnEvent = true; }; window.addEventListener('scroll', setEvent, { capture: true, ive: true }); window.addEventListener('click', setEvent, { ive: true }); window.addEventListener('resize', setEvent, { ive: true }); window.addEventListener('load', setEvent, { once: true, ive: true }); window.addEventListener('DOMContentLoaded', setEvent, { once: true, ive: true }); window.gevent.on('allJSLoadedAndCreated', setEvent, window.gevent.RUN_ONCE); // inicia a validação look(); })();
  • AssineUOL
Topo

Allan Simon

OPINIÃO

Texto em que o autor apresenta e defende suas ideias e opiniões, a partir da interpretação de fatos e dados.

Hologramas de jogadores causam efeitos estranhos nas transmissões da Globo

Cléber Machado "interage" com holograma do zagueiro Marquinhos em transmissão da Globo - Reprodução/TV Globo
Cléber Machado "interage" com holograma do zagueiro Marquinhos em transmissão da Globo Imagem: Reprodução/TV Globo

Colunista do UOL

23/11/2022 18h34

Receba os novos posts desta coluna no seu e-mail

Email inválido

A Globo apostou na tecnologia para fazer jogadores "aparecerem" em seu cenário especial de Copa do Mundo montado nos estúdios da emissora no Rio de Janeiro. Hologramas de atletas da seleção brasileira especialmente chamaram atenção nos últimos dias, com imagens em vídeo trazendo mensagens do jogadores chamando para a partida de estreia do Brasil no Mundial, que acontece nesta quinta-feira (24) às 16h (horário de Brasília) contra a Sérvia.

Na transmissão da vitória da Bélgica sobre o Canadá, hoje, por exemplo, o narrador Cléber Machado "interagiu" com Neymar no intervalo e com Marquinhos após o apito final. As imagens dos jogadores parecem estranhas no vídeo. Os efeitos especiais usados pela Globo fazem "surgir" cada atleta como se um portal fosse aberto no cenário de Copa.

Essa transição não é muito natural, e a imagem do jogador chega a "piscar", o que é notado também quando há corte de câmeras durante as falas de apresentador e atleta.

A própria interação simulada entre os profissionais da Globo ao vivo e os jogadores em vídeos gravados fica esquisita e soa artificial em alguns momentos. Cléber Machado até que se vira bem no papel, mas o resultado final não agrada de qualquer forma. Parece haver até um pequeno delay entre o fim do som da fala dos jogadores e a intervenção seguinte do narrador.

Sem falar que a arte não tem um final, uma transição de saída. A transmissão simplesmente corta para outra câmera mais fechada em Cléber. Quando a imagem mais aberta retorna, o jogador já desapareceu do cenário. O áudio também é um tanto estranho, com um eco maior.

A ideia de usar hologramas de jogadores não é nova, já apareceu em vários outros eventos da Globo, como a própria Copa, mas, desta vez, funcionou de um jeito estranho. Por mais tratamento que as imagens gravadas possam receber, é nítida a diferença para o resto do cenário na hora de fazer tudo parecer uma coisa só.

Inclusive ou despercebido pela galera das redes sociais uma cena do programa "Central da Copa" na qual a atriz Susana Vieira se atrapalhou um pouco com o holograma de Neymar.