HLS使用节点JS进行stream式传输

我正在尝试使用node.jsstream式传输HLS内容。 不知何故,它不工作。 如果有人帮助我,这将会非常有帮助。

问题:试图从node.js服务HLS内容(不是直播stream,而是一组.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来创build段和palylist

 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 

testingScenraio: –如果从Apache服务,则工作正常,如果从节点服务则工作不正常。

testing工具: – VNC播放器

从布拉德的想法,我能用express.static做到这一点。 这里解决scheme。

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 

这就是它。 瞧!