使用 Nodejs 和 Express 进行视频流传输

2024-03-28

我正在尝试使用nodejs 和express 将视频流式传输到html5 视频播放器。据我所知,很多人以前都这样做过,但是很少有人使用过express(在我发现的情况下)。

大多数人说这样做:

var express = require('express');
var request = require('request');
var stylus  = require('stylus');
var fs      = require('fs');
var path    = require('path');
var url     = require('url');
var http    = require('http');

var app = express();

app.use(stylus.middleware({
 // Source directory
     src: __dirname + '/assets/stylesheets',
     // Destination directory
     dest: __dirname + '/public',
     // Compile function
     compile: function(str, path) {
       return stylus(str)
         .set('filename', path)
         .set('compress', true);
         }
     }));

app.enable('trust proxy');
// Routing to the user
app.use(express.static(__dirname + "/public"));

var server = require('http').createServer(app);
// var io = require('socket.io')(server);
var port = process.env.PORT || 3000;

server.listen(port, function() {
    console.log("Server is listening on port " + port.toString());
});


app.post('/playVideo', function(req, res) {

    var video = req.query.video;

    var file = path.resolve(__dirname,video);
    var range = req.headers.range;


    var positions = range.replace(/bytes=/, "").split("-");
    var start = parseInt(positions[0], 10);

    fs.stat(file, function(err, stats) {
      var total = stats.size;
      var end = positions[1] ? parseInt(positions[1], 10) : total - 1;
      var chunksize = (end - start) + 1;

      res.writeHead(206, {
        "Content-Range": "bytes " + start + "-" + end + "/" + total,
        "Accept-Ranges": "bytes",
        "Content-Length": chunksize,
        "Content-Type": "video/avi"
      });

      var stream = fs.createReadStream(file, { start: start, end: end })
        .on("open", function() {
          stream.pipe(res);
        }).on("error", function(err) {
          res.end(err);
        });
    });
});

不幸的是,当我尝试这样做时,我无法获得req.headers目的。这是未定义的。我认为这是因为我正在使用 Express,尽管我必须假设使用 Express 仍然可以实现这一点。

如何使用 Express 获取标头?

Thanks!


我认为你应该使用中间件正文解析器 https://github.com/expressjs/body-parser

这是示例:

var express = require('express')
var bodyParser = require('body-parser')

var app = express()

// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: false }))

// parse application/json
app.use(bodyParser.json())
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Nodejs 和 Express 进行视频流传输 的相关文章

随机推荐

  • 如何使用 Grunt 为 LESS 配置 sourceMap?

    我正在使用 grunt 0 4 2 和 grunt contrib less 0 9 0 我希望将我的 LESS 编译成 CSS 并支持源映射 我的 LESS 文件位于public less 主要的称为main less 的编译public
  • 无论如何,Bootstrap 导航栏都不会居中

    我一直在尝试使用 Bootstrap 将我的导航栏集中在导航栏的中心 这非常糟糕 我尝试过使用类似问题中的信息 例如this one https stackoverflow com questions 7165423 twitter boo
  • JS hasAttribute 带有数据属性值

    有没有一种原生方法 没有 jQuery 来检查 dom 元素是否具有具有所选值的属性 例如 assume doc has data mod do defined 这将是真的 document hasAttribute data mod 但这
  • Xamarin 表单 - 以流形式打开文件

    这可能是一个非常简单的问题 但当我们谈论流时我总是感到困惑 我正在尝试在 Xamarin Forms 项目的 Android 部分中打开一个文件 我有一个 Java IO File 我想将其转换为流 以便能够使用这个简单的函数将其发送到 A
  • 当一个值的所有者可以读取它而另一个线程更改它时,Rust 如何防止数据竞争?

    Rust 书中指出了以下内容参考文献和借用 https doc rust lang org book ch04 02 references and borrowing html mutable references 当我们有一个不可变的引用
  • 可观察,出错时重试并仅在完成时缓存

    我们可以使用cache 运算符来避免多次执行长任务 http请求 并重用其结果 Observable apiCall createApiCallObservable cache notice the cache the first time
  • JQuery 检测程序更改事件

    如果我执行 jQuery expr change function 那么当用户更改值时 我可以触发一个事件函数 如果以编程方式更改它 即如果我调用 jQuery expr val moo 是否可以触发它 或者如果一些普通的旧 JavaScr
  • Laravel 5:未找到 DB Seed 类

    我有这个 DatabaseSeeder php
  • Python正则表达式捕获各种url模式组

    我有包含这样的字符串的数据集 我想从中删除所有网址 http google com having trouble finding regex https google com for this case http google com te
  • 选择列表中最早的条目

    如果我有一个包含人员姓名和日期的列表 并且我只想保留每个人最早日期的条目 我该怎么做 我希望最终列表按姓氏字母顺序排列 然后是名字 并且仅包含末尾日期最早的条目 这是列表和我尝试过的示例 但它只是再次给了我相同的列表 L1 Smith Jo
  • Mongoose:Coffeescript 中的递归嵌入文档

    基于这个例子 https github com LearnBoost mongoose blob master examples schema js 有效 var Comment new Schema Comment add title t
  • 禁用 JFrame 中的背景绘制以正确显示 Aero (DWM) 效果

    我在 Java Windows 上使用 Windows Vista 7 的 DWM 功能时遇到问题 我想让我的框架背景使用 Aero 风格 执行此操作的 Windows API 由函数提供DwmExtendFrameIntoClientAr
  • 播放音频 iOS Objective-C

    我正在尝试在我的 iOS 应用程序中播放音频文件 这是我当前的代码 NSString soundFilePath NSString stringWithFormat test m4a NSBundle mainBundle resource
  • 如何在 iOS 7 中让 NSTimer 在后台运行超过 180 秒?

    我已经尝试过 但在 iOS 7 和 Xcode 4 6 2 中工作时间不超过 180 秒 请帮我 UIBackgroundTaskIdentifier bgTask UIBackgroundTaskInvalid UIApplication
  • 存储对相机胶卷图像的引用 - Swift 4

    我有一个非常简单的要求 但显然超出了我的能力范围 我想做的就是允许用户从相机胶卷中选择图像 然后在我的应用程序中存储对该图像的 引用 然后 我可以在需要时从相机胶卷中加载图像 我不想复制图像并将其保存在其他地方 因为我觉得这会浪费手机上的空
  • 如何为 Go 服务器应用程序设置 Let's Encrypt

    我有自己的域 其中包含用 Go 编写的 Web 服务 我使用内置的 Go Web 服务器 前面没有 Nginx 或 Apache 我想开始通过 HTTPS 提供服务 并且我意识到 Let s Encrypt 即将成为实现这一目标的方法 谁能
  • 为什么 C++17 中的全局内联变量和静态内联成员需要防护?

    从 C 17 开始 可以使用以下命令初始化标头中的全局变量和静态成员inline关键词 虽然我理解为什么函数中的静态变量需要受到保护 因为即使在多线程上下文中初始化也应该只发生一次 但我不明白为什么这些新的内联变量也受到保护 您可以在这里看
  • 使用实体框架数据模型添加验证属性

    前言 2015 年 2 月如果您仍在使用实体框架 EDMX 请帮自己一个忙 并使用实体框架代码优先进行结账 不同之处在于 您的表是从模型类创建的 而不是在 EDMX 中 模型类是使用表创建的 这是一个更简单的解决方案 而且这个问题中的问题甚
  • 如何从exe中找出目标框架名称和版本?

    我有一些使用 net Framework 4 5 或 net core 2 1 或 net core 3 1 创建的 exe 文件 我想仅使用 C 应用程序从此 DLL 获取框架名称和版本信息 我在下面编写了一段代码 该代码非常有用 并且适
  • 使用 Nodejs 和 Express 进行视频流传输

    我正在尝试使用nodejs 和express 将视频流式传输到html5 视频播放器 据我所知 很多人以前都这样做过 但是很少有人使用过express 在我发现的情况下 大多数人说这样做 var express require expres