我有一個服務工作者,它捕獲我的頁面的請求(fetch
事件),並且當URL匹配某個模式時,它將獲取另一個URL並用該新內容替換該響應。 它適用於文本數據(JS,XML ...)或二進制數據(例如圖像),但是當涉及到視頻時,會出現一個小故障。如何從ServiceWorker流式傳輸視頻?
我在OSX上使用Chrome 41。
這是我的工作人員的簡化代碼:
self.addEventListener('fetch', function(event) {
var url = event.request.url;
console.log('SW: fetch', url);
if (/\.mp4$/.test(url)) {
url = 'https://vjs.zencdn.net/v/oceans.mp4';
var options = {
credentials: 'include',
mode: 'no-cors'
};
event.respondWith(fetch(url, options));
}
});
這是在我的HTML頁面簡化代碼:
navigator.serviceWorker.register('sw.js').then(function(reg) {
console.info('ServiceWorker registration successful for', reg.scope);
var video = document.createElement('video');
video.src = '/video.mp4';
video.controls = true;
video.autoplay = true;
video.onerror = function(err) {
console.error('Video load fail', err);
}
video.onload = function(data) {
console.info('Video load success');
}
document.body.appendChild(video);
}).catch(function(err) {
console.error('ServiceWorker registration failed:', err);
});
第一次加載頁面,工人安裝,所以視頻請求沒有被捕獲,因此失敗。但是,當您重新加載頁面(不清除緩存)時,它被成功捕獲,並且工作人員成功加載視頻(HTTP 200在其檢查器中),但由於某種原因,主頁面會拋出一個net::ERR_FAILED
。
我不能手動讀/流,因爲它來自不同的來源,從而「不透明」響應類型:http://www.w3.org/TR/service-workers/#cross-origin-resources
更新:更新到鉻42,誤差現在是HTTP 400 Service Worker Fallback Required (from ServiceWorker)
。奇怪的是,the source code(第510行)表示只有在CORS標頭丟失時纔會引發它,但這裏的模式是no-cors
。
非常感謝傑夫,CORS標題確實是問題! – antoine129
我在Chromium跟蹤器上打開了一個問題以改善調試:https://code.google.com/p/chromium/issues/detail?id=477685 – antoine129