Как исправить ошибку CHUNK_DEMUXER_ERROR_APPEND_FAILED при добавлении чанка? - PullRequest
0 голосов
/ 18 февраля 2019

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

Я попытался добавить порцию того же кодека, и это работает.Поэтому я попытался использовать changeType (), но когда я добавил новый блок кодека в элемент видео, я обнаружил эту ошибку «CHUNK_DEMUXER_ERROR_APPEND_FAILED: Append: не удалось выполнить анализ потока.».

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) {
        try {
            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) {
                    videoSourceBuffer = myMediaSource.sourceBuffers[0];
                    if (quality == 1080) {
                        type = 'video/mp4; codecs="avc1.640028,mp4a.40.2"';
                    }
                    else if (quality == 720) {
                        type = 'video/mp4; codecs="avc1.64001F,mp4a.40.2"';
                    }
                    else if (quality == 480) {
                        type = 'video/mp4; codecs="avc1.64001E,mp4a.40.2"';
                    }
                    else if (quality == 360) {
                        type = 'video/mp4; codecs="avc1.64001E,mp4a.40.2"';
                    }
                    videoSourceBuffer.changeType(type);
                    videoSourceBuffer.mode = "segments";
                    qlast = quality;
                }
            }
            if (!first) {
                appendSegment("c" + currentSegment + ".m4s", currentSegment);
            }
            else {
                first = false;
            }
        } catch (error) {
            console.log('Error! ' + error);
        }
    }
}

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

Как это исправить?

1 Ответ

0 голосов
/ 18 февраля 2019

Вам почти наверняка не нужно использовать changeType здесь, поскольку это обычно используется для смены кодека (например, avc -> hevc) или контейнера (например, mp4 -> webm), тогда как вы просто переключаетесь в одном и том жекодек и контейнер.

Проблема почти наверняка в том, что вы не добавляете сегмент инициализации при изменении качества - вы делаете это только для первого уровня качества.

Исправление: вставьте соответствующийсегмент инициализации перед первым медиа сегментом каждого нового качества.

...