mirror of
https://github.com/servo/servo.git
synced 2025-06-25 01:24:37 +01:00
49 lines
2 KiB
JavaScript
49 lines
2 KiB
JavaScript
function testmediasource(config) {
|
|
|
|
return new Promise(function(resolve, reject) {
|
|
// Fetch the media resources
|
|
var fetches = [config.audioPath, config.videoPath].map(function(path) {
|
|
return fetch(path).then(function(response) {
|
|
if (!response.ok) throw new Error('Resource fetch failed');
|
|
return response.arrayBuffer();
|
|
});
|
|
});
|
|
|
|
Promise.all(fetches).then(function(resources) {
|
|
config.audioMedia = resources[0];
|
|
config.videoMedia = resources[1];
|
|
|
|
// Create media source
|
|
var source = new MediaSource();
|
|
source.done = new Promise(function(resolvesource,rejectsource){
|
|
|
|
// Create and fill source buffers when the media source is opened
|
|
source.addEventListener('sourceopen', onSourceOpen);
|
|
resolve(source);
|
|
|
|
function onSourceOpen(event) {
|
|
var audioSourceBuffer = source.addSourceBuffer(config.audioType),
|
|
videoSourceBuffer = source.addSourceBuffer(config.videoType);
|
|
|
|
audioSourceBuffer.addEventListener('updateend',onUpdateEnd);
|
|
videoSourceBuffer.addEventListener('updateend',onUpdateEnd);
|
|
|
|
audioSourceBuffer.appendBuffer(config.audioMedia);
|
|
videoSourceBuffer.appendBuffer(config.videoMedia);
|
|
|
|
function onUpdateEnd(event){
|
|
event.target.removeEventListener('updateend', onUpdateEnd);
|
|
if (!audioSourceBuffer.updating && !videoSourceBuffer.updating) {
|
|
if (source.readyState !== 'open') {
|
|
rejectsource(new Error("Media source error"));
|
|
} else {
|
|
source.endOfStream();
|
|
resolvesource();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
});
|
|
});
|
|
});
|
|
}
|