2012-06-12 33 views
5

Tôi gặp sự cố khi tua lại âm thanh trong Javascript. Tôi về cơ bản có một đếm ngược tiếng bíp mỗi giây khi nó được hướng tới cuối đếm ngược.Tại sao âm thanh của tôi không được tua lại?

Tôi đã thử sử dụng;

var bip = new Audio("http://www.soundjay.com/button/beep-7.wav"); 
bip.play(); 

nhưng nó không phát ra tiếng bíp mỗi giây mà tôi đoán có liên quan đến việc phải tải âm thanh mới mỗi giây. Sau đó tôi đã thử tải âm thanh từ bên ngoài và kích hoạt nó bằng đoạn mã sau.

bip.pause(); 
bip.currentTime = 0; 
console.log(bip.currentTime); 
bip.play(); 

nhưng điều này chỉ đóng một lần âm thanh sau đó hoàn toàn thất bại trong việc tua lại nó (điều này được thể hiện qua giao diện điều khiển đăng nhập một thời gian 0,19 giây sau khi playthrough đầu tiên).

Có điều gì tôi thiếu ở đây không?

Trả lời

7

Trong google chrome, tôi nhận thấy rằng nó chỉ hoạt động nếu bạn có tệp âm thanh trong cùng một tên miền. Tôi không gặp vấn đề gì nếu tệp âm thanh nằm trong cùng một miền. Cài đặt sự kiện .currentTime hoạt động.

Cross-miền:

var bip = new Audio("http://www.soundjay.com/button/beep-7.wav"); 
bip.play(); 
bip.currentTime; //0.10950099676847458 
bip.currentTime = 0; 
bip.currentTime; //0.10950099676847458 

Same-domain:

var bip = new Audio("beep-7.wav"); 
bip.play(); 
bip.currentTime; //0.10950099676847458 
bip.currentTime = 0; 
bip.currentTime; //0 

tôi đã cố gắng googling cho một thời gian và có thể tìm thấy không có gì trong thông số kỹ thuật về vấn đề này hoặc thậm chí bất kỳ thảo luận.

+0

Thật là một kỳ lạ lỗi.Điều này dường như sửa chữa nó mặc dù cảm ơn bạn rất nhiều :) Tôi sẽ lưu trữ nó trên cùng một tên miền cuối cùng anyway, nhưng tôi nghĩ rằng tôi muốn thử nó trong một JSfiddle đầu tiên để tiết kiệm thời gian lol. –

+0

[this] (http://stackoverflow.com/questions/6273975/audio-tags-rewind) nói rằng thiết lập currentTime là dễ bị lỗi. – dsdsdsdsd

3

khi tôi muốn tua lại tôi chỉ đơn giản là tải các âm thanh một lần nữa:

my_audio.load() 

* btw, tôi cũng sử dụng một eventlistener cho 'canplay' để kích hoạt my_audio.play(). Dường như đây là cần thiết trong android, và các thiết bị có thể khác cũng *

0

Tiếp tục câu trả lời dsdsdsdsd với một chút sơn-by-số cho "toàn bộ công việc"

LƯU Ý: Trong ứng dụng của tôi, loc1 là một giả đề cập đến vị trí lưu trữ của bài hát

// ... code before ... 

tune = new Audio(loc1); // First, create audio event using js 

// set up "song's over' event listener & action 
tune.addEventListener('ended', function(){ 
tune.load(); //reload audio event (and reset currentTime!) 
tune.play(); //play audio event for subsequent 'ended' events 
},false); 

tune.play();  // plays it the first time thru 

// ... code after ... 

tôi đã dành ngày và những ngày cố gắng tìm ra những gì tôi đã làm sai, nhưng tất cả hoạt động tốt ngay bây giờ ... ít nhất trên các trình duyệt máy tính để bàn .. .

0

Kể từ phiên bản Chrome , hành vi được mô tả bởi @Esailija không thay đổi.

Tôi giải quyết sự cố này bằng cách mã hóa dữ liệu âm thanh trong mã hóa base64 và cấp dữ liệu đến Audio() sử dụng URL data:.

đang

Test:

snd = new Audio('data:audio/ogg;base64,[...base64 encoded data...]'); 
snd.onloadeddata = function() { 
    snd.currentTime = 0; 
    snd.play(); 
    setTimeout(function() { 
    snd.currentTime = 0; 
    snd.play(); 
    }, 200); 
}; 

(Tôi ngạc nhiên là không có báo cáo lỗi hoặc tài liệu tham khảo về vấn đề này ... hoặc có thể Google-fu của tôi là không đủ mạnh.)

Các vấn đề liên quan