2012-10-11 8 views
5

내 목표는 랩톱에서 서버로 비디오를 스트리밍하는 것입니다. 내가 노트북을 NodeJs를 사용하여 이것을 달성하기 위해 노력하고있어 서버 &. OpenCV 라이브러리를 사용하여 랩톱에서 비디오를 캡처하고 jpg 파일에 저장합니다. 그런 다음 파일을 읽고 base64로 변환하여 노드의 Net.socket 모듈을 사용하여 파일을 전송할 수 있습니다. 이는 캡처, 인코딩 및 전송과 같은 지속적인 프로세스입니다. FIN을 서버로부터 수신 될 때까지Net 소켓을 사용하는 NodeJS, OpenCV 및 스트리밍 이미지

var cv = require('opencv'); 
var fs = require('fs'); 
var net = require('net'); 
var camera = new cv.VideoCapture(0); 
var server = net.createServer(); 
server.listen('50007', '127.0.0.1'); 

server.on('connection', function(socket){ 
    camera.read(function(image){ 
     image.save('original.jpg'); 

     fs.readFile('original.jpg', 'base64', function(err, image){ 
      socket.write(image, 'base64', function(){ 
       socket.end(); 
      }); 
     }); 
    }); 
}); 

클라이언트 I 루프에 : 여기

는 한 JPG 파일을 전송하는 서버 코드입니다. 다음은 클라이언트 코드입니다.

var net = require('net'); 
var fs = require('fs'); 
var client = new net.Socket(); 
var buffer =''; 
client.setEncoding('base64'); 

client.connect('50007', '127.0.0.1', function(){ 
    console.log('Connecting to server...'); 
}); 

client.on('data', function(data){ 
    buffer += data; 
}); 

client.on('end', function(){ 
    var dataBuffer = new Buffer(buffer, 'base64'); 
    fs.writeFile('copy.jpg', dataBuffer, function(err){ 
     if(err){ 
      console.log(err); 
     } 
    }); 
}); 

문제는 전체 이미지가 실제로 전송되지 않는다는 것입니다. 받은 파일 인 copy.jpg를 열면 항상 맨 아래에 청크가 없습니다.

최종 버전에서 목표는 하나의 jpg를 보내고 'EndOfFile'과 같은 키워드를 통해 각 'jpg'의 끝을 구분하는 것입니다. 나는 'EndOfFile'이라는 키워드를 내 base64 인코딩 된 이미지에 보내기 전에 보내지 만받는쪽에는 정말 엉망이되었습니다.

샘플 고급 서버 :

fs.readFile('original.jpg', 'base64', function(err, image){ 
    image += 'EndOfFile'; 
    socket.write(image, 'base64'); 
}); 

하나의 클라이언트 측 루프는 키워드에 대한 데이터의 각 청크를 검사 할 것이며, 그것을 발견하면 그 다음 어떤 기록 될 것입니다 버퍼에 파일에 버퍼 리셋 , 다음 파일 준비. 내가 파이썬에서 작업이 왔

client.on('data', function(data){ 
    if(data.indexOf('EndOfFile') > 0){ 
     buffer += data.substr(0, data.indexOf('EndOfLine')); 
     var dataBuffer = new Buffer(buffer, 'base64'); 

     fs.writeFile('copy.jpg', dataBuffer, function(err){ 
      if(err){ 
       console.log(err); 
      } 
     }); 

     buffer = ''; 
    } else { 
     buffer += data; 
    } 
}); 

샘플 고급 클라이언트 그래서 난 내 논리가 정확한지 생각하지만 난 NodeJS와 같이 편하지 아니에요.

누군가가 이것이 정상적인 방법인지 그리고 어디에서 잘못되었을 지 알 수 있습니다.

미리 감사드립니다.

+0

스트리밍 속도가 얼마나 빠른지 궁금합니다. 사실, 나는 소켓을 통해 C/C++ opencv에서 img base64를 보내어 동일한 작업을 시도했다. 나는 그것을 작동시킬 수 있었지만, 프레임 속도는 느리고 느리게 걸린다. 더 빨리 인코딩하려면 인코딩이 필요하다고 생각합니다. –

+0

예 압축을 사용하지 않으므로이 방법은 매우 느립니다. 나에게 스트리밍을 돌보기 위해 GStreamer라고 불리는 것을 사용했다. 나는 당신이 비행 중에 일종의 압축을 할 유사한 도구를 사용할 것을 제안한다. 어쨌든, 이것은 프로그래밍을위한 좋은 연습 이었지만, 프로덕션 또는 데모 시스템을 위해서 이런 식으로 작업을하지는 않을 것입니다. –

+0

GStreamer에서 스트리밍 비디오를 웹 페이지에 어떻게 표시 할 수 있습니까? 지금은 아직 새로운 표준이지만 아직 표준화되지 않은 webrtc 접근 방식을 살펴보고 있습니다. 웹캠으로 비디오 스트리밍을 쉽게 보낼 수 있지만 진행중인 비디오 파일은 스트리밍 할 수 있습니다. –

답변

0

데이터의 마지막 비트가 여전히 버퍼링되는 동안 end 이벤트가 발생한다고 생각됩니다.

end 이벤트가 아닌 close 이벤트를 기다려보십시오. 소켓에 대해 잘 모르겠지만 spawn과 같은 다른 노드 API에서는 관련 스트림이 플러시되기 전에 end 이벤트가 일찍 발생하므로 대기중인 버퍼링 된 데이터가있을 수 있습니다.

배관을 통해 직접 관리하지 않아도됩니다. 파일에 대한 소켓 스트림은 fs.createWriteStream().pipe()입니다.