2016-09-23 52 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> 

回答