Ich arbeite gerade an einem Projekt, das einen Torrent herunterlädt und während des Downloads in einen html5-Videoplayer streamt. Die Einschränkungen meines Projekts lassen mich nicht Peerflix oder WebTorrent verwenden. Ich verwende derzeit das Torrent-Stream-Modul. Mein Code ist in node.js und mug. Es ist wie folgt:Wie streame ich das aktuelle Video auf html5 player mit node.js?
server.js
var uri = 'magnet:?xt=urn:btih:11a2ac68a11634e980f265cb1433c599d017a759';
var engine = torrentStream(uri);
let engineGo = function() {
return new Promise(function (resolve, reject) {
var engine = torrentStream(uri);
engine.on('ready', function() {
engine.files.forEach(function(file) {
if (file.name.substr(file.name.length - 3) == 'mkv' || file.name.substr(file.name.length - 3) == 'mp4') {
console.log('filename:', file.name);
var stream = file.createReadStream();
var writable = fs.createWriteStream(file.name);
stream.pipe(writable);
engine.on('download', function() {
console.log(file.name);
console.log(engine.swarm.downloaded/file.length * 100 + "%");
resolve(file);
});
}
});
});
});
}
app.get('*', function (req, res) {
if (req.url != "/Guardians.of.the.Galaxy.2014.1080p.BluRay.x264.YIFY.mp4") {
var rpath = __dirname + '/views/index.pug';
fs.readFile(rpath, 'utf8', function (err, str) {
var fn = pug.compile(str, { filename: rpath, pretty: true});
res.writeHead(200, { "Content-Type": "text/html" });
res.write(fn());
res.end();
});
} else {
engineGo().then(function (result) {
var filer = path.resolve(__dirname,result.name);
fs.stat(filer, function(err, stats) {
if (err) {
if (err.code === 'ENOENT') {
// 404 Error if file not found
return res.sendStatus(404);
}
res.end(err);
}
var range = req.headers.range;
if (!range) {
// 416 Wrong range
return res.sendStatus(416);
}
var positions = range.replace(/bytes=/, "").split("-");
var start = parseInt(positions[0], 10);
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",
'Connection': 'keep-alive',
"Content-Length": chunksize,
"Content-Type": "video/mp4"
});
var stream = fs.createReadStream(filer, { start: start, end: end })
.on("open", function() {
stream.pipe(res);
}).on("data", function (data) {
console.log(data);
}).on("error", function(err) {
res.end(err);
});
});
});
}
});
index.pug
doctype
html
title
|Welcome
body
video(id='video' src="http://localhost:8888/Guardians.of.the.Galaxy.2014.1080p.BluRay.x264.YIFY.mp4" type="video/mp4" controls)
Im Moment diese Arbeit beginnt. Sobald ich die Seite geladen habe, wird das Versprechen ausgeführt und der Torrent wird heruntergeladen. Sobald das erste Bit der Daten vom Torrent durch den Stream auf dem .on ('open') gesendet wird, beginnt das Video zu spielen. Der Player zeigt an, dass dem Video mehr Informationen hinzugefügt werden, wenn mehr heruntergeladen wird. Es wird jedoch nie über die ursprünglichen Daten hinaus gespielt, die gesendet wurden. Gibt es eine Möglichkeit, dem Spieler zu sagen, dass mehr Daten kommen und nicht, dass die Sekunde abgeschnitten wird, wenn der erste Teil, der gesendet wurde, gelesen wird? Jeder Rat ist hilfreich und danke im Voraus!
@Aks - torrent-stream –
@Aks deshalb verwende ich torrent-stream. Es ist der Torrent in Ordnung, wie es – pbie42
Download Yeah, mein Schlechter! Habe ich nicht gewusst. Ich habe meinen vorherigen Kommentar gelöscht, weil er hier nicht gebraucht wird. Es tut mir leid, dass ich dir jetzt nicht helfen kann. Upvoting Ihre Frage, es ist interessant, und ich werde versuchen, in einigen Stunden – Aks