Fiz um site onde se o usuário clicar, toca um som. Para evitar que o som se sobreponha, eu tive que adicionar o código:
n.pause();
n.currentTime = 0;
n.play();
Mas isso causa o erro:
The play() request was interrupted by a call to pause()
Acontece toda vez que o evento de som é acionado logo após outro acionador. O som ainda toca bem, mas quero evitar que essa mensagem de erro apareça constantemente. Alguma ideia?
javascript
html
google-chrome
audio
Owen M
fonte
fonte
onCanPlay()
. Todas essas respostas são truques sujos.n.play()
entãon.pause()
. Para isso, este artigo de Fundamentos da Web descreve a solução. tl; dr:n.play().then(() => { n.pause()})
Respostas:
Também encontrei este problema recentemente - pode ser uma condição de corrida entre
play()
epause()
. Parece que há uma referência a esse problema ou algo relacionado aqui .Como @Patrick aponta,
pause
não retorna uma promessa (ou nada), então a solução acima não funcionará. Embora o MDN não tenha documentospause()
, no rascunho WC3 para elementos de mídia , ele diz:Portanto, também se pode verificar o
paused
atributo em seu retorno de chamada de tempo limite.Com base nesta ótima resposta do SO , aqui está uma maneira de verificar se o vídeo está (ou não) realmente reproduzindo, para que possa acionar com segurança uma reprodução () sem o erro.
Caso contrário, a resposta de @Patrick deve funcionar.
fonte
Após horas de pesquisa e trabalho, encontrei a solução perfeita .
Depois disso, você pode alternar entre reproduzir / pausar o mais rápido possível e funcionará corretamente .
fonte
Eu encontrei esse problema e tive um caso em que precisava clicar em pause () e depois em play (), mas ao usar pause (). Then () fico indefinido.
Descobri que se iniciasse a reprodução 150 ms após a pausa, o problema seria resolvido. (Esperançosamente o Google corrige em breve)
fonte
Acabei de publicar um artigo sobre esse problema exato em https://developers.google.com/web/updates/2017/06/play-request-was-interrupted que informa exatamente o que está acontecendo e como corrigi-lo .
fonte
tente
fonte
Esta solução me ajudou:
fonte
Dependendo de quão complexa você deseja sua solução, isso pode ser útil:
Isso é um pouco exagerado, mas ajuda ao lidar com uma promessa em cenários únicos.
fonte
As soluções propostas aqui não funcionaram para mim ou foram muito grandes, então eu estava procurando por outra coisa e encontrei a solução proposta por @dighan em bountysource.com/issues/
Então, aqui está o código que resolveu meu problema:
Ainda gera um erro no console, mas pelo menos o vídeo está sendo reproduzido :)
fonte
Talvez uma solução melhor para isso, conforme descobri. Spec diz conforme citado em @JohnnyCoder:
-> carregando
indica o estado de prontidão da mídia HAVE_ENOUGH_DATA = 4
Basicamente, só carregue o vídeo se ainda não estiver carregado. Ocorreu um erro mencionado para mim, porque o vídeo não foi carregado. Talvez seja melhor do que usar um tempo limite.
fonte
removeu todos os erros: (texto digitado)
fonte
Com a transmissão ao vivo, eu estava enfrentando o mesmo problema. e minha correção é esta. No vídeo html TAG, certifique-se de remover "autoplay" e use o código abaixo para jogar.
fonte
Chrome retorna uma promessa nas versões mais recentes. Caso contrário, simplesmente:
fonte
Tenho o mesmo problema, finalmente resolvo por:
fonte
Este código foi consertado para mim!
Código modificado de @JohnnyCoder
HTML:
JS:
fonte
Eu consertei com alguns códigos abaixo:
Quando quiser jogar, use o seguinte:
Da mesma forma, quando você quiser fazer uma pausa:
fonte
Aqui está outra solução se o motivo for que o download do seu vídeo é muito lento e o vídeo não foi armazenado em buffer:
if (videoElement.state.paused) { videoElement.play(); } else if (!isNaN(videoElement.state.duration)) { videoElement.pause(); }
fonte
Parece que muitos programadores encontraram esse problema. uma solução deve ser bastante simples. elemento de mídia retorna
Promise
de ações, entãodeve fazer o truque
fonte
aqui está uma solução do blog googler:
fonte
Todos os novos vídeos de suporte do navegador serão reproduzidos automaticamente, mas sem som, portanto, coloque algo como este
O URL do vídeo deve corresponder ao status SSL se o seu site estiver rodando com https, então o URL do vídeo também deve ser https e o mesmo para HTTP
fonte
A solução mais limpa e simples :
fonte
Razão um - chamar a pausa sem esperar que a promessa de reprodução seja resolvida
muitas respostas para este cenário, então irei me referir apenas ao melhor documento para esse problema:
https://developers.google.com/web/updates/2017/06/play-request-was-interrupted
Razão dois - chamar o jogo quando a guia não está focada
Nesse caso, o navegador pode interromper o
play
chamandopause
quando a guia não está em foco. para economizar recursos para a guia ativa.Portanto, você pode apenas esperar que a guia seja focada antes de chamar o jogo:
fonte
Eu encontrei o mesmo problema e resolvi adicionando dinamicamente o
autoplay
atributo em vez de usarplay()
. Dessa forma, o navegador decidiu jogar sem entrar na condição de corrida.fonte
Tentando fazer um vídeo de reprodução automática entrar em loop chamando
play()
quando ele termina, a solução alternativa de tempo limite não funcionou para mim (por maior que seja o tempo limite).Mas descobri que, ao clonar / substituir o vídeo por jQuery ao terminar, ele faria um loop adequado.
Por exemplo:
e
Estou usando o Chrome 54.0.2840.59 (64 bits) / OS X 10.11.6
fonte
Acho que eles atualizaram o vídeo html5 e descontinuaram alguns codecs. Funcionou para mim depois de remover os codecs.
No exemplo abaixo:
fonte
Quando você vê um erro com
Uncaught (in promise)
Isso significa apenas que você precisa lidar com a promessa com um.catch()
Neste caso,.play()
retorna uma promessa. Você pode decidir se deseja registrar uma mensagem, executar algum código ou não fazer nada, mas enquanto tiver o,.catch()
o erro desaparecerá.fonte
Eu usei um truque para combater esse problema. Defina uma variável global var audio;
e na verificação de função
e na função de parada
então a próxima chamada de
audio.play
, o áudio estará pronto a partir de '0' currentTimeeu usei
mas não funcionou. Obrigado.
fonte