Показать сообщение отдельно
  #1 (permalink)  
Старый 20.03.2015, 02:20
Аватар для cyber
I am Student
Отправить личное сообщение для cyber Посмотреть профиль Найти все сообщения от cyber
 
Регистрация: 17.12.2011
Сообщений: 4,415

Размер пакета
И так у есть 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 );
__________________
Цитата:
Если ограничения и условия описываются как "коробка", то хитрость в том что бы найти именно коробку... Не думайте о чем то глобальном - найдите коробку.
Ответить с цитированием