私は現在トレントをダウンロードし、ダウンロードしている間にそれをhtml5ビデオプレーヤーにストリームするプロジェクトに取り組んでいます。私のプロジェクトの制約によって、私はpeerflixやwebtorrentを使用できません。私は現在、トレントストリームモジュールを使用しています。私のコードはnode.jsとpugにあります。以下のようになります:node.jsを使用して現在html5プレーヤーにビデオをダウンロードする方法はありますか?
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)
これが動作を開始します現時点では。ページをロードすると、約束が実行され、トレントのダウンロードが開始されます。トレントからの最初のビットのデータが.on( 'open')ストリームに送られると、ビデオが再生を開始します。プレーヤーは、より多くの情報がダウンロードされるにつれて、より多くの情報がビデオに追加されていることを示していますが、送信された最初のデータを超えて再生することはありません。プレーヤーに、より多くのデータが来ていることを伝え、送信された最初のチャンクを読み終えたら2番目を切り捨てないようにする方法がありますか?アドバイスは有益であり、事前に感謝します!
@Aks - torrent-stream –
@Aksこれは私がtorrent-streamを使用している理由です。それはダウンロードとして順番にトレントを入れます – pbie42
ええ、私の悪い!これを知らなかった。ここで役に立たないので私の前のコメントを削除した。私は今までにあなたを助けることができないことを申し訳なく思っています。あなたの質問をアップして、それは面白いと私はいくつかの時間で試してみます – Aks