2016-05-24 4 views
1

私はmongoosegridfs-streamを使ってファイル、画像、オーディオ、ビデオを保存しています。gridfs-streamでビデオを読むには?

私が別の位置/時間を選択すると、ビデオ内のが停止し、同じ曲が再生されたときに同じことが起こります。

誰かが私を助けることができますか?

これは私のコードです:

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

['range'オプション](https://github.com/aheckmann/gridfs-stream#createreadstream))。 – robertklep

+0

私は 'express-range'モジュールを使わないで解決策を見つけましたが、そうです、' range'オプションを使う必要がありました。 –

答えて

3

rangeオプションを使用する必要があり、それは、私たちは、ビデオ内の別の位置を選択し、それを再生することができます。言い換えれば、サーバーが必要なデータで応答するようにサーバーに要求する。

ここでは完全なコードですが、私は彼らが誰かに奉仕することを願っています。

この例は、hereです。おそらく使用(GridFSから部分データの読み出しと組み合わせた(おそらく[ `発現-range`を(https://www.npmjs.com/package/express-range)を使用して)の範囲の要求を処理する必要が

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

「req.headers ['range'] 'は本当ですか?本当に大きなファイルが必要ですか? – user3072843

関連する問題