2011-09-07 29 views
21

bất cứ ai có bất kỳ ý tưởng làm thế nào để thực hiện loopless gaping cho các thẻ âm thanh? Tôi đang suy nghĩ điều gì đó dựa trên javascript ..loopless looping audio html5

Tôi có vòng lặp nói 1 biện pháp và tôi muốn nó lặp lại và ở lại tiến độ. Vì vậy, tôi cần vòng lặp để được mịn/gapless. Khi tôi chỉ đơn giản là thiết lập "vòng lặp" để đúng nó sẽ tụt hậu và không ở lại trong tiến độ.

+0

Có thể thực hiện được, mặc dù các tệp .ogg (tôi nghĩ) có thời gian đặt khung, vì vậy bạn sẽ luôn nhận được độ trễ trừ khi mẫu có độ dài hoàn hảo. Điều này là gì, chỉ cần quan tâm? – Bojangles

+0

đã tạo một loại máy trống tự động tạo tệp wav từ một loạt ghi chú (thời gian bắt đầu). mẫu là (nên được) chiều dài chính xác của vòng lặp .. khi tôi nhập khẩu vào Audacity và lặp nó có nó liền mạch. – ndmweb

+0

Âm thanh như một dự án gọn gàng. Bạn đã thử bất cứ điều gì cho đến nay? – Bojangles

Trả lời

4

Thật không may đây là một trong những điểm yếu của yếu tố HTML5. Không có gì đảm bảo rằng âm thanh sẽ phát khi bạn muốn hoặc không có sự chậm trễ.

Có hai tùy chọn đáng xem xét - SoundManager2 (http://www.schillmania.com/projects/soundmanager2/) là một thư viện tuyệt vời có thể hữu ích ở đây, mặc dù nó sẽ sử dụng Flash để phát âm thanh trong trường hợp này.

Tùy chọn khác là xem API âm thanh trên web trong Chrome hoặc API dữ liệu âm thanh trong Firefox. Cả hai đều thực sự mới, và chưa thực sự sẵn sàng cho thời gian chính, nhưng cho phép bạn làm những việc như phát lại âm thanh theo lịch trình, lặp lại và nhiều hơn thế nữa. Hãy xem http://www.htmlfivewow.com/slide58 để biết thêm thông tin!

+1

https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#EventScheduling-section Yep API âm thanh là những gì tôi theo dõi. Dường như họ vẫn đang bẻ khóa các chi tiết, nhưng bạn có thể chơi với nó trong chrome và webkit với một số tin tặc. – ndmweb

1

Điều này là chưa thể sử dụng âm thanh HTML5 vì sự kiện đã kết thúc chỉ kích hoạt một lần cho mỗi mục âm thanh.

4

Tôi đang cố gắng để làm điều này với khoảng, hãy thử này https://github.com/Hivenfour/SeamlessLoop

làm việc cho tôi với các file wav, thử nghiệm trên Chrome, Firefox và Opera

+5

Trong khi điều này về lý thuyết có thể trả lời câu hỏi, [nó sẽ là thích hợp hơn] (http://meta.stackexchange.com/q/8259) để bao gồm các phần thiết yếu của câu trả lời ở đây, và cung cấp liên kết để tham khảo. – oers

+0

Đây là một xấp xỉ khá tốt, gần đủ cho tôi. Cảm ơn rất nhiều. –

+0

Không đủ cho tôi. Đã kết thúc bằng API âm thanh trên web –

21

Trong khi vẫn chưa hoàn hảo, điều này đã làm việc cho tôi:

var audio_file = new Audio('whatever.mp3') 
audio_file.addEventListener('timeupdate', function(){ 
       var buffer = .44 
       if(this.currentTime > this.duration - buffer){ 
        this.currentTime = 0 
        this.play() 
       }}, false); 

Thử nghiệm với kích thước của bộ đệm để tìm thấy những gì tốt nhất cho bạn

+0

Ví dụ của bạn đã hoạt động hiệu quả nhất. Tôi đã thử hai thư viện: Gapless5 và Seamless.js. Gapless sử dụng âm thanh web sau đó HTML5 làm dự phòng, vì vậy nó không hoạt động trên mọi thứ. Liền mạch có khái niệm đệm nhưng tôi chỉ có thể làm cho nó hoạt động trên Chrome. Cám ơn vì đã chia sẻ! –

+0

Cảm ơn bạn, tôi yêu bạn. –

+1

Cảm ơn bạn về đoạn mã hoạt động @shooting_sparks! Có cách nào để hiểu giá trị chính xác của bộ đệm là gì? Cảm ơn –

7

giải pháp là phải có 2 trường hợp để kiểm soát chơi lại.

Something như thế này:

var current_player = "a"; 
var player_a = document.createElement("audio"); 
var player_b = document.createElement("audio"); 

player_a.src = "sounds/back_music.ogg"; 
player_b.src = player_a.src; 

function loopIt(){ 
    var player = null; 

    if(current_player == "a"){ 
     player = player_b; 
     current_player = "b"; 
    } 
    else{ 
     player = player_a; 
     current_player = "a"; 
    } 

    player.play(); 

    setTimeout(loopIt, 5333); //5333 is the length of the audio clip in milliseconds. 
} 

loopIt(); 

Và nếu bạn đang sử dụng SoundManager2, nguồn âm thanh thông qua một URI dữ liệu thay vì một yêu cầu URL.

Kỳ lạ thay, tôi thấy rằng SoundManager2 yêu cầu tệp từ máy chủ mỗi lần phát. Ngay cả khi tải từ bộ nhớ cache, sẽ có sự chậm trễ cho đến khi tiêu đề không được sửa đổi được nhận cho tệp âm thanh.

+0

Đây không phải là phương pháp hiệu quả, vì mili giây trong trình duyệt không nhất quán hoặc đủ chi tiết. Bạn sẽ gặp phải sự chậm trễ nếu trình duyệt bị chậm lại do tải quá trình hoặc do lỗi vòng. – xHocquet

+0

Hmm. Hấp dẫn. Tôi có xu hướng đồng ý với xHocquet nhưng giải pháp của bạn có thể hoàn toàn khả thi cho âm thanh môi trường xung quanh, pad hoặc trắng/hồng với âm lượng mờ dần và mờ dần. Tôi nghi ngờ nó có thể vẫn còn trục trặc trong một cách mà không thể kiểm soát ngay cả trong những trường hợp này. –

3

Vâng, đây là một nỗi đau thực sự ... rõ ràng bất cứ ai spec'd ra các yếu tố không phải là một nhạc sĩ hoặc nhà phát triển trò chơi - heh.

Nhưng dù sao, tùy thuộc vào những gì bạn đang làm, một cách giải quyết khác có thể là tạo một MP3/OGG/wav, đó là một vài lần lặp lại vòng lặp của bạn. Điều này có ích cho nơi bạn muốn lặp lại âm thanh chỉ một vài lần trước khi bạn ngừng phát âm thanh đó.

Một ví dụ về điều này có thể là một cầu thủ đẩy trong một con tàu tên lửa. Tôi đang phát triển một trò chơi tại thời điểm này chỉ với kịch bản này và đã tạo ra một MP3 với một số vòng của hiệu ứng âm thanh lực đẩy, tổng cộng khoảng 6 giây phát lại. Để giảm thiểu kích thước của tải xuống, tôi đã mã hóa âm thanh ở tốc độ 32kbps - thấp hơn bất kỳ và nó bắt đầu phát ra âm thanh không thể chấp nhận được, vì âm thanh lực đẩy phần lớn là nhiễu trắng.

Như bạn có thể đoán, tôi chỉ là ngân hàng trên thực tế là nó rất khó có một cầu thủ sẽ liên tục đẩy trong 6 giây.Nếu họ làm thế, họ sẽ nghe thấy khoảng trống, nhưng tôi có thể sống với điều đó. Hầu hết thời gian họ sẽ không đẩy mạnh bất cứ điều gì như vậy lâu, vì vậy sẽ không nghe thấy trục trặc.

Một tùy chọn khác mà tôi đã xem xét là một cặp mẫu mờ dần trong và ngoài và cả hai vòng lặp có độ lệch.

Trong khi những tác phẩm này cho một số kịch bản trò chơi, hầu như chắc chắn sẽ không hoạt động đối với bất kỳ loại kịch bản âm nhạc nào. YMMV.

1

cách tiếp cận của tôi là một trong những khó khăn, nhưng một trong đó làm việc cho nhạc nền xung quanh

giả theo dõi của chúng tôi có 5,3 giây

bạn có 2 track âm thanh của cùng một tập tin. khi nào sắp kết thúc (ví dụ 1 giây trước khi kết thúc - 4.3s-5.3s) bạn làm mờ nó ra (thiết lập khối lượng theo phần trăm vị trí trong vòng một giây này). đồng thời, bài hát thứ hai bắt đầu mờ dần (0s-1s). bạn có thể làm điều đó qua khoảng thời gian 50ms hoặc một thứ khác, tùy thuộc vào thư viện âm thanh của bạn

sau khi phát lại kết thúc bạn chuyển một biến boolean điều khiển fadein/fadeout này và ngược lại. trong lần chạy tiếp theo

+0

Một âm thanh web html5 gainNode có thể được sử dụng để làm mờ dần vào/ra. –

2

Tôi đã tìm kiếm một vài giờ cho giải pháp, vì đây là trang đầu tiên tôi truy cập, tôi muốn chia sẻ với bạn liên kết tới thư viện JS. loop of audio tracks whithout bất kỳ khoảng cách nào Gapless-5

2

Tôi đã thử các phương pháp trên mà không thành công, Trong trường hợp sử dụng của tôi (sử dụng Firefox 43.0), tất cả dường như nhấp. Điều này một phần do phải lặp lại một giai điệu liên tục mà không có điểm ngắt tiện dụng hoặc điểm thấp trong nó (Tôi đang cố gắng để tạo ra một động cơ xe reving bằng cách sử dụng 22010 mẫu/giây mono .wav tập tin).

Tuy nhiên tôi có thể kết hợp tệp .wav của tôi với nhau nhiều lần để tạo một tệp .wav dài không có nhấp chuột nào (ngoại trừ trường hợp không thường xuyên vẫn xuất hiện ở cuối), điều này là do bản gốc của tôi tệp .wav được tạo cẩn thận theo chu kỳ. Bây giờ tôi có kế hoạch để có một số các tập tin dài tất cả chơi liên tục cùng một lúc (một cho mỗi cấp độ rpm xe) và trộn các tín hiệu này bằng cách sử dụng một gainNode (được mô tả ở đây: http://www.html5rocks.com/en/tutorials/webaudio/intro/). Điều này sẽ dẫn đến một động cơ xe hơi nhấp chuột miễn phí mà sẽ âm thanh tốt hơn nhiều so với chỉ đơn giản là bắt đầu và dừng các tập tin .wav cá nhân từ chơi.