HTML5 오디오 중지 기능


147

내 탐색에서 각 링크를 클릭 할 때 작은 오디오 클립을 재생하고 있습니다

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>

JS 코드 :

$('#links a').click(function(e) {
    e.preventDefault();
    var beepOne = $("#beep-one")[0];
    beepOne.play();
});

지금까지 잘 작동합니다.

문제는 사운드 클립이 이미 실행 중이고 링크를 클릭하면 아무 일도 일어나지 않는 것입니다.

링크 클릭으로 이미 재생중인 사운드를 중지하려고했지만 HTML5의 오디오 API에 직접적인 이벤트가 없습니다.

다음 코드를 시도했지만 작동하지 않습니다.

$.each($('audio'), function () {
    $(this).stop();
});

제발 어떤 제안?

답변:


350

stop()당신 대신에 시도 할 수 있습니다 :

sound.pause();
sound.currentTime = 0;

원하는 효과가 있어야합니다.


6
Chrome에서 작동하지 않습니다. 오디오 요소는 오디오로드를 계속 유지하므로 발생하지 않아야합니다.
Pieter

3
Chrome에서는 속성을 강제로 적용 하고 의 src를 제거 하여 <audio>계속로드 합니다. preloadnone<source>
파이오니어 하늘

6
감사합니다. 참고로 w3c가 왜 스펙에 stop 메소드를 포함시키지 않기로 결정했는지 알고 싶습니다.
Reahreic 2019

25

먼저 오디오 요소의 ID를 설정해야합니다

당신의 js에서 :

var ply = document.getElementById('player');

var oldSrc = ply.src;// 단지 오래된 소스를 기억하기 위해

ply.src = "";// 플레이어를 멈추려면 소스를 아무것도 교체하지 않아야합니다


4
오디오 스트리밍을위한 최고의 솔루션
Hossein

1
그래 .. 오디오 소스 파일에 대한 다른 네트워크 요청을 할 것입니다
. 메릴랜드 아라파트 알 마흐무드

오디오는로드 될 때까지 재생되지 않으므로 오디오 재생시 원하지 않는 지연이 발생합니다.
Abhi

인터넷 라디오 및 Firefox와 같은 스트림을 재생할 때 일시 중지 / 재생이 전환되면 마지막 청크가 반복되는 문제의 좋은 해결책입니다. 정말 고마워.
namikiri

14

stop () 메소드를 수행하는 내 방법은 다음과 같습니다.

코드 어딘가 :

audioCh1: document.createElement("audio");

그런 다음 stop ()에서

this.audioCh1.pause()
this.audioCh1.src = 'data:audio/wav;base64,UklGRiQAAABXQVZFZm10IBAAAAABAAEAVFYAAFRWAAABAAgAZGF0YQAAAAA=';

이런 식으로 추가 요청을 생성하지 않고 이전 요청은 취소되고 오디오 요소가 깨끗한 상태입니다 (Chrome 및 FF에서 테스트 됨).


10

나는 같은 문제가 있었다. 멈춤 부 스트림을 중지해야하며, 이동 onplay 라이브 는 라디오 인 경우. 내가 본 모든 솔루션에는 단점이 있습니다 .

  • player.currentTime = 0 스트림을 계속 다운로드합니다.
  • player.src = ''인상 error이벤트

내 해결책 :

var player = document.getElementById('radio');
player.pause();
player.src = player.src;

그리고 HTML

<audio src="http://radio-stream" id="radio" class="hidden" preload="none"></audio>

이것은 Chrome 및 Firefox에서 작동합니다. 그러나 Firefox에서는 다음과 같은 오류가 발생합니다 (콘솔에서) [ Security Error: Content at https://localhost/url.html may not load data from blob:https://localhost/cac32534-78b0-4a62-8355-cc8f1e708d64.] 잡히지 않은 예외와 달리이 이후에도 코드가 계속 실행되므로 부정적인 영향을 미치지 않는 것으로 보입니다.
BReddy

6

이 방법은 작동합니다 :

audio.pause();
audio.currentTime = 0;

그러나 오디오를 중지 할 때마다이 두 줄의 코드를 작성하지 않으려면 두 가지 중 하나를 수행하면됩니다. 내가 생각하는 두 번째가 더 적절한 것이라고 생각하는데 왜 "자바 스크립트 표준의 신들"이이 표준을 만들지 않았는지 모르겠습니다.

첫 번째 방법 : 함수 생성 및 오디오 전달

function stopAudio(audio) {
    audio.pause();
    audio.currentTime = 0;
}

//then using it:
stopAudio(audio);

두 번째 방법 (권장) : 오디오 클래스 확장 :

Audio.prototype.stop = function() {
    this.pause();
    this.currentTime = 0;
};

오디오를 처리 할 스크립트 전에 HTML에 포함하는 "AudioPlus.js"라는 자바 스크립트 파일에이 파일이 있습니다.

그런 다음 오디오 객체에서 중지 기능을 호출 할 수 있습니다.

audio.stop();

"canplaythrough"와 함께 마지막으로 크롬 문제 :

모든 브라우저에서 이것을 테스트하지는 않았지만 이것은 Chrome에서 발생한 문제입니다. "canthroughthrough"이벤트 리스너가 연결된 오디오에서 currentTime을 설정하려고하면 해당 이벤트가 다시 트리거되어 원하지 않는 결과가 발생할 수 있습니다.

따라서 다시 트리거되지 않도록하려면 이벤트 리스너를 연결했을 때의 모든 경우와 유사한 솔루션은 첫 번째 호출 후 이벤트 리스너를 제거하는 것입니다. 이 같은:

//note using jquery to attach the event. You can use plain javascript as well of course.
$(audio).on("canplaythrough", function() {
    $(this).off("canplaythrough");

    // rest of the code ...
});

보너스:

Audio 클래스 (또는 그 문제에 대한 기본 자바 스크립트 클래스)에 훨씬 더 많은 사용자 정의 메소드를 추가 할 수 있습니다.

예를 들어 오디오를 다시 시작한 "다시 시작"방법을 원하면 다음과 같이 보일 수 있습니다.

Audio.prototype.restart= function() {
    this.pause();
    this.currentTime = 0;
    this.play();
};

function stopAudio(audio) { audio.pause(); this.audioStream.src = ""; } 이 작업을 수행하면 Chrome 브라우저에서 페이지에서 오디오가 재생 중일 때 나타나는 스피커 아이콘이 제거되었습니다. 크롬 버전 59.0.3071.109 테스트
lasec0203

일반적으로 이와 같은 프로토 타입을 확장하지 않는 것이 좋습니다. 오디오 무거운 응용 프로그램이 서로 다른 경우에 대해 서로 다른 정지 기능을 가지고 프로토 타입 덤비는 것은 가능성이 장기 이럴 버그로 이어질 것입니다 수
milesaron

5

내 자신의 자바 스크립트 기능에서 재생 / 일시 중지를 전환하기 위해-라디오 스트림을 처리하고 있기 때문에 청취자가 라디오 방송국과 동기화되지 않도록 버퍼를 지우고 싶었습니다.

function playStream() {

        var player = document.getElementById('player');

        (player.paused == true) ? toggle(0) : toggle(1);

}

function toggle(state) {

        var player = document.getElementById('player');
        var link = document.getElementById('radio-link');
        var src = "http://192.81.248.91:8159/;";

        switch(state) {
                case 0:
                        player.src = src;
                        player.load();
                        player.play();
                        link.innerHTML = 'Pause';
                        player_state = 1;
                        break;
                case 1:
                        player.pause();
                        player.currentTime = 0;
                        player.src = '';
                        link.innerHTML = 'Play';
                        player_state = 0;
                        break;
        }
}

currentTime을 지우는 것만으로 Chrome에서 시간을 자르지 않고 소스도 지우고 다시로드해야합니다. 도움이되기를 바랍니다.


4

참고 로이 링크에 따르면 최근에 허용 된 답변에 제공된 중지 방법을 사용했기 때문에 :

https://developer.mozilla.org/en-US/docs/Web/Guide/Events/Media_events

currentTime을 수동으로 설정하면 오디오 요소에서 'canplaythrough'이벤트가 발생할 수 있습니다. 링크에는 Firefox가 언급되어 있지만 Chrome에서 currentTime을 수동으로 설정 한 후이 이벤트가 발생했습니다. 따라서이 이벤트에 동작이 연결되면 오디오 루프가 생길 수 있습니다.


3

크롬에서는 가끔 작동하지 않습니다.

sound.pause();
sound.currentTime = 0;

그냥 그렇게 바꾸세요

sound.currentTime = 0;
sound.pause();

2

shamangeorge는 다음과 같이 썼다.

currentTime을 수동으로 설정하면 오디오 요소에서 'canplaythrough'이벤트가 발생할 수 있습니다.

이것은 실제로 일어날 일이며, 일시 중지하면 pause이벤트가 트리거 될 수도 있습니다.이 두 가지 방법 모두이 기술을 "중지"방법으로 사용하기에 적합하지 않습니다. 또한, 설정을 src하면 미디어 파일로 현재 페이지의 URL을로드 (실패) 할 수있는 플레이어 시도를 할 것입니다 자키에 의해 제안 autoplay사용할 수 있습니다 - 설정 srcnull허용되지 않습니다; 항상 URL로 취급됩니다. 플레이어 객체를 파괴하지 않는 한 "중지"방법을 제공하는 좋은 방법이없는 것 같습니다. 전용 중지 버튼을 삭제하고 대신 일시 중지 및 건너 뛰기 버튼을 제공하는 것이 좋습니다. 정지 버튼은 실제로 기능을 추가하지 않습니다. .


1

이 접근 방식은 "강제력"이지만 jQuery 사용이 "허용"된 것으로 가정합니다. "플레이어" <audio></audio>태그를 div (여기서 id는 "plHolder")로 둘러 쌉니다.

<div id="plHolder">
     <audio controls id="player">
     ...
     </audio>
<div>

그런 다음이 자바 스크립트가 작동해야합니다.

function stopAudio() {
    var savePlayer = $('#plHolder').html(); // Save player code
    $('#player').remove(); // Remove player from DOM
    $('#FlHolder').html(savePlayer); // Restore it
}

jquery를 사용하지 않고 zaki가 위의 답변에서 동일한 것을 설명합니다.
Alok Jain

나는 그것을 실험하지 않았지만 <source> 태그가 여러 개인 경우 그의 방법이 효과가 있는지 확신하지 못했습니다.
user3062615

#FlHolder에 대한 오타가 보인다#plHolder
파이오니어 하늘

1
@ alok-jain 의견에 대한 답장 :이 답변은 @zaki의 답변과 완전히 다릅니다. 여기서 우리는 DOM에서 요소를 다시 렌더링합니다. 다른 답변에서 그는 src플레이어 의 속성을 "비우기"합니다 .
파이오니어 하늘

0

오디오가 재생 중인지 확인하고 currentTime 속성을 재설정하는 것이 좋을 것이라고 생각합니다.

if (sound.currentTime !== 0 && (sound.currentTime > 0 && sound.currentTime < sound.duration) {
    sound.currentTime = 0;
}
sound.play();

0

저에게 코드가 잘 작동합니다. (IE10 +)

var Wmp = document.getElementById("MediaPlayer");                
    Wmp.controls.stop();

<object classid="clsid:6BF52A52-394A-11D3-B153-00C04F79FAA6"
    standby="Loading áudio..." style="width: 100%; height: 170px" id="MediaPlayer">...

이 도움을 바랍니다.


0

내가 좋아하는 것은 Angular2를 사용하여 컨트롤을 완전히 제거한 다음 다음 노래에 오디오 경로가있을 때 다시로드하는 것입니다.

<audio id="audioplayer" *ngIf="song?.audio_path">

그런 다음 코드에서 언로드하고 싶을 때 다음과 같이하십시오.

this.song = Object.assign({},this.song,{audio_path: null});

다음 곡이 지정되면 처음부터 컨트롤이 완전히 재생성됩니다.

this.song = this.songOnDeck;

0

이 오류를 해결하는 간단한 방법은 오류를 포착하는 것입니다.

audioElement.play ()는 promise를 반환하므로 .catch ()가있는 다음 코드로이 문제를 관리하면됩니다.

function playSound(sound) {
  sfx.pause();
  sfx.currentTime = 0;
  sfx.src = sound;
  sfx.play().catch(e => e);
}

참고 : 이전 버전과의 호환성을 위해 화살표 기능을 익명 기능으로 대체 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.