Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Video streaming with HTML 5 via node.js

I'm trying to set up a web server that will support streaming video to an HTML5 video tag using node.js. Here's my code so far:

var range = request.headers.range; var total = file.length;  var parts = range.replace(/bytes=/, "").split("-"); var partialstart = parts[0]; var partialend = parts[1];  var start = parseInt(partialstart, 10); var end = partialend ? parseInt(partialend, 10) : total-1;  var chunksize = (end-start)+1;  response.writeHead(206, { "Content-Range": "bytes " + start + "-" + end + "/" + total, "Accept-Ranges": "bytes", "Content-Length": chunksize, "Content-Type": type }); response.end(file); 

Where "request" represents the http request, type is either "application/ogg" or "video/ogg" (I've tried both) and "file" is the .ogv file that's been read from the file system. Here are the response headers:

Content-Range   bytes 0-14270463/14270464 Accept-Ranges   bytes Content-Length   14270464 Connection     keep-alive Content-Type     video/ogg 

I've examined the response headers and this code appears to be working fine, but there are a couple of problems:

  1. The video appears to load very slowly for being on a local network. From what I can tell examining the response using firebug, the file appears to be streamed in at about 150 kb/sec.
  2. The video doesn't play at all. Even if I wait for the whole thing to load, the HTML 5 video tag just shows a big "x" instead of a movie in firefox.

Does anyone have any ideas as to what I can do to get video streaming working via node.js?

Thanks!
Chris

like image 335
Chris Harrington Avatar asked Dec 05 '10 17:12

Chris Harrington


People also ask

Is nodejs suitable for video streaming?

Nodejs is very good to streaming audio and video, but nodejs is a new technology, so it's don't have a lot of softwares yet.

How does video streaming work HTML5?

Using HTML5 Video Streaming It is the most innovative approach to streaming video. Content tags (e.g., <video> tag) are part of the HTML code. Thus, using the <video> tag creates a native HTML5 video player within your browser. These tags provide direction to the HTTP protocol as to what to do with this content.

Can we connect HTML with node js?

Conclusion: With simple File IO operations we can read HTML file in Node. js and by using simple modules, we can send a HTML response back to client.


2 Answers

I know this is a really old question, but as Google seems to like it I thought it would be worth pointing out that I wrote a Node.js video streaming module (Github, or via NPM) that's hopefully worth a look too.

like image 135
meloncholy Avatar answered Sep 20 '22 16:09

meloncholy


I was able to get this to work with some help from the nodejs forums:

http://groups.google.com/group/nodejs/browse_thread/thread/8339e0dc825c057f/822b2dd48f36e890

Highlights from the Google Groups thread:

Google chrome is known to first make a request with the range 0-1024 and then request the range "1024-".

response.end(file.slice(start, chunksize), "binary");

Then:

I was able to get the video to play no problems in firefox by setting the "connection" header to "close"

Then:

Seems that you are incorrectly computing the content-length:

var chunksize = (end-start)+1;

If start is 0 and end is 1, in your case chunksize is 2, and it should be 1.

like image 33
Chris Harrington Avatar answered Sep 19 '22 16:09

Chris Harrington