Видеопоток через Websocket в тег <video>

Я использую Node.js для потоковой передачи через Websocket веб-видео в реальном времени на веб-страницу, которая будет воспроизводить его в теге. Ниже приведен код как от сервера, так и от клиента:

SERVER:

var io = require('./libs/socket.io').listen(8080, {log:false});
var fs = require('fs');
io.sockets.on('connection', function (socket) 
{
console.log('sono entrato in connection');
var readStream = fs.createReadStream("video.webm");

socket.on('VIDEO_STREAM_REQ', function (req) 
{
    console.log(req);

    readStream.addListener('data', function(data)
    {
        socket.emit('VS',data);
    });

});
});

КЛИЕНТ:

<html>
<body>

<video id="v" autoplay> </video>

<script src='https://localhost/socket.io/socket.io.js'></script>
<script>
window.URL = window.URL || window.webkitURL;
window.MediaSource = window.MediaSource || window.WebKitMediaSource;

if(!!! window.MediaSource)
{
    alert('MediaSource API is not available!');
    return;
}

var mediaSource = new MediaSource();    
var video = document.getElementById('v');

video.src = window.URL.createObjectURL(mediaSource);

mediaSource.addEventListener('webkitsourceopen', function(e)
{
    var sourceBuffer = mediaSource.addSourceBuffer('video/webm; codecs="vorbis,vp8"');
    var socket = io.connect('http://localhost:8080');

    if(socket)
        console.log('Library retrieved!');

    socket.emit('VIDEO_STREAM_REQ','REQUEST');

    socket.on('VS', function (data) 
    {
        console.log(data);
        sourceBuffer.append(data);
    });
});

</script>


</body>
</html>

Я использую Chrome 26, и я получаю эту ошибку: "Uncaught Error: InvalidAccessError: DOM Exception 15". Кажется, что тип буфера, поданного на метод append, неверен. Я уже пробовал преобразовать его в Blob, Array и Uint8Array, но не повезло.

Ответ 1

В вашем примере содержится только код, показанный на представленной странице: http://html5-demos.appspot.com/static/media-source.html

Проверьте исходный код, строка 155 - это то, что вам не хватает:

var file = new Blob([uInt8Array], {type: 'video/webm'});

Итак, вам нужно указать Blob тип контента, а затем передать буфер с помощью Uint8Array (см. строку 171):

sourceBuffer.append(new Uint8Array(e.target.result));