追加块时如何修复 CHUNK_DEMUXER_ERROR_APPEND_FAILED 错误?

Posted

技术标签:

【中文标题】追加块时如何修复 CHUNK_DEMUXER_ERROR_APPEND_FAILED 错误?【英文标题】:How to fix CHUNK_DEMUXER_ERROR_APPEND_FAILED error when append chunk? 【发布时间】:2019-02-18 14:37:30 【问题描述】:

我想创建一个可以播放多种分辨率的视频播放器,所以我必须加载不同编解码器的块。

我尝试附加相同编解码器的块并且它可以工作。所以我尝试使用 changeType() 但是当我在视频元素中附加新的编解码器块时,我发现了这个错误“CHUNK_DEMUXER_ERROR_APPEND_FAILED: Append: stream parsing failed.”。

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】:

您几乎可以肯定不需要在这里使用changeType,因为它通常用于更改编解码器(例如 avc -> hevc)或容器(例如 mp4 -> webm),而您只是在同一编解码器和容器。

问题几乎可以肯定是您没有在质量更改上附加初始化段 - 您只为第一个质量级别执行此操作。

修复:在每个新质量的第一个媒体段之前插入适当的初始化段。

【讨论】:

以上是关于追加块时如何修复 CHUNK_DEMUXER_ERROR_APPEND_FAILED 错误?的主要内容,如果未能解决你的问题,请参考以下文章

如何修复 BigQuery 表中意外重复的数据?

滚动条自动上下滚,如何解决?

更改滑块时如何更新子类 UIView 以进行绘图?

Bookdown:修复R代码块中的中文字符串之前的额外空间

如何在使用 SQL 数据块时基于现有的增量表将 NULL 列添加到新表?

运行时导入 Vue 组件的 webpack 块时如何添加授权标头