본문 바로가기
Javascript/Node.js

npm node-rtsp-stream

by 하이바네 2021. 7. 6.
반응형

전체 과정

node-rtsp-stream 삽질 - 1부
node-rtsp-stream 삽질 - 2부(개선)

 

이번 프로젝트에서 실제 운행중인 차량의 영상의 송출이 필요했다.

데모용이어서 크게 생각을 하지 않고 ip카메라를 이용해서 송출하고 웹 페이지에서 그 화면을 보여주면 된다고 간단하게만 생각했다.

알아보니 웹에서는 rtsp를 바로 출력할 수는 없고 ws(웹소켓)으로 변환을 하고 그것을 출력 해야했다.

 

물론 위의 방법도 Node.js를 사용하면 간단하게 해결할 수 있었다. 정말 다양한 모듈들을 지원하니...시간 날때 반드시 Node.js를 공부 해봐야겠다. 사설은 치우고...

ip카메를 연결하고 해당 카메라의 공인ip를 node-rtsp-stream에 입력만 해주면 정말 간단하게 끝이 났다.

그리고 웹에서는 jsmpeg로 해당 영상을 출력만 해주면 되었다.


https://www.npmjs.com/package/node-rtsp-stream

 

node-rtsp-stream

node-rtsp-stream ================

www.npmjs.com

위의 사이트에 예제가 잘 나와있는데 하나가 빠져있다. 바로 node_modules/node-rtsp-stream/mpeg1muxer.js의 파일 수정에 대한 것이다.

 23   this.spawnOptions = [
 24 /*
 25     "-i",
 26     this.url,
 27     '-f',
 28     'mpegts',
 29     '-codec:v',
 30     'mpeg1video',
 31 */
 32     "-rtsp_transport", "tcp", "-i",
 33     this.url,
 34     '-f',
 35     'mpeg1video',
 36     '-b:v', '1000k',
 37     '-maxrate', '1000k',
 38     '-bufsize', '1000k',
 39      '-an', '-r', '24',
 40     // additional ffmpeg options go here
 41     ...this.additionalFlags,
 42     '-'
 43
 44   ]

 

위와 같이 수정을 하면되며 bufsize, maxrate는 카메라에서 쓰는것에 따라 조금씩 수정을 해서 테스트를 하면 된다. 위의 과정을 거치지 않으면 화면이 깨져서 나올 수 있으니 주의할것


웹과 연결을 하고나서 알아차린 문제

1. 웹 페이지를 열고 있던 중 카메라 rtsp서버가 닫히고 다시 열릴 경우에는 수동으로 재연결 해야 화면이 다시 출력 된다는 것
이거는 큰 문제가 되지 않았다. 계속 떠있는 화면도 아니고 클릭하면 나타나는 화면이라 그때, 다시 나타나기만 하면되었으니...

 

오늘 테스트 하던 중 심각한 문제를 발견했다.

2. node-rtsp-stream은 연결되어있으나 카메라가 연결되지 않을 경우

3. node-rtsp-stream과 카메라가 연결되었다가 카메라의 연결이 중간에 끊긴 경우
당연히 자동 재연결이 있을 줄 알았다...Node.js에 있던 모듈들을 믿었었다고 봐야하나... 그런데 혹시 하고 테스트를 해보니 되지 않았다(....) 오히려 에러를 띄우고는 그냥 프로세스가 멈춘 상태로 있었다.

 

그래서 사용되는 파일들 중 videoStream.js를 집중해서 보았다. 이벤트가 발생하면 나타나는 부분이 있었기에...

그 부분중 나의 소스에 이러한것을 추가했다.

stream = new Stream({....})//이렇게 된 경우

stream.mpeg1Muxer.on('exitWithError',()=>{

    stream.stop();

})

stream.mpeg1Muxer.on('ffmpegStderr',(data)=>{

    if(data.includes('muxing overhead')){

       stream.stop();

    }

})

 

첫번째는 에러가 뜨면이 맞는데 두번째는 카메라가 끊겼다가 재연결이 되었을 경우이다. 거기에 나타나는 string중에 muxing overhead가 있어서 그것을 체크하고 stop하게 넣었다.

이렇게 오류가 발생하면 프로세스를 종료시키게 하고 pm2에서 프로세스를 다시 실행시키게 할 예정이다.

뭔가 해결책을 찾은듯하다...불가능 하지는 않을것 같은.....오늘은 피곤하니 퇴근하고 내일 일찍와서 테스트 실시 예정

 

직업병인가 보다. 결국 테스트 해보고 퇴근 준비 중. pm2로 등록하니 중간에 연결이 끊겨도 다시 잘 연결된다. 너무 행복함 ㅠㅠ 웹에서 재연결 하는것만 보완하면 완벽할듯 하다!!!!
그런데 나의 경우에는 카메라가 하나라서 그렇지만...만약 여러개인 경우에는 어떻게 되는거지?  일단 데모가 끝나고 나면 그때 다시....

 

2021-07-07 결국 아침에 출근하자말자 이것부터 봤다. 뭔가 엄청 신경이 쓰여서....

몇번 테스트를 해봤는데 문제없이 잘 재접속하는듯 하다. 

 

Stream = require('node-rtsp-stream')

var rtspList = [
        {"url":'rtsp url',"port":포트번호, "stream":null},
        {"url":'rtsp url',"port":포트번호, "stream":null}
];

var rtspListLength = rtspList.length;
for(var i=0; i<rtspListLength; i++){
        openStream(rtspList[i]);

}

function openStream(obj){
        var stream = new Stream({
                name: 'name',
                streamUrl : obj.url,
                wsPort: obj.port,
                ffmpegOptions: { // options ffmpeg flags
                        '-stats': '', // an option with no neccessary value uses a blank string
                        '-r': 30, // options with required values specify the value after the key
                }
        });
        stream.mpeg1Muxer.on('exitWithError',()=>{
                stream.stop();
                openStream(obj);
        });

        stream.mpeg1Muxer.on('ffmpegStderr', (data)=>{
                data = data.toString();
                if(data.includes('muxing overhead')){
                        stream.stop();
                        openStream(obj);
                }
        });
}

 

2021-07-07 오후
카메라의 데이터가 전송이 되다가 갑자기 카메라의 연결이 오랫동안 끊어지고 재연결될 경우 멈춰버리는 현상 확인
-> 해당 발생 시 stop을 걸고 openStream을 다시 하면 될거 같은데....발생 시점이 잡히지 않는 중

728x90

'Javascript > Node.js' 카테고리의 다른 글

[Node.js] 버전 관리하기 with nvm  (0) 2023.02.28
[node.js]puppeteer 설치 오류  (0) 2023.01.30
npm 패키지 추가 중 에러  (0) 2022.06.20
nvm 설치 오류 해결 with scoop  (0) 2022.01.01
npm node-rtsp-stream(최종 버전)  (12) 2021.07.08

댓글