2016-05-24 3 views
1

Ich verwende mongoose mit gridfs-stream zum Speichern von Dateien, Bildern, Audios und Videos.Wie lese ich ein Video mit gridfs-stream?

Das Problem ist, wenn ich eine andere Position/Zeit im Video auswählen, wird gestoppt, das gleiche passiert, wenn ich irgendein Lied spiele.

Jemand kann mir helfen?

Dies ist mein Code:

exports.readById = function(req, res) { 
    var id = req.modelName._id; 

    gfs.findOne({ 
     _id: id 
    }, function(err, file) { 
     if (err) { 
      return res.status(400).send({ 
       err: errorHandler.getErrorMessage(err) 
      }); 
     } 
     if (!file) { 
      return res.status(404).send({ 
       err: 'No se encontró el registro especificado.' 
      }); 
     } 

     res.writeHead(200, { 
      'Accept-Ranges': 'bytes', 
      'Content-Length': file.length, 
      'Content-Type': file.contentType 
     }); 

     var readStream = gfs.createReadStream({ 
      _id: file._id 
     }); 

     readStream.on('error', function(err) { 
      if (err) { 
       return res.status(400).send({ 
        err: errorHandler.getErrorMessage(err) 
       }); 
      } 
     }); 

     readStream.pipe(res); 
    }); 
}; 
+0

Sie müssen wahrscheinlich Bereichsanforderungen verarbeiten (vielleicht mit [ 'Express-range'] (https://www.npmjs.com/package/express-range)) in Kombination mit Teildaten aus GridFS Lesen (mit [die 'range' Option] (https://github.com/aheckmann/gridfs-stream#createtreadstream)). – robertklep

+0

Ich habe eine Lösung gefunden, ohne das 'express-range' Modul zu verwenden, aber Sie haben recht, ich musste die' range' Option verwenden, danke. –

Antwort

3

ist notwendig, die range Option zu verwenden, ermöglicht es uns, eine andere Position im Video auswählen und abspielen. Mit anderen Worten, Sie stellen eine Anfrage an den Server, damit der Server mit den von uns benötigten Daten antwortet.

Hier ist der vollständige Code, ich hoffe, sie dienen jemandem.

Ich fand das Beispiel here.

exports.readById = function(req, res) { 
    var id = req.modelName._id; 

    gfs.findOne({ 
     _id: id 
    }, function(err, file) { 
     if (err) { 
      return res.status(400).send({ 
       err: errorHandler.getErrorMessage(err) 
      }); 
     } 
     if (!file) { 
      return res.status(404).send({ 
       err: 'No se encontró el registro especificado.' 
      }); 
     } 

     if (req.headers['range']) { 
      var parts = req.headers['range'].replace(/bytes=/, "").split("-"); 
      var partialstart = parts[0]; 
      var partialend = parts[1]; 

      var start = parseInt(partialstart, 10); 
      var end = partialend ? parseInt(partialend, 10) : file.length - 1; 
      var chunksize = (end - start) + 1; 

      res.writeHead(206, { 
       'Accept-Ranges': 'bytes', 
       'Content-Length': chunksize, 
       'Content-Range': 'bytes ' + start + '-' + end + '/' + file.length, 
       'Content-Type': file.contentType 
      }); 

      gfs.createReadStream({ 
       _id: file._id, 
       range: { 
        startPos: start, 
        endPos: end 
       } 
      }).pipe(res); 
     } else { 
      res.header('Content-Length', file.length); 
      res.header('Content-Type', file.contentType); 

      gfs.createReadStream({ 
       _id: file._id 
      }).pipe(res); 
     } 
    }); 
}; 
+0

Unter welchen Umständen ist 'req.headers [' range ']' wahr? Benötige ich dafür eine wirklich große Datei? – user3072843