• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

[node.js] ogv zu html5 video tag streamen

Junkee[]

Lounge-Member
Hey, ich weiß nicht ob sich hier jemand mit node.js auskennt oder nicht aber ich frag jetzt einfach mal ;)
ich versuche gerade ein ogv Video zu einem html5 Video Tag zu streamen. Funktioniert im FF, nicht aber in Chrome und Opera. Der Opera sendet im range header von x bis x bytes an, wodurch Content-Length Null ist. Der Chrome will anscheinend kein ogv entgegen nehmen. Er sendet gar kein range Header.
Code:
var http = require("http"),
    sys = require("sys"),
    util = require("util"),
    fs = require("fs");


// doing realy ugly things but just want to get it work first...
var mp4Video = fs.readFileSync("./src/video.mp4", "binary");
var ogvVideo = fs.readFileSync("./src/video.ogv", "binary");

http.createServer(function(req, res) {
    if(/\.(mp4|ogv)$/.test(req.url)) {
        sys.puts("video request");
        if(!req.headers.range) {
            var start = 0;
            var end = false;
        }
        else {
            var match = /^bytes=([0-9]+)\-([0-9]+)?$/.exec(req.headers.range);
            var start = parseInt(match[1]);
            var end = parseInt(match[2]);
            if(isNaN(end)) end = false;
        }
        
        if(/mp4$/.test(req.url)) {
            if(!end) end = mp4Video.length;
            res.writeHead(206, {
                "Content-Range": "bytes " + start + "-" + end + "/" + mp4Video.length,
                "Content-Length": end-start,
                "Content-Type": "video/mp4",
                "Accept-Ranges": "bytes"
            });
            res.end(mp4Video.slice(start, end), "binary"); 
        }
        else {
            if(!end) end = ogvVideo.length;
            res.writeHead(206, {
                "Content-Range": "bytes " + start + "-" + end + "/" + ogvVideo.length,
                "Content-Length": end-start,
                "Content-Type": "video/ogg",
                "Accept-Ranges": "bytes"
            });
            res.end(ogvVideo.slice(start, end), "binary"); 
        }
    }
    else {
        if(/\/$/.test(req.url))
            req.url += "index.html";
        fs.stat("./src" + req.url, function(er, stat) {
            if(er) {
                req.url = "/notfound.html";
            }
            var file = fs.createReadStream("./src" + req.url);
            util.pump(file, res);
        });
    }
}).listen(8080);
Im Verzeichnis gibt es das verzeichnis src, in dem sich die Videos, die Datei mit der 404-Meldung und eine index.html, die das Video einbindet, befinden.
Code:
<!DOCTYPE html>
<html>
  <head>
    <title>HTML5 Video with node.js</title>
  </head>
  <body>
    <h1>HTML5 Video with node.js</h1>
    <video  width="640" height="480" controls="controls">
        <!--source src="video.mp4" type="video/mp4" /-->
        <source src="video.ogv" type="video/ogg" /> 
        This browser is not compatible with HTML 5
    </video>
  </body>
</html>
 
Schau' dir doch einfach mal an, was der Apache da macht... denn mit dem bekomme ich in allen dreien die ogg-Datei zum laufen.
 
Zurück
Oben