Tôi vừa tạo ứng dụng thời gian thực bằng socket.io nơi người dùng "chính" có thể kích hoạt âm thanh khi nhận thiết bị (trình duyệt trên máy tính, trình duyệt trên thiết bị di động). Người dùng chính đó thấy danh sách tệp âm thanh và có thể nhấp vào "Phát" trên tệp âm thanh.Độ trễ HTML 5 âm thanh .play() trên thiết bị di động
Phát lại âm thanh ngay lập tức trên trình duyệt. Tuy nhiên, trên điện thoại di động, có sự chậm trễ 0,5-2 giây (Nexus 4 và iPhone 5 của tôi khoảng 1 giây và iPhone 3GS 1-2 giây).
Tôi đã thử một số cách để tối ưu hóa phát lại âm thanh để làm cho nó nhanh hơn trên điện thoại di động. Ngay bây giờ (ở "giai đoạn" tốt nhất của tối ưu hóa của nó tôi muốn nói), tôi kết hợp tất cả các mp3 với nhau trong một tập tin âm thanh (nó tạo ra các tập tin .mp3, .ogg, và .mp4). Tôi cần ý tưởng về cách tôi có thể khắc phục/cải thiện vấn đề này nữa. Các nút cổ chai thực sự có vẻ là trong các phương pháp âm thanh hmtl 5 như .play()
.
Trên thu tôi sử dụng như vậy:
<audio id="audioFile" preload="auto">
<source src="/output.m4a" type="audio/mp4"/>
<source src="/output.mp3" type="audio/mpeg"/>
<source src="/output.ogg" type="audio/ogg"/>
<p>Your browser does not support HTML5 audio.</p>
</audio>
Trong JS của tôi:
var audioFile = document.getElementById('audioFile');
// Little hack for mobile, as only a user generated click will enable us to play the sounds
$('#prepareAudioBtn').on('click', function() {
$(this).hide();
audioFile.play();
audioFile.pause();
audioFile.currentTime = 0;
});
// Master user triggered a sound sprite to play
socket.on('playAudio', function (audioClip) {
if (audioFile.paused)
audioFile.play();
audioFile.currentTime = audioClip.startTime;
// checks every 750ms to pause the clip if the endTime has been reached.
// There is a second of "silence" between each sound sprite so the pause is sure to happen at a correct time.
timeListener(audioClip.endTime);
});
function timeListener(clipEndTime) {
this.clear = function() {
clearInterval(interval);
interval = null;
};
if (interval !== null) {
this.clear();
}
interval = setInterval(function() {
if (audioFile.currentTime >= clipEndTime) {
audioFile.pause();
this.clear();
}
}, 750);
}
Cũng coi blob cho mỗi âm thanh nhưng một số âm thanh có thể đi cho phút vì vậy đó là lý do tại sao tôi phải viện đến cách kết hợp tất cả âm thanh cùng nhau cho 1 tệp âm thanh lớn (tốt hơn một số thẻ audio
trên trang cho mỗi clip)
Ngay cả sau khi phát tệp lần đầu tiên, sự chậm trễ vẫn còn. Có thể tải của tập tin có được trở lại trạng thái ban đầu của nó một khi tạm dừng? Tại sao độ trễ sẽ vẫn tồn tại mặc dù tệp đã được phát một lần hoặc đã nhiều lần? –
Đối với một âm thanh kết hợp duy nhất, bạn không nên phát sinh tải ban đầu cho mỗi lần tìm kiếm ... Có đặt 'currentTime' trước khi bạn' play() 'âm thanh trong sự kiện' playAudio' của bạn tạo ra bất kỳ sự khác biệt nào không? Sự chậm trễ có xảy ra bất kể clip bạn đang nhảy tới trước hay sau vị trí hiện tại của bạn trong tệp? –
Sẽ thử điều đó. Tôi cũng sẽ kiểm tra đưa âm lượng đến 0 sau đó quay lại 100 thay vì tạm dừng/phát lại. –