2017-07-14 175 views
0

我在嘗試在nodejs中流式傳輸視頻時遇到了一些問題。當我嘗試將視頻路徑傳遞給源/視頻html標記時,它可以奏效。然後,我意識到,我很可能不得不傳播視頻。Nodejs - 視頻流問題

問題是:當我流式傳輸視頻時,我只是在瀏覽器中播放視頻,直接鏈接到一些下載的視頻,而不是帶有一些數據(視頻標題和路徑)的渲染頁面。

我想渲染頁面,然後運行視頻。 當我渲染時,我收到錯誤:「發送後無法設置標題」。

我的代碼:

const express = require('express') 
const multer = require('multer') 
const moment = require('moment') 
const uuidv4 = require('uuid/v4'); 
const bodyParser = require('body-parser') 
const fs = require('fs') 
const videoLib = require('node-video-lib') 
const app = express() 
const db = require('./db') 
let Video = require('./models/videoModel') 

//***** STAND LIBRARIES CONFIGURATION **********// 
app.use(bodyParser.urlencoded({extended:true})) 
app.use(bodyParser.json()) 
app.set('views', 'views') 
app.set('view engine', 'ejs') 
app.set(db) 
//***** MULTER CONFIGURATION ***************// 
let storage = multer.diskStorage({ 

    destination: function(req, file, cb){ 
    cb(null, './uploads') 
    }, 
    filename: function(req, file, cb){ 
    let mime = file.mimetype.split('/')[1] 
    let uuid = uuidv4() 
    cb(null, uuid + "." + mime) 
    } 

}) 

function fileFilter(req, file, cb){ 
    const extension = file.mimetype.split('/')[0]; 
    if(extension !== 'video'){ 
     return cb(new Error('Something went wrong. Wrong file format'), false); 
    } 
    cb(null, true); 
}; 
var upload = multer({storage:storage, fileFilter: fileFilter}) 

const uploadHandler = upload.single('video') 

function uploadVideo(req, res, next){ 
    uploadHandler(req, res, next, function(err){ 
    if(req.fileValidationError){ 
     res.send('Error when upload') 
    } 
    console.log(req.file.filename) 
    next() 
    }) 
} 
//******************************************// 
function newVideo(req, res){ 
    let videoParams = {title: req.body.title, path: req.file.filename} 
    Video.create(videoParams, function(err, result){ 
    if(err){ 
     console.log(err) 
    } 
    else{ 
     console.log("Video salvo com sucesso") 
     console.log(result) 
     res.send(result) 
    } 
    }) 
} 



app.get('/videos/:id', function(req, res){ 
    let path = req.params.id 
    Video.find({path:path}, function(err, result){ 
    if(err){ 
     console.log(err); 
    } 
    else{ 
     if (true) { 
     console.log("The url is:" + req.url); 
     const path = req.url.split('/')[2] 
     console.log("Path:" + path); 
     var file = `./uploads/${path}` 
     var range = req.headers.range; 

     fs.stat(file, function(err, stats) { 
      var total = stats.size; 

      if(range){ 
      console.log('RANGE: ' + range); 

      var positions = range.replace(/bytes=/, "").split("-"); 
      var start = parseInt(positions[0], 10); 
      var end = positions[1] ? parseInt(positions[1], 10) : total - 1; 
      var chunksize = (end - start) + 1; 

      console.log(req.url, start, end); 

      res.writeHead(206, { 
       "Content-Range": "bytes " + start + "-" + end + "/" + total, 
       "Accept-Ranges": "bytes", 
       "Content-Length": chunksize, 
       "Content-Type": "video/mp4" 
      }); 
      fs.createReadStream(file, { start: start, end: end }).pipe(res); 
      } else { 
      res.writeHead(200, { 'Content-Length': total, 'Content-Type': 'video/mp4' }); 
      fs.createReadStream(file).pipe(res); 
      res.render('videos', {videoData:result})//Erro: can't set header after they're sent 

      } 
     }); 
     } else { 
     console.log(req.url + ' (static)'); 
     next(); 
     } 
    } 
    }) 
}) 

app.get('/', function(req, res){ 
    Video.find({}, function(err, result){ 
    if(err){ 
     console.log(err); 
    } 
    else{ 
     console.log(); 
     res.render('home', {videoData:result}) 
    } 
    }) 
}) 
app.post('/upload', uploadVideo, newVideo) 

app.listen(3000,()=>{ 
    console.log("Server running on port 3000") 
}) 

回答