Отверстия в видео при изменении качества - PullRequest
0 голосов
/ 23 апреля 2019

Я хочу создать видеоплеер, который может воспроизводить несколько разрешений, поэтому мне нужно загружать порции разных кодеков. Я помещаю сегмент инициализации перед первым медиа сегментом каждого нового качества, но это создает дыру в видео. В этой лунке видео не воспроизводится, но после лунки оно воспроизводится.

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 });
    });
}

Есть ли способ не создавать эти дыры?

...