본문 바로가기

Node.js

[Node.js] rtsp카메라를 이용해서 웹페이지에서 실시간 스트리밍(CCTV) 서비스 이용하기

ffmpeg를 사용하는 이유 : 웹페이지는 정적인 이미지파일만 사용가능하기 때문에 FFmpeg를 통하며 MJPG파일을 동적인 이미지로 변환하여 전송한다.

소켓통신을 사용하는 이유 : FFmpeg를 통해서 RTSP를 사진으로 변환 하였지만 웹페이지의 요청은 비동기적으로 실행되기 때문에 양방향 통신을 위해 웹 소켓 기술을 사용했다.

 

Visual Studio Code를 킨다음 Termial -> New Terminal 클릭

아래에 터미널 창에 npm init -y 입력

npm init -y

package.json이 생성되었으면 파일을 만들어 준다. 마우스 우클릭 -> New File

app.js 와 index.html을 만들어 준다.

 

app.js에 다음 코드를 복사해서 넣어준다.

server.listen(6148) <- 원하는 포트번호를 입력해준다.

var uri = ' ' <-안에다가 rtsp url을 입력해준다.

const app = require('express')(),
  server = require('http').Server(app),
  io = require('socket.io')(server),
  rtsp = require('rtsp-ffmpeg');
server.listen(6148); //열고싶은 포트번호 입력
var uri = 'rtsp url 입력', 
  stream = new rtsp.FFMpeg({input: uri});
io.on('connection', function(socket) {
  var pipeStream = function(data) {
    socket.emit('data', data.toString('base64'));
  };
  stream.on('data', pipeStream);
  socket.on('disconnect', function() {
    stream.removeListener('data', pipeStream);
  });
});
app.get('/', function (req, res) {
  res.sendFile(__dirname + '/index.html');
});

 

index.html에 다음 코드를 복사해서 넣어준다.

<html lang="en">
<head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>rtspplay</title>
</head>
<body>
    <img id="img">
<script src="/socket.io/socket.io.js"></script>
<script>
    var img = document.getElementById('img'),
        socket = io('');
    socket.on('data', function(data) {
        img.src = 'data:image/jpeg;base64,' + data;
    });
</script> 
</body>
</html>

필요한 모듈들을 설치해 준다.

npm install express

npm install rtsp-ffmpeg

npm install socket.io

 

모듈을 다 설치 했으면 서버를 실행시킨다.

node app.js

서버가 켜지면 http:localhost:6148에 접속을 하면은 다음과 같이 웹페이지에서 실시간 스트리밍이 가능하다.

 

 

 

express-generator를 통해서 다음과 같이 bin, public, routes, views, app.js로 이미 만들어진 폴더에서 위에 방법처럼 넣게 되면은 실시간 스트리밍이 통하지 않는다.

우선은 위에서 설치했던 rtsp-ffmpeg랑 socket.io가 설치가 안되어있으면 설치한다.

npm install rtsp-ffmpeg

npm install socket.io

 

bin -> www.js 파일로 들어간다음에 server.liston(port); 가 적힌 위치로 간다.

 

server.linsten(port);를 지우고 그 자리에 다음 코드를 복사해서 넣어준다.

var io = require('socket.io')(server);
var rtsp = require('rtsp-ffmpeg');

server.listen(port);
var uri = 'rtsp url 입력',
  stream = new rtsp.FFMpeg({input: uri});
io.on('connection', function(socket) {
  var pipeStream = function(data) {
    socket.emit('data', data.toString('base64'));
  };
  stream.on('data', pipeStream);
  socket.on('disconnect', function() {
    stream.removeListener('data', pipeStream);
  });
});
server.on('error', onError);
server.on('listening', onListening);

 

그다음 views 폴더에 있는 자신이 넣고싶은 파일에 원하는 위치에 다음 코드를 넣어준다.

실시간 스트리밍 영상이 img파일이기 때문에 style에서 width를 100%로하면은 div안에 맞춰서 반응형 웹에 맞게 디스플레이 크기에 따라 크기가 변하게 된다.

<img id="img" style="width: 100%;">
    <script src="/socket.io/socket.io.js"></script>
    <script>
      var img = document.getElementById('img'),
      socket = io('');
      socket.on('data', function(data) {
      img.src = 'data:image/jpeg;base64,' + data;
      });
    </script> 

 

이제 서버를 키고 확인을 해보면 다음과 같이 진행하던 프로젝트에도 원하는 크기로 넣을수가 있다.

 

만약에 터미널 창에서 GET /socket.io/socket.io.js 404오류가 발생한다면

app.js에 다음 코드를 추가해 준다.

app.use(express.static(path.join(__dirname, 'socket.io')));
app.use('/socket.io', express.static('socket.io'));