使用Nodejs来服务一个MP4video文件

我正在尝试从nodejs服务器提供〜52MB的mp4video文件。 以下附件是用于提供文件的代码的屏幕截图。 用于服务mp4的代码 我有一个MIMEtypes的静态文件调用的对象,其中包含mp4的MIMEtypes。

var mimeTypes = { html: 'text/html; charset=utf-8', jpeg: 'image/jpeg', jpg: 'image/jpeg', png: 'image/png', js: 'text/javascript', css: 'text/css', mp4: 'video/mp4' };

但是,当我尝试导航到铬页面,我得到的错误:

GET http://localhost:8888/videos/movie.mp4 net::ERR_INCOMPLETE_CHUNKED_ENCODING

现在这个相同的逻辑(上面截图)用于服务图像和CSS就好了,但尝试服务mp4时失败了。 查看Chrome中的networking请求面板,我可以看到服务器响应200 OK状态,并提供零字节文件作为video。 networking请求中的字节范围也看起来很可疑,但我对HTTP请求知之甚less。 请求 Request_Abridged

查看stats对象(如下所示,从fs.lstat得到),看起来文件'知道'如何被分割成4096字节的块,但是我不断得到不完整的分块编码错误。 我没有杀毒软件,并试图closuresChrome /使用其他浏览器的各种设置,但我看不到video。

{"dev":16777220,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":1070608,"size":51246445,"blocks":100096,"atime":"2016-06-15T23:06:27.000Z","mtime":"2016-06-15T21:41:00.000Z","ctime":"2016-06-15T21:45:56.000Z"}

有没有我失踪的标题? 我不知何故过早地结束了回应? 我现在无能为力

这是我用于我的项目。

https://gist.github.com/paolorossi/1993068

心连心

使用这个解决scheme修复

“`

  if (stats.isFile()) { var extension = path.extname(file).split('.').reverse()[0]; if (extension === 'mp4') { // gotta chunk the response if serving an mp4 var range = req.headers.range; var parts = range.replace(/bytes=/, "").split("-"); var partialstart = parts[0]; var partialend = parts[1]; var total = stats.size; var start = parseInt(partialstart, 10); var end = partialend ? parseInt(partialend, 10) : total - 1; var chunksize = (end - start) + 1; var mimeType = mimeTypes[extension] || 'text/plain; charset=utf-8'; res.writeHead(206, { 'Content-Range': 'bytes ' + start + '-' + end + '/' + total, 'Accept-Ranges': 'bytes', 'Content-Length': chunksize, 'Content-Type': mimeType }); var fileStream = fs.createReadStream(file, { start: start, end: end }); fileStream.pipe(res); res.on('close', function() { console.log('response closed'); if (res.fileStream) { res.fileStream.unpipe(this); if (this.fileStream.fd) { fs.close(this.fileStream.fd); } } }); } else { var mimeType = mimeTypes[extension] || 'text/plain; charset=utf-8'; res.writeHead(200, {'Content-Type': mimeType}); var fileStream = fs.createReadStream(file); fileStream.pipe(res); } return; } 

“`