gpt4 book ai didi

node.js - 使用 Node JS 的 HLS 流

转载 作者:搜寻专家 更新时间:2023-10-31 22:20:09 24 4
gpt4 key购买 nike

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

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

文件夹结构

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

我的 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

就是这样。瞧!!!

关于node.js - 使用 Node JS 的 HLS 流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21878178/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com