首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HTML5视频,MediaSource,appendBuffer,如何跳过一些块

HTML5视频,MediaSource,appendBuffer,如何跳过一些块
EN

Stack Overflow用户
提问于 2018-01-16 10:19:27
回答 1查看 949关注 0票数 0

如果跳过一些块,则视频元素将无法播放。

HTML:

代码语言:javascript
复制
<div>
    <video id="vdo0" autoplay muted width="300"></video>
    <video id="vdo1" autoplay width="300"></video>
</div>
<div>
    <button id="btnStart">Start</button>
</div>

Javascript:

代码语言:javascript
复制
var vdo0 = document.getElementById('vdo0');
var vdo1 = document.getElementById('vdo1');
var ms = new MediaSource();
var sourceBuffer = null;
var chunks = [];

vdo1.src = URL.createObjectURL(ms);
var i = 0;
var recv = function(){
    var chunk = chunks.shift();
    if(chunk){
        i++;
        if(i < 5 || i > 10){ // HERE, skipped some chunks, vdo1 will cannot play
            sourceBuffer.appendBuffer(chunk);
        }
        recv();
    }else{
        setTimeout(recv, 20);
    }
};

ms.addEventListener('sourceopen', function () {
    sourceBuffer = ms.addSourceBuffer('video/webm;codecs=vp8');
    recv();
}, false);

document.getElementById('btnStart').addEventListener('click', function(){
    navigator.mediaDevices.getUserMedia({
        video: true,
        audio: true
    }).then(function (s) {
        vdo0.srcObject = s;
        vdo0.oncanplay = function(){
            var mediaRecorder = new MediaRecorder(s, 'video/webm;codecs=vp8');
            mediaRecorder.ondataavailable = function (e) {
                if (e.data && e.data.size > 0) {
                    var reader = new FileReader();
                    reader.addEventListener("loadend", function () {
                        var arr = new Uint8Array(reader.result);
                        chunks.push(arr);
                    });
                    reader.readAsArrayBuffer(e.data);
                }
            };
            mediaRecorder.start(20);
        };
    }).catch(function (err) {
        A.log('ERROR: ', err);
    });
}, false);

我想做的是,当跳过一些块时,vdo1仍然可以播放。MediaSource怎样才能恢复任何一个小块?

如果不将第一个记录器-blob推到块中,vdo1也不能播放。为什么?

怎么做?

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2018-01-17 05:54:55

你不能随意跳过块。演示程序将无法在随机点重新同步。

由于您使用的是WebM,所以可以跳到另一个集群。簇以0x1F43B675开始。https://matroska.org/technical/specs/index.html#Cluster

请注意,要使其工作,您的视频大部分是以这样一种方式编码的,即每个集群都以一个关键帧开始。否则,你的视频将不会继续播放,因为编解码器将不会满意它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48278938

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档