使用 Node JS 进行 HLS 流式传输

2023-11-22

我正在尝试使用 node.js 流式传输 HLS 内容。但不知怎的,它不起作用。如果有人帮助我,那将会有很大的帮助。

问题:-尝试从 node.js 提供 HLS 内容(不是直播,而是一组 .ts 文件和 .m3u8 播放列表, 或者换句话说 VOD 内容)

文件夹结构

stream_test
|--- app.js
|--- node_modules
|--- streamcontent
        |--- test.m3u8
        |--- segment0.ts
        |--- segment1.ts
        .
        .
        .
        |--- segment127.ts

My app.js看起来像这样

var http = require('http'),
    url = require('url'),
    path = require('path'),
    fs = require('fs');
var mimeTypes = {
    "html": "text/html",
    "jpeg": "image/jpeg",
    "jpg": "image/jpeg",
    "png": "image/png",
    "js": "text/javascript",
    "css": "text/css",
    "ts": "video/MP2T",
    "m3u8": "application/vnd.apple.mpegurl"};

http.createServer(function(req, res) {
    var uri = url.parse(req.url).pathname;
    var filename = path.join(process.cwd(), unescape(uri));
    var stats;

    console.log('filename '+filename);

    try {
        stats = fs.lstatSync(filename); // throws if path doesn't exist
    } catch (e) {
        res.writeHead(404, {'Content-Type': 'text/plain'});
        res.write('404 Not Found\n');
        res.end();
        return;
    }


    if (stats.isFile()) {
        // path exists, is a file
        var mimeType = mimeTypes[path.extname(filename).split(".")[1]];
        res.writeHead(200, {'Content-Type': mimeType} );

        var fileStream = fs.createReadStream(filename);
        fileStream.pipe(res);
    } else if (stats.isDirectory()) {
        // path exists, is a directory
        res.writeHead(200, {'Content-Type': 'text/plain'});
        res.write('Index of '+uri+'\n');
        res.write('TODO, show index?\n');
        res.end();
    } else {
        // Symbolic link, other?
        // TODO: follow symlinks?  security?
        res.writeHead(500, {'Content-Type': 'text/plain'});
        res.write('500 Internal server error\n');
        res.end();
    }

}).listen(8000);

test.m3u8 看起来像这样

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-ALLOW-CACHE:YES
#EXT-X-TARGETDURATION:19
#EXT-X-PLAYLIST-TYPE:VOD
#EXTINF:12.595922,
segment0.ts
.
.
.

我使用 ffmpeg 创建片段和播放列表

ffmpeg -i video-a.mp4  -c:a libmp3lame -ar 48000 -ab 64k  -c:v libx264   -b:v 128k -flags -global_header -map 0 -f segment  -segment_list test.m3u8 -segment_time 30 -segment_format mpegts segment_%05d.ts

测试场景:-如果从 Apache 提供服务,则可以正常工作;如果从 Node 提供服务,则不行。

测试工具:-VNC播放器


根据 Brad 的想法,我能够使用express.static 来做到这一点。解决方案如下。

app.js 改成这样

var express = require('express');
var app = express();
var path = require('path');

app.use(express.static(path.join(__dirname,'streamcontent')));

app.listen(8000);
console.log('Listening on Port 8000');

并且 .m3u8 播放列表更改为这样

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-ALLOW-CACHE:YES
#EXT-X-TARGETDURATION:19
#EXT-X-PLAYLIST-TYPE:VOD
#EXTINF:12.595922,
http://localhost:8000/segment0.ts
#EXTINF:10.135133,
http://localhost:8000/segment1.ts
#EXTINF:11.511511,
http://localhost:8000/segment2.ts

就是这样。瞧!

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

使用 Node JS 进行 HLS 流式传输 的相关文章

随机推荐

  • 如何使用 Kubernetes Go 库创建一个简单的客户端应用程序?

    我正在努力使用 Kubernetes Go 库 文档 至少我找到的那些 与库本身相比似乎已经过时了 由于导入问题 所提供的示例无法构建 我只是想做一些简单的事情 按名称获取服务对象并打印一些属性 如nodePort 我只需要一个简单的库使用
  • 更新数据库源后,如何让 Visual Studio 2010 刷新我的数据集?

    我已将新列添加到现有列MS Access 2010我已连接的数据库Visual Studio 2010 更新数据库后 数据源窗口和DataSet没有新列 我查看了诸如此类的答案 Visual Studio 数据集设计器刷新表 但是使用 SE
  • 如何构建发布的 vscode 版本

    这个问题是针对开源 vscode 符合 MIT 许可证 而不是 VS Code 我昨天花了很多时间试图找出如何构建某种发行版本 我的意思是 就像在 Visual Studio 中一样 我们有 调试 和 发布 构建 我是C 开发人员 vsco
  • 我想在android的日历中选择多个日期

    我想在日历中选择多个日期 多个选择工作正常 但在 toast 中仅显示单个日期 第一个日期 如果我选 择 4 天 1 8 14 到 4 8 14 所有日期都应显示在 toast 中 这是我的代码 public class SampleTim
  • 使用 UIWebview 的 IP 摄像机流适用于 IOS 5,但不适用于 IOS 6

    您好 我在我的网站上流式传输 ip 摄像机 并将我的网站嵌入到 UIWebview 上 在 IOS 5 上工作正常 但当我在 IOS 6 上打开我的应用程序时 仅显示图像而不是视频 在我的网站上我使用请有人帮助我 还有其他方法吗 如果你想在
  • 如何从 iOS 应用程序打开 VPN? (私有 API 可以)

    不幸的是 当 iOS 设备进入 睡眠模式 时 即使已配置的 VPN 也会被关闭 一位客户想要为他的 iPad 安装应用程序has使用VPN是为了安全 所以任何事情都必须通过VPN来完成 该应用程序必须进行大量同步 但 iOS 设备可能会自行
  • 为静态方法设置 AspectJ 建议

    我用原始的切入点和建议方法编写了简单的方面 Aspect public class MyAspect Pointcut execution static com mtag util SomeUtil someMethod public vo
  • 如何在 Perl、DBI 中显示查询时间?

    我使用 Perl 和 DBI 来管理我的 MySQL 表 查询等 如何显示查询的运行时间 如果我在控制台中执行 SELECT 操作 结果将如下所示 id name 1 Jack 2 Joe 3 Mary 3 rows in set 0 17
  • 设置依赖注入的过滤器属性以接受构造函数中的参数

    我正在遵循 ninject 过滤器属性设置page 对于他们来说 他们有 WithConstructorArgumentFromControllerAttribute
  • Sails.js + socket.io:从服务器向客户端发送消息

    我正在尝试使用 sails js 设置一个系统 让服务器向一组客户端广播消息 基本上 A 组中的客户端向服务器发送 AJAX 请求 服务器处理请求并通过套接字向 B 组的所有客户端发送消息 B组的客户端通过套接字接收消息并显示一些内容 根据
  • 在vbscript中调用C# dll

    我正在尝试从 QTP 调用 C dll 使用 vbscript 我尝试了很多事情但没有成功 视觉工作室2010 创建C 类库 st dll code using System using System Collections Generic
  • Maven Antrun 和依赖项

    请参阅下面的编辑 我不能只使用类路径的原因是因为我需要管理一些非java库 并且我正在编译一个非java项目 我正在尝试在 antrun 调用中使用 Maven 依赖项 遵循 Maven 站点上的文档 http maven apache o
  • 更改html中悬停时的选择列表选项背景颜色[重复]

    这个问题在这里已经有答案了 是否可以更改悬停时选择列表选项的默认背景颜色 HTML
  • SSIS 包中的“每批行”和“最大插入提交大小”是否有任何相关性?

    我有一个 SSIS 包 它将包含 1000 万条记录的 2 5 GB 数据导出到 Sql Server 数据库 该数据库有 10 个分区 包括主文件组 更改默认值之前最大插入提交大小即 2147483647 和每批次行数 使用快速加载选项完
  • C# Linq 列名称作为变量

    我有一个表 我想在其中对变量列进行查询 喜欢 private void query string column string value using var db new myDB var s1 from c in db Component
  • 在 Hive 中连接日期范围内的表

    我需要在employee id上 将tableA连接到tableB 并且表A中的cal date需要在表B的开始日期和结束日期之间 我运行了下面的查询并收到了下面的错误消息 请您帮我纠正和查询 谢谢你的帮助 JOIN date start
  • HTML/CSS 中的进度条

    dd position relative IE is dumb display block float left width 500px height 16px margin 0 0 2px background url white3 gi
  • 使用 Scrapy 使用“加载更多”按钮抓取无限滚动页面

    如何废弃一个无限滚动的网页 其中响应是 html text 而不是 json 我的第一次尝试是使用 Rule 和 LinkExtractor 它为我提供了大约 80 的职位 url class JobsetSpider CrawlSpide
  • 角度路径参数中的正斜杠

    如何设置我的路线 以便我的参数可以采用正斜杠 例如 myapp com file rootfolder subfolder myfile 这不起作用 const SECTION ROUTES Routes path file path co
  • 使用 Node JS 进行 HLS 流式传输

    我正在尝试使用 node js 流式传输 HLS 内容 但不知怎的 它不起作用 如果有人帮助我 那将会有很大的帮助 问题 尝试从 node js 提供 HLS 内容 不是直播 而是一组 ts 文件和 m3u8 播放列表 或者换句话说 VOD