2016-09-23 25 views
1

我正在尝试使用javascript mediasource播放视频以隐藏用户的视频网址。但我得到一个错误,因为Javascript mediaSource元素

未捕获InvalidStateError:未能在'MediaSource'上执行'endOfStream':MediaSource的readyState不是'open'。如果要动态传递视频类型和代码,这也会很有帮助。

下面是我的代码,

<!DOCTYPE html> 
<html> 
    <head> 
    <meta charset="utf-8"/> 
    </head> 
    <body> 
    <video controls></video> 
<script> 
    var video = document.querySelector('video'); 

    var assetURL = 'adsss.mp4'; 
    // Need to be specific for Blink regarding codecs 
    // ./mp4info frag_bunny.mp4 | grep Codec 
    var mimeCodec = 'video/mp4; codecs="avc1.42E01E, mp4a.40.2"'; 

    if ('MediaSource' in window && MediaSource.isTypeSupported(mimeCodec)) { 
    var mediaSource = new MediaSource; 
    //console.log(mediaSource.readyState); // closed 
    video.src = URL.createObjectURL(mediaSource); 
    mediaSource.addEventListener('sourceopen', sourceOpen); 
    } else { 
    console.error('Unsupported MIME type or codec: ', mimeCodec); 
    } 

    function sourceOpen (_) { 
    console.log(this.readyState); // open 
    var mediaSource = this; 
    console.log(mediaSource); 
    var sourceBuffer = mediaSource.addSourceBuffer(mimeCodec); 
    console.log(sourceBuffer); 
    fetchAB(assetURL, function (buf) { 
     sourceBuffer.addEventListener('updateend', function (_) { 
     mediaSource.endOfStream(); 
     video.play(); 
     console.log(mediaSource.readyState); // ended 
     }); 
     sourceBuffer.appendBuffer(buf); 
    }); 
    }; 

    function fetchAB (url, cb) { 
    console.log(url); 
    var xhr = new XMLHttpRequest; 
    xhr.open('get', url); 
    console.log(xhr); 
    xhr.responseType = 'arraybuffer'; 
    xhr.onload = function() { 
     cb(xhr.response); 
     console.log(xhr.response); 
    }; 
    xhr.send(); 
    }; 
</script> 

回答