【问题标题】:Using Nodejs to Serve an MP4 Video File使用 Nodejs 提供 MP4 视频文件
【发布时间】:2016-06-16 18:33:58
【问题描述】:

我正在尝试从 nodejs 服务器提供约 52MB 的 mp4 视频文件。下面附上用于提供文件的代码截图。 我有一个用于静态文件调用的 mime 类型对象,其中包含 mp4 的 mime 类型。

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' };

但是,当我尝试导航到 chrome 中的页面时,我收到错误:

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

现在,同样的逻辑(如上图所示)用于提供图像和 css 就好了,但是在尝试提供 mp4 时它失败了。查看 Chrome 中的网络请求面板,我可以看到服务器以 200 OK 状态响应,并提供了一个零字节文件作为视频。网络请求中的字节范围看起来也很可疑,但我对 HTTP 请求的了解还不够,无法确定。

查看 stats 对象(如下所示,从 fs.lstat 获取),似乎该文件“知道”如何拆分为 4096 字节的块,但是我不断收到不完整的分块编码错误。我没有防病毒软件,并尝试关闭 Chrome 中的各种设置/使用其他浏览器,但我看不到视频。

{"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"}

我缺少一个标题吗?我是否以某种方式过早地结束了响应?我现在一头雾水。

【问题讨论】:

标签: node.js video chunked-encoding


【解决方案1】:

这是我在项目中使用的。

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

第

【讨论】:

    【解决方案2】:

    使用this solution 修复。

    ```

      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;
      }
    

    ```

    【讨论】:

    • 不确定是不是你写的,但blog 解释了细节
    【解决方案3】:

    这对我来说已经足够了。 MP4 具有对修剪(伪流)的本机支持。它非常适合通过流媒体在浏览器中观看视频。

    res.setHeader('Content-Type', 'video/mp4');
    
    res.status(200).sendFile(full_path, function (err) {
        if (err) { ... } else { ... }
    });
    

    【讨论】:

    • 谢谢,它对我有用。我只需要一个简单的本地开发测试,所以我用了这个简单易行的方法。
    猜你喜欢
    • 1970-01-01
    • 2016-10-30
    • 2020-07-15
    • 1970-01-01
    • 1970-01-01
    • 2020-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多