Estou reproduzindo um pequeno clipe de áudio no clique de cada link na minha navegação
Código HTML:
<audio tabindex="0" id="beep-one" controls preload="auto" >
<source src="audio/Output 1-2.mp3">
<source src="audio/Output 1-2.ogg">
</audio>
Código JS:
$('#links a').click(function(e) {
e.preventDefault();
var beepOne = $("#beep-one")[0];
beepOne.play();
});
Está funcionando bem até agora.
Problema é quando um clipe de som já está em execução e eu clico em qualquer link que nada acontece.
Tentei parar o som que já estava sendo reproduzido ao clicar no link, mas não há nenhum evento direto na API de áudio do HTML5
Eu tentei seguir o código, mas não está funcionando
$.each($('audio'), function () {
$(this).stop();
});
Alguma sugestão, por favor?
html
html5-audio
Alok Jain
fonte
fonte
<audio>
carregamento continua também com opreload
atributo forçado anone
e o<source>
src do sif.primeiro você precisa definir um ID para o seu elemento de áudio
em seus js:
var ply = document.getElementById('player');
var oldSrc = ply.src;
// apenas para lembrar a fonte antigaply.src = "";
// para parar o player, você precisa substituir a fonte por nadafonte
Aqui está a minha maneira de fazer o método stop ():
Em algum lugar no código:
e depois em stop ():
Dessa forma, não produzimos pedidos adicionais, o antigo é cancelado e nosso elemento de áudio está em estado limpo (testado no Chrome e FF):>
fonte
Eu estava tendo o mesmo problema. A parada deve parar o fluxo e onplay ir ao vivo se ele é um rádio. Todas as soluções que vi tinham uma desvantagem :
player.currentTime = 0
continua baixando o fluxo.player.src = ''
aumentarerror
eventoMinha solução:
E o HTML
fonte
Security Error: Content at https://localhost/url.html may not load data from blob:https://localhost/cac32534-78b0-4a62-8355-cc8f1e708d64.
] Parece não ter efeito negativo, pois o código continua a ser executado depois disso (diferente de uma exceção não detectada).Este método funciona:
Mas se você não quiser escrever essas duas linhas de código toda vez que parar um áudio, poderá fazer uma de duas coisas. O segundo, eu acho que é o mais apropriado, e não sei por que os "deuses dos padrões javascript" não fizeram esse padrão.
Primeiro método: crie uma função e passe o áudio
Segundo método (preferido): estenda a classe Audio:
Eu tenho isso em um arquivo javascript chamado "AudioPlus.js", que incluo no meu html antes de qualquer script que lide com áudio.
Em seguida, você pode chamar a função de parada em objetos de áudio:
QUESTÃO FINAL DO CHROME COM "canplaythrough":
Não testei isso em todos os navegadores, mas esse é um problema que encontrei no Chrome. Se você tentar definir currentTime em um áudio que tenha um ouvinte de evento "canplaythrough" conectado a ele, você acionará esse evento novamente, o que pode levar a resultados indesejáveis.
Portanto, a solução, semelhante a todos os casos em que você anexou um ouvinte de evento que realmente deseja garantir que ele não seja acionado novamente, é remover o ouvinte de evento após a primeira chamada. Algo assim:
BÔNUS:
Observe que você pode adicionar ainda mais métodos personalizados à classe Audio (ou qualquer classe javascript nativa).
Por exemplo, se você quiser um método "restart" que reinicie o áudio, ele pode ser algo como:
fonte
function stopAudio(audio) { audio.pause(); this.audioStream.src = ""; }
Fazer isso acabou funcionando para mim e removeu o ícone do alto-falante no navegador Chrome que aparece quando o áudio está sendo reproduzido na página. testado no Chrome Versão 59.0.3071.109Da minha própria função javascript para alternar entre Reproduzir / Pausar - já que estou lidando com um fluxo de rádio, queria que ele limpe o buffer para que o ouvinte não acabe sincronizado com a estação de rádio.
Acontece que apenas limpar o currentTime não o reduz no Chrome, necessário também para limpar a fonte e carregá-la novamente. Espero que isso ajude.
fonte
Como uma observação lateral e porque recentemente usei o método de parada fornecido na resposta aceita, de acordo com este link:
https://developer.mozilla.org/en-US/docs/Web/Guide/Events/Media_events
Ao definir currentTime manualmente, é possível disparar o evento 'canplaythrough' no elemento de áudio. No link, ele menciona o Firefox, mas eu encontrei esse evento disparando depois de definir o currentTime manualmente no Chrome. Portanto, se você tiver um comportamento associado a esse evento, poderá terminar em um loop de áudio.
fonte
Às vezes não funciona no chrome,
apenas mude assim,
fonte
shamangeorge escreveu:
É isso mesmo que acontecerá, e a pausa também acionará o
pause
evento, os quais tornam essa técnica inadequada para uso como um método de "parada". Além disso, definir osrc
sugerido por zaki fará com que o player tente carregar o URL da página atual como um arquivo de mídia (e falhe) seautoplay
estiver ativado - definirsrc
comonull
não é permitido; sempre será tratado como um URL. Antes de destruir o objeto player, parece não haver uma boa maneira de fornecer um método de "parada", então eu sugiro apenas soltar o botão de parada dedicado e fornecer os botões de pausa e pular para trás - um botão de parada não adicionaria nenhuma funcionalidade .fonte
Essa abordagem é "força bruta", mas funciona assumindo que o uso do jQuery é "permitido".
<audio></audio>
Coloque as tags "player" com uma div (aqui com o ID "plHolder").Então este javascript deve funcionar:
fonte
#FlHolder
parece um erro de digitação para#plHolder
src
atributo do jogador.Acredito que seria bom verificar se o áudio está sendo reproduzido e redefinir a propriedade currentTime.
fonte
para mim esse código funcionando bem. (IE10 +)
Espero que esta ajuda.
fonte
O que eu gosto de fazer é remover completamente o controle usando o Angular2 e depois recarregá-lo quando a próxima música tiver um caminho de áudio:
Então, quando eu quero descarregá-lo no código, faço o seguinte:
Quando a próxima música é atribuída, o controle é completamente recriado do zero:
fonte
A maneira mais simples de contornar esse erro é pegá-lo.
audioElement.play () retorna uma promessa, portanto, o seguinte código com um .catch () deve ser suficiente para gerenciar esse problema:
Nota: convém substituir a função de seta por uma função anônima para compatibilidade com versões anteriores.
fonte