2016-06-16 6 views
1

~ 52MB mp4 비디오 파일을 nodejs 서버에서 제공하려고합니다. 아래 첨부 파일을 제공하는 데 사용되는 코드의 스크린 샷입니다. Code used to serve mp4 나는 mp4 용 MIME 형식을 포함하는 정적 파일 호출을위한 mime 형식의 개체를 가지고 있습니다. 내가 크롬의 페이지로 이동하려고 할 때Nodejs를 사용하여 MP4 비디오 파일 제공

var mimeTypes = { html: 'text/html; charset=utf-8', jpeg: 'image/jpeg', jpg: 'image/jpeg', png: 'image/png', js: 'text/javascript', css: 'text/css', mp4: 'video/mp4' };

그러나, 나는 오류 얻을 : 이미지를 제공하는 데 사용됩니다

GET http://localhost:8888/videos/movie.mp4 net::ERR_INCOMPLETE_CHUNKED_ENCODING

이제

(위 screenshotted)이 같은 논리를하고 CSS는 잘하지만 mp4를 제공하려고 할 때 비참하게 실패합니다. Chrome의 네트워크 요청 패널을 보면 서버가 200 OK 상태로 응답하고 0 바이트 파일을 동영상으로 게재 한 것을 볼 수 있습니다. 네트워크 요청의 바이트 범위도 의심스러워 보이지만 확실히 알기 위해서는 HTTP 요청에 대해 충분히 알지 못합니다. 통계를 보면 Request Request_Abridged

이 (fs.lstat에서받은, 아래 그림 참조) 객체, 그러나 나는 불완전한 청크 분할 인코딩을 점점 계속 파일은 4096 바이트의 덩어리로 분할하는 방법을 '알고있다'고 표시 오류. 바이러스 백신이 없으며 Chrome에서 다양한 설정을 사용 중지/다른 브라우저를 사용했지만 동영상을 볼 수 없습니다.

{"dev":16777220,"mode":33188,"nlink":1,"uid":501,"gid":20,"rdev":0,"blksize":4096,"ino":1070608,"size":51246445,"blocks":100096,"atime":"2016-06-15T23:06:27.000Z","mtime":"2016-06-15T21:41:00.000Z","ctime":"2016-06-15T21:45:56.000Z"}

내가 놓친 거지 헤더가 있습니까? 어떻게 든 응답을 너무 일찍 끝낼 수 있습니까? 나는 지금 단서가 없다.

+0

[부호의 스크린 샷을 게시하지 않습니다 (http://meta.stackoverflow.com/q/303812/201952); 실제 코드를 복사하여 붙여넣고 [올바르게 포맷하십시오] (http://stackoverflow.com/editing-help#code). – josh3736

답변

0

this solution를 사용하여 고정.

``

if (stats.isFile()) { 
    var extension = path.extname(file).split('.').reverse()[0]; 
    if (extension === 'mp4') { 
     // gotta chunk the response if serving an mp4 
     var range = req.headers.range; 
     var parts = range.replace(/bytes=/, "").split("-"); 
     var partialstart = parts[0]; 
     var partialend = parts[1]; 
     var total = stats.size; 
     var start = parseInt(partialstart, 10); 
     var end = partialend ? parseInt(partialend, 10) : total - 1; 
     var chunksize = (end - start) + 1; 
     var mimeType = mimeTypes[extension] || 'text/plain; charset=utf-8'; 
     res.writeHead(206, {    
     'Content-Range': 'bytes ' + start + '-' + end + '/' + total, 
     'Accept-Ranges': 'bytes', 
     'Content-Length': chunksize, 
     'Content-Type': mimeType 
     }); 
     var fileStream = fs.createReadStream(file, { 
      start: start, 
      end: end 
     }); 
     fileStream.pipe(res); 
     res.on('close', function() { 
     console.log('response closed'); 
     if (res.fileStream) { 
      res.fileStream.unpipe(this); 
      if (this.fileStream.fd) { 
       fs.close(this.fileStream.fd); 
      } 
     } 
     }); 
    } else { 
     var mimeType = mimeTypes[extension] || 'text/plain; charset=utf-8'; 
     res.writeHead(200, {'Content-Type': mimeType}); 
     var fileStream = fs.createReadStream(file); 
     fileStream.pipe(res); 
    } 

    return; 
    } 

``