Правильная функция start()
будет выглядеть так:
function start() {
// create an object, an instance of the MediaSource
var mediaSource = new MediaSource;
// to this `mediaSource` object add an event listener for the `sourceopen` event
// and run the code inside the function when `sourceopen` happens
mediaSource.addEventListener('sourceopen', function () {
console.log('1');
var sourceBuffer = mediaSource.addSourceBuffer(mimeCodec);
fetchAB(assetURL, function (buf) {
sourceBuffer.appendBuffer(buf);
});
});
// hey, `video` element, here is the source of the media I'd like you to play
// it's not a simple url, is something more complex
// , a `MediaSource` kind of thing
// and it might take you some time to be ready
video.src = URL.createObjectURL(mediaSource);
}
Теперь вернемся ко всему коду ..., если вы скажете браузеру выполнить следующую строку:
console.log('2');
, браузер не имеет проблем, чтобы сделать это немедленно, вы увидите 2
в консоли в кратчайшие сроки.
Но эта вещь:
video.src = URL.createObjectURL(mediaSource);
не так просто для браузера.
Когда вы просите браузер выполнить это, браузер как бы говорит: «Хорошо, вы просите меня выполнить, я сейчас начну, и вы можете продолжить с остальным кодом, но этот это не так легко для меня ..., мне нужно начать крутить некоторые колеса ..., это займет у меня некоторое время ... также, я не хочу выходить и брать видео, прежде чем я готов к этому. Я дам вам знать, когда я буду готов.
На самом деле не я, браузер, а объект mediaSource
, который является экземпляром MediaSource
, который является одним из моих ( браузеров ) API, сообщит вам повышение события sourceopen
.
Итак ..., когда вы помещаете этот код на страницу:
mediaSource.addEventListener('sourceopen', function () {
// do things
});
вы говорите браузеру, что делать, когда он готов и sourceopen
сработал.
Подведем итоги:
12| start();
// start() is called and starts to execute but it has something inside that
// will take some time before ready
// as consequence `console.log('1')` does not happen yet
13| console.log('2');
// runs imediatelly
// you see "2" in the console
... проходит некоторое время, код внутри start()
готовит вещи
// the `sourceopen` event fires and a `function ()`
// the callback of `mediaSource.addEventListener('sourceopen'`
// starts to execute
21| console.log('1');
// gets executed
// you see "1" in the console