javascript - 'appendBuffer'上执行 'SourceBuffer'失败 : The HTMLMediaElement. 错误属性不为空

标签 javascript android html android-webview media-source

我正在尝试通过 socket.io 将视频文件流式传输到我的客户端(当前使用 Chrome 作为客户端)。
我只得到视频的第一帧,然后出现 Failed to appendBuffer:

Failed to execute 'appendBuffer' on 'SourceBuffer': The HTMLMediaElement.error attribute is not null



部分JS代码:
   if (buffer.updating || queue.length > 0) {
        console.log("buffer.updating = " + buffer.updating  + " queue.length  = "  + (queue.length));
            queue.push(videoData);
        } else {
        console.log("else buffer.updating = " + buffer.updating  + " queue.length = "  + (queue.length));
            buffer.appendBuffer(videoData);
        }

    }
};

var play = function() {

    //var mimeType = `video/mp4;codecs="${$scope.codec}"`;
    var mimeType = 'video/mp4;codecs="' + codec +'"';

    console.log("mimetype = " + mimeType + " is supported = " + MediaSource.isTypeSupported(mimeType));

    buffer = mediaSource.addSourceBuffer(mimeType);

    buffer.addEventListener('update', function () {
        if (queue.length > 0 && !buffer.updating) {
            console.log("buffer.appendBuffer");
            buffer.appendBuffer(queue.shift());
        }
    });



    video.play();
};

请帮我!

最佳答案

当源缓冲区仍在更新并且您调用 appendBuffer 将另一个缓冲区附加到它时,可能会发生这种情况。您应该等待调用的 updateend 事件,然后您可以附加另一个缓冲区。您可以使用 Promise 让 await 函数等待它解决,然后附加另一个缓冲区,如下所示:

const sourceBuffer = mediaSource.addSourceBuffer(mimeType);

const loadBuffer = (buffer) => {
  return new Promise((resolve)=>{
    sourceBuffer.addEvenListener('updateend',() resolve);
    sourceBuffer.append(buffer);
  });
};

await loadBuffer(buffer1);
await loadBuffer(buffer2);

关于javascript - 'appendBuffer'上执行 'SourceBuffer'失败 : The HTMLMediaElement. 错误属性不为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44882485/

相关文章:

javascript - 未捕获的语法错误 : Unexpected identifier Underscore _. 模板

javascript - 我如何打印用户在javascript中点击的字母?

java - 如何将两个 char[] 添加到 List<Object>?

android - 以编程方式创建水平 ScrollView 不起作用

javascript - 如何有选择地删除一些表单查询参数?

javascript/typescript - 强制通过 eslint 规则将对象作为函数参数传递

javascript - 什么 Javascript 事件会导致具有列表属性的输入呈现其列表?

java - Java 中的等效数据类型

javascript - 使用 CSS 缩放时,jquery-ui slider 行为错误

javascript - 无法使用 DOM 获取子元素