2012-09-07 45 views
21

Tôi đang cố gắng để tạo ra một tính năng vòng lặp đơn giản sử dụng HTML5 âm thanh và có một giải pháp rất thô sơ như sau:Thiết granularity của HTML5 âm thanh sự kiện 'timeupdate'

$(audio).bind('timeupdate', function() { 
    if (audio.currentTime >= 26){ 
    var blah = audio.currentTime; 
    audio.currentTime = 23; 
    console.log(blah); 
    } 
}) 

này hoạt động tốt nhưng trục trặc chỉ đây là sự kiện timeupdate không kích hoạt rất nhất quán. Ví dụ, console.log trên trả về: 26,14031982421875

26,229642868041992

26,13462257385254

26,21796226501465

... vv. (Bạn nhận được ý tưởng..không phù hợp)

Rõ ràng điều này sẽ không hoạt động đối với một ứng dụng mà thời gian là quan trọng (ứng dụng nhạc). Vì vậy, giải pháp hiển nhiên đối với tôi là tăng độ chi tiết mà sự kiện timeupdate được kích hoạt. Tôi đã không thể tìm thấy bất kỳ tài liệu API nào ... nhưng rất muốn biết liệu có cách nào để làm điều này không.

+0

Xem thêm http://stackoverflow.com/questions/24827929/get-frame-numbers-in-html5-video – rogerdpack

+0

Tất nhiên nó sẽ hoạt động. Chỉ cần cập nhật trình kiểm tra của bạn tại vị trí đó. –

Trả lời

27

Tôi xin lỗi, nhưng đó là cách hoạt động của nó. Từ html5 specs:

Mỗi 15 đến 250ms, hoặc bất cứ khi nào điều khiển phương tiện truyền thông thay đổi vị trí của MediaController, nào xảy ra ít nhất là thường xuyên, tác nhân người dùng phải xếp hàng một nhiệm vụ để bắn một sự kiện đơn giản đặt tên timeupdate tại MediaController.

Ngoài ra,

Sự kiện này do đó không phải là để bị sa thải nhanh hơn khoảng 66Hz hoặc chậm hơn so với 4Hz (giả định các xử lý sự kiện không mất nhiều thời gian hơn 250ms để chạy). Tác nhân người dùng được khuyến khích thay đổi tần suất của sự kiện dựa trên tải hệ thống và chi phí trung bình của việc xử lý sự kiện mỗi lần, để cập nhật giao diện người dùng không thường xuyên hơn so với người dùng có thể xử lý thoải mái khi giải mã video.

Nếu bạn đọc kỹ thông số, bạn có thể có ý tưởng rằng sự kiện timeupdate là một loại sự kiện "nỗ lực tốt nhất". Nó sẽ cháy khi nó có thể và luôn luôn miễn là nó không ảnh hưởng đến hiệu suất quá nhiều.

Bạn có thể lọc các sự kiện loại bỏ một số theo thời gian để làm mịn thời gian đến, nhưng tôi e rằng không thể làm điều ngược lại.

+1

Tôi đã đăng nhập thời gian hiện tại và khoảng thời gian hơn 500 ms đôi khi. IS này khoảng thời gian nhiều hơn cho các thiết bị có hiệu suất thấp? – Foreever

+0

Nhiều người có vẻ thích 250ms vì bất kỳ lý do gì – rogerdpack

33

Cần lưu ý rằng bạn có thể đọc thuộc tính currentTime của video thường xuyên hơn. Nếu thời gian thực sự quan trọng và bạn có thể sống với một chút không chắc chắn, bạn có thể thử điều này thay thế.

Tuy nhiên, nó ít thanh lịch hơn nhiều so với sự kiện timeupdate của riêng thẻ.

setInterval(function() { 
    console.log(audio.currentTime); // will get you a lot more updates. 
}, 30); 

Trong trường hợp này, bạn sẽ phải quản lý khoảng cho mình, hãy chắc chắn rằng bạn rõ ràng nó trước null ing yếu tố âm thanh. Nhưng nó một khả năng.

Tôi đang sử dụng phương pháp này trên phần tử video nhưng cũng nên áp dụng ở đây.

+0

Tôi tự hỏi liệu điều này có ảnh hưởng đến hiệu suất không. – Foreever

+5

chúng tôi sử dụng điều này bên trong một dự án cordova phát/tạm dừng video song song với lớp nội dung mà người dùng sẽ kiểm soát. Trong trường hợp đó, chúng tôi không có vấn đề về hiệu suất với nó. Nhưng nó là sự thật, bây giờ bạn có _one more_ điều để làm mỗi vài phần nghìn giây. Thay vì setInterval, bạn cũng có thể đọc '.currentTime' bất cứ khi nào một sự kiện khác xảy ra (như tương tác người dùng). Hoặc bạn có thể tính toán "lề an toàn" nếu bạn quan tâm đến vị trí video, nhưng chỉ "xung quanh" mốc 1 phút - đặt thời gian chờ trong 59 giây và bắt đầu một khoảng thời gian ngắn hơn sau 59 giây đó. – amenthes

+0

Đối với các clip âm thanh ngắn hơn, phương pháp này gần như vô hình – August

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