2012-11-06 12 views
13

Tôi hiện đang làm việc trong việc sử dụng trình phát âm thanh HTML5 để cung cấp luồng âm thanh (luồng radio 24/7) qua trình duyệt (di động). Tải trong luồng và chơi nó hoạt động tốt.Dừng đệm âm thanh trong thẻ <audio>

Vấn đề chính là thẻ HTML5 <audio> sẽ tiếp tục tải xuống (đệm) nội dung ngay cả khi nội dung không hoạt động. Đây có thể là một vấn đề lớn đối với người dùng di động vì hầu hết họ trả tiền cho việc sử dụng dữ liệu. Cho đến nay tôi đã không thể tìm thấy một giải pháp tốt mà làm việc qua trình duyệt để ngăn chặn điều này.

tôi đã cố gắng cho đến nay:

  1. Unload nguồn khi tạm dừng được nhấn. < Thao tác này không hoạt động trên trình duyệt chéo
  2. Xóa phần tử trình phát âm thanh và tải phần tử mới. Điều này làm việc nhưng cho phép trung thực, đây là một cách rất hacky thực hiện một nhiệm vụ đơn giản cực kỳ .

Tôi chỉ đơn giản là tự hỏi liệu có điều gì tôi đang xem trong toàn bộ vấn đề này vì tôi tin rằng tôi không phải là người duy nhất có vấn đề này.

+1

Tôi đã chỉnh sửa tiêu đề của bạn. Vui lòng xem, "[Câu hỏi có nên bao gồm" thẻ "trong tiêu đề của họ không?] (Http://meta.stackexchange.com/questions/19190/)", trong đó sự đồng thuận là "không, họ không nên". –

+2

Tôi vừa nhận thấy rằng việc xóa phần tử khỏi DOM không phải lúc nào cũng tách tài nguyên. Có nghĩa là luồng vẫn đang được tải xuống. – Ruben

+0

@Ruben hoàn toàn có, ngay cả khi DOM hiện tại chỉ hiển thị 1 trình phát, trình duyệt vẫn là tài nguyên lưu trong bộ nhớ cache. Tôi đã thử nghiệm mà chỉ cần bây giờ, thực hiện một máy nghe nhạc shoutcast Ajax mà đã tải dòng của tôi hơn 10 lần vì preload & ajax. Nếu bạn không sử dụng tính năng "tải trước". tốt hơn nếu bạn không bao gồm thẻ âm thanh trừ khi bạn nhấp vào một cái gì đó, ví dụ: một nút trình phát nhỏ;) – erm3nda

Trả lời

3

Tôi đã tìm được giải pháp khả thi cho sự cố được mô tả ở trên. Mô tả chi tiết có thể được tìm thấy ở đây: https://stackoverflow.com/a/13302599/1580615

+1

Đây không phải là giải pháp tốt và sẽ ném lỗi trên webkit (chrome, ios, v.v.) –

2

Bạn có thể làm như sau để dừng tải đệm không có lỗi:

var blob = new Blob([], {type: "audio/mp3"}); 
var url = URL.createObjectURL(blob); 
audio.src = _url; 

hay, rút ​​ngắn lên:

audio.src = URL.createObjectURL(new Blob([], {type:"audio/mp3"}); 

Bây giờ bạn không tải "" là một url xấu cho thẻ âm thanh để thử và tải. Thay vào đó, bạn đang tải một url thực được tạo từ Blob không chứa dữ liệu để phát lại âm thanh.

+1

err trong firefox: "Không thể giải mã" blob tài nguyên phương tiện: http: // localhost: 4200/c68c796c-5af0-5343-a68d-9043c4c9b9a2. " err chrome: "TẢI blob: http: // localhost: 4200/fec774b7-7680-48a9-927e-1926685da447 416 (Phạm vi yêu cầu không hài lòng)" khi sử dụng loại: "video/mp4" –

8

Phần tử <audio> bao gồm thuộc tính preload. Điều này có thể được đặt thành "không" hoặc "siêu dữ liệu" nên ngăn tải trước âm thanh.

Nguồn: https://developer.mozilla.org/en/docs/Web/HTML/Element/audio

+1

Đây là giải pháp thanh lịch nhất. Đặt thành "none" không tải xuống dữ liệu và cài đặt thành "siêu dữ liệu" đã tải xuống 517kb dữ liệu. Thử nghiệm của tôi là cho một luồng voscast. – Rohmer

+0

Nó không chỉ thanh lịch, đó là cách để làm điều đó. Tôi đã triying để đặt nó thành "false" như một noob :), thiết lập nó thành "none" đã làm việc. U có thể thiết lập nó để "tự động" quá. Bạn sẽ gặp phải vấn đề nếu bạn có nguồn luồng và trang ajax. Các đối tượng âm thanh đang được trình duyệt lưu vào bộ nhớ cache và bạn sẽ tăng mức sử dụng băng thông của mình với mọi tải. – erm3nda