И так у есть nodejs сервер, стримит видео и мобильное устройство. У меня долго бомбило и я не мог понять почему не работает ( если я правильно понял Content-Length задает размер пакета который будет отослан киленту в байтах ?), после чего я уменьшил размер пакета на 1000 и о чудо все заработало (сделал это криво, но не суть ).
Что это за черная магия, причем проблема воспроизводится не на всех устройствах. Точнее она воспроизводится почти на всех телефонах кроме nexus 5? WTF?
var express = require('express');
var path = require( "path" );
var app = express();
var mime = require ( "mime" );
var fs = require( "fs-extra" );
var videoFolder = "video/";
var port = process.env.PORT || 5000;
app.use(express.static( __dirname + '/public') );
app.get( "/", function ( req, res ) {
res.sendFile ( path.join ( __dirname , "index.html" ) );
} );
app.get ( "/video/:vname", returnVideo );
app.post ( "/video/:vname", returnVideo );
function returnVideo ( req, res ) {
if ( !req.params.vname ) {
return res.status( 404 ).end( "Not found" );
}
var videoPath = path.join ( __dirname, videoFolder, req.params.vname );
if ( !fs.existsSync ( videoPath ) ) {
return res.status( 404 ).end( "Not found" );
}
var stat = fs.statSync( videoPath );
var total = stat.size;
if (req.headers.range) {
var range = req.headers.range;
var parts = range.replace(/bytes=/, "").split("-");
var partialstart = parts[0];
var partialend = parts[1];
var start = parseInt(partialstart, 10);
var end = partialend ? parseInt(partialend, 10) : total-1;
//var chunksize = (end-start)+1;
var chunksize = Math.round( ((end-start)+1 ) / 1000 ) ;// уменьшил пакет в 1000 раз
console.log('RANGE: ' + start + ' - ' + end + ' = ' + chunksize);
var file = fs.createReadStream( videoPath , {start: start, end: end});
res.writeHead(206, { 'Content-Range': 'bytes ' + start + '-' + end + '/' + total, 'Accept-Ranges': 'bytes', 'Content-Length': chunksize, 'Content-Type': mime.lookup( videoPath ) });
file.pipe(res);
} else {
console.log('ALL: ' + total);
res.writeHead(200, { 'Content-Length': total, 'Content-Type': 'video/mp4' });
fs.createReadStream( videoPath ).pipe(res);
}
}
app.listen ( port );