HTML5 오디오 루핑


80

나는 최근에 HTML5 오디오를 가지고 놀았는데, 사운드를 재생할 수는 있지만 한 번만 재생됩니다. 내가 무엇을 시도하든 (속성, 이벤트 핸들러 등을 설정) 루프를 만들 수 없습니다.

내가 사용하는 기본 코드는 다음과 같습니다.

//myAudio is declared at a global scope, so it doesn't get garbage collected.
myAudio = new Audio('someSound.ogg');
myAudio.loop = true;
myAudio.play();

Chrome (6.0.466.0 dev)과 Firefox (4 베타 1)를 사용하여 테스트하고 있는데, 둘 다 루핑 요청을 무시하고 기뻐하는 것 같습니다. 어떤 아이디어?

업데이트 : 이제 모든 주요 브라우저에서 loop 속성이 지원 됩니다.


1
Chrome에 대해서는 확실하지 않지만 Firefox는 루핑을 지원하지 않습니다.
luiscubal

1
일단 종료되면 시작하십시오. myAudio.addEventListener ( "ended", function (e) {myAudio.play ();}, false);
mattbasta

@Brandon 왜 이것이 작동하지 않는지 궁금합니다. 이 코드와 수락 된 답변의 유일한 차이점은 수락 된 답변에서 currentTime를 호출하기 전에 0으로 설정 된다는 것 play입니다. 그게 필요한가요?
mgiuca

2
@Brandon 예, kingjeffrey의 답변에 대한 두 번째 의견을 참조하십시오. 을 설정해야합니다 currentTime.
mgiuca 2011-06-23

이것은 잘 작동합니다 (적어도 오늘)
dvlden

답변:


118

loop지정된 동안에는 구현되지 않습니다.내가 아는 모든 브라우저 Firefox [이 점을 지적 해 주신 Anurag에게 감사드립니다] . 다음은 HTML5 지원 브라우저에서 작동하는 또 다른 루핑 방법입니다.

var myAudio = new Audio('someSound.ogg'); 
myAudio.addEventListener('ended', function() {
    this.currentTime = 0;
    this.play();
}, false);
myAudio.play();

1
흠 ... 흥미 롭군요. 이전에는이 ​​방법으로 운이 좋지 않았지만 현재 시간을 설정하지 않았습니다. 나는이 때, 그러나 나는 얻을 : "catch되지 않은 오류 : INDEX_SIZE_ERR : DOM 예외 일" "this.currentTime = 0"라인에를
도지

1
@Toji 다음은 INDEX_SIZR_ERR 오류에 대한 문서입니다 . 이는 노래의 시작 부분이 브라우저가 검색 할 수있는 범위를 벗어 났음을 의미합니다. 이것은 브라우저가 스트리밍 미디어라고 생각하거나 서버에 특정 기능이없는 경우에 발생합니다 (이 특정 기능이 무엇인지 잊어 버리지 만 추적하려고 시도합니다). 사용 this.startTime가능한 가장 빠른 시간으로 돌아가는 데 사용할 수도 있습니다 .
kingjeffrey

@Toji .currentTime필요한 이유 는 사양이 노래의 끝을 처리하는 방법과 관련이 있습니다. 브라우저는 노래를 일시 중지해야합니다. 따라서 재생을 다시 시작하면 노래의 끝에서 그렇게됩니다. 재생 헤드를 재설정해야합니다.
kingjeffrey

@Toji .currentTime일을 할 수 없다면 또 다른 생각이 있습니다 . 콜백 함수 내에서 myAudio동일한 파일로 다시 선언 하고 다시 재생할 수 있습니다. 다시 선언하면 재생 헤드가 노래의 시작 부분으로 재설정됩니다.
kingjeffrey

this.startTime으로 설정하면 동일한 오류가 발생하지만 이제 서버 문제인지 궁금해지기 시작했습니다. 로컬 django 서버 (django의 가장 강력한 기능이 아님)에서 정적 파일을 제공하고 있습니다. 아누 라그가 효과가 있다는 사실과 짝을 이루고 아마 나일 것입니다. 좀 더 장난감을 가지고 결과를 알려 드리겠습니다.
Toji

61

@kingjeffrey 및 @CMS의 제안을 결합하여 더 많은 조언을 추가하려면 사용 loop가능한 곳에서 사용하고 그렇지 않은 경우 kingjeffrey의 이벤트 처리기로 대체 할 수 있습니다. 사용하려는 이유 좋은 이유있다 loop으로는 논의 : 자신의 이벤트 핸들러를 작성하지 모질라의 버그 리포트는 하지만, loop현재 내가 알고있는 모든 브라우저에서 (간격)없이 완벽하게 루프를하지 않는가에 가능성이 확실히 가능하고있어, 미래에 표준이됩니다. 자체 이벤트 핸들러는 어떤 브라우저에서도 완벽하지 않습니다 (JavaScript 이벤트 루프를 통해 펌프질해야하기 때문에). 따라서 loop자신의 이벤트를 작성하는 대신 가능한 경우 사용 하는 것이 가장 좋습니다 . CMS가 Anurag의 답변에 대한 의견에서 지적했듯이looploop 변수-지원되는 경우 부울 (거짓)이되고, 그렇지 않으면 현재 Firefox 에서처럼 정의되지 않습니다.

이들을 합치면 :

myAudio = new Audio('someSound.ogg'); 
if (typeof myAudio.loop == 'boolean')
{
    myAudio.loop = true;
}
else
{
    myAudio.addEventListener('ended', function() {
        this.currentTime = 0;
        this.play();
    }, false);
}
myAudio.play();

고마워. 이것은 Opera, Firefox, Chrome에서 완벽하게 작동했습니다. 그래서 Safari에 더 많은 사운드 (mp3)를 추가 할 수 있습니다 .... ??? (가 지원에는 OGG와 MP3) 크롬에 대한 중복 원인이 아마 변수를 것입니다 추가 ...

@pixelass 코드에서 어떻게해야할지 잘 모르겠습니다. HTML에서는 <audio> 태그를 서로 중첩하고 브라우저는 일치하는 가장 바깥 쪽 태그를 선택합니다. 프로그래밍 방식의 오디오 개체에서 중첩 할 수 있는지 모르겠습니다. 하지만 확실히 직접 프로그래밍 할 수 있습니다. Audio.canPlayType 메서드를 확인하세요.
mgiuca

나는 html 방법을 알고 있습니다. Audio.canPlayType 메서드를 사용해 볼 수 있습니다. 지금은 2 개의 변수를 사용하고 있으므로 크롬에서 2 개의 파일이 재생됩니다. 이것은 내가 만든 파도의 일부 루프이기 때문에 실제로별로 중요하지 않습니다. ...하지만 단순히 2 개의 소스를 추가하는 것이 훨씬 더 좋을 것입니다. 관심이 있다면 pixelass.com .

19

귀하의 코드는 Chrome (5.0.375) 및 Safari (5.0)에서 작동합니다. Firefox (3.6)에서 반복되지 않습니다.

예를 참조하십시오.

var song = new Audio("file");
song.loop = true;
document.body.appendChild(song);​

+1 아주 멋지다. 나는 loop웹킷에서 구현되었음을 알지 못했습니다 .
kingjeffrey

10
+1, loop지원 여부를 감지 할 수도 있습니다 . 예 :typeof new Audio().loop == 'boolean';
Christian C. Salvadó

@CMS 사용 ==및 사용을 피하십시오. ===초보자에게는 더 나은 운영자이며 성능에는 더 좋습니다.
Klaider

Firefox 80과 호환 되나요?
Mostafiz Rahman 20.07.15

4
var audio = new Audio("http://rho.nu/pub/Game%20Of%20Thrones%20-%20Main%20Theme%20-%20Soundtrack.mp3");

audio.addEventListener('canplaythrough', function() {
    this.currentTime = this.duration - 10;
    this.loop = true;
    this.play();
});

canplaythrough eventlistener에서 loop = true로 설정하면됩니다.

http://jsbin.com/ciforiwano/1/edit?html,css,js,output


4

가장 간단한 방법은 다음과 같습니다.

bgSound = new Audio("sounds/background.mp3");
bgSound.loop = true;
bgSound.play();

2

이벤트 리스너에 jQuery를 사용해보십시오. 그러면 Firefox에서 작동합니다.

myAudio = new Audio('someSound.ogg');

$(myAudio).bind('ended', function()  {
    myAudio.currentTime = 0;
    myAudio.play();
});

myAudio.play();

그런 것.


1

이렇게 했어요

<audio controls="controls" loop="loop">
<source src="someSound.ogg" type="audio/ogg" />
</audio>

그리고 이것은 이렇게 보입니다

여기에 이미지 설명 입력


0

이것은 작동하며 위의 방법을 전환하는 것이 훨씬 쉽습니다.

인라인 사용 : onended="if($(this).attr('data-loop')){ this.currentTime = 0; this.play(); }"

루핑을 켜십시오. 루핑을 $(audio_element).attr('data-loop','1'); 끄십시오.$(audio_element).removeAttr('data-loop');


0

사운드의 정확한 길이를 알고 있다면 setInterval을 시도해 볼 수 있습니다. setInterval이 x 초마다 사운드를 재생하도록 할 수 있습니다. X는 소리의 길이입니다.


이것은 질문에 대한 답을 제공하지 않습니다. 작성자에게 비평이나 설명을 요청하려면 게시물 아래에 댓글을 남겨주세요. 언제든지 자신의 게시물에 댓글을 달 수 있으며, 충분한 평판얻으면 모든 게시물댓글 수 있습니다 .
알렉스 숯불

4
@AlexChar 동의하지 않습니다. 이것은 최소한 질문에 답하려는 시도입니다. 코드가 어떻게 생겼는지 정확히 보여주기 위해 확장하면 도움이 될 수 있으며 문제를 해결하는 가장 좋은 방법은 아니지만 "답이 아닙니다"는 아닙니다.
안토니 제분 용 곡물

그렇게하면 경험 문제가 발생합니다.
Klaider
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.