내 목표는 랩톱에서 서버로 비디오를 스트리밍하는 것입니다. 내가 노트북을 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와 같이 편하지 아니에요.
누군가가 이것이 정상적인 방법인지 그리고 어디에서 잘못되었을 지 알 수 있습니다.
미리 감사드립니다.
스트리밍 속도가 얼마나 빠른지 궁금합니다. 사실, 나는 소켓을 통해 C/C++ opencv에서 img base64를 보내어 동일한 작업을 시도했다. 나는 그것을 작동시킬 수 있었지만, 프레임 속도는 느리고 느리게 걸린다. 더 빨리 인코딩하려면 인코딩이 필요하다고 생각합니다. –
예 압축을 사용하지 않으므로이 방법은 매우 느립니다. 나에게 스트리밍을 돌보기 위해 GStreamer라고 불리는 것을 사용했다. 나는 당신이 비행 중에 일종의 압축을 할 유사한 도구를 사용할 것을 제안한다. 어쨌든, 이것은 프로그래밍을위한 좋은 연습 이었지만, 프로덕션 또는 데모 시스템을 위해서 이런 식으로 작업을하지는 않을 것입니다. –
GStreamer에서 스트리밍 비디오를 웹 페이지에 어떻게 표시 할 수 있습니까? 지금은 아직 새로운 표준이지만 아직 표준화되지 않은 webrtc 접근 방식을 살펴보고 있습니다. 웹캠으로 비디오 스트리밍을 쉽게 보낼 수 있지만 진행중인 비디오 파일은 스트리밍 할 수 있습니다. –