2016-09-23 13 views
1

javascript mediasourceを使用して動画を再生しようとしています。動画URLをユーザーから隠すようにしています。しかし、私は次のようなエラーを受け取ります:Javascript mediaSource element

Uncaught InvalidStateError: 'MediaSource'で 'endOfStream'を実行できませんでした:MediaSourceのreadyStateは 'open'ではありません。また、ビデオの種類とコードを動的に渡すと便利です。以下は

上記のコードは働いていなかった理由は、MOOV(映画ヘッダーボックス)で動画を先頭に移動するだけで断片化されたMP4が可能になる、ということです

<!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> 

答えて