전체 과정
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_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을 다시 하면 될거 같은데....발생 시점이 잡히지 않는 중
'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 |
댓글