Я хочу создать видеоплеер, который может воспроизводить несколько разрешений, поэтому мне нужно загружать порции разных кодеков.
Я помещаю сегмент инициализации перед первым медиа сегментом каждого нового качества, но это создает дыру в видео. В этой лунке видео не воспроизводится, но после лунки оно воспроизводится.
const myMediaSource = new MediaSource();
var videoSourceBuffer;
var quality=480,qlast=480;
var currentSegment = 0;
var loading = false;
function videos() {
myMediaSource.addEventListener('sourceopen', sourceOpen, { once: true});
}
function sourceOpen() {
setInterval(feedVideo, 500);
}
function feedVideo() {
if (!loading) {
if (myMediaSource.sourceBuffers.length == 0) {
videoSourceBuffer = myMediaSource.addSourceBuffer('video/mp4; codecs="avc1.64001E,mp4a.40.2"');
appendSegment("cinit.mp4", 0);
first = true;
} else {
if (qlast != quality) {
appendSegment("cinit.mp4", 0);
first=true;
qlast = quality;
}
}
if (!first) {
appendSegment("c" + currentSegment + ".m4s", currentSegment);
}
else {
first = false;
}
}
}
function appendSegment(file, resourcesIndex) {
loading = true;
fetch("http://mysite/video/" + quality + "p/" + file).then(function (response) {
return response.arrayBuffer();
}).then(function (videoData) {
videoSourceBuffer.appendBuffer(videoData);
videoSourceBuffer.addEventListener('updateend', function () {
loading = false;
}, { once: true });
});
}
Есть ли способ не создавать эти дыры?