ffmpeg 가짜 스트림 현상 해결

냥무룩·2025년 2월 25일
0

rtsp-stream

목록 보기
6/6

ffmpeg를 이용하여 ip camera의 영상을 스트리밍 해주는데 네트워크 상황이 불안정하면 영상이 끊어진채로 돌아오지 않는 현상이 발생하였다.

처음에는 -reconnect 에 관련된 옵션을 사용하여 네트워크 불안정 상황은 고쳐진 것 처럼 보였으나,

ffmpeg -h full | grep reconnect

reconnect 옵션들
인터넷이 오랫동안 끊어져 있다가(야간에 1시간 이상 끊어짐) 돌아온 상태이면 또 다시 영상이 나오지 않았다. (아마 타임아웃 제한이 최대 2147초:35분 정도라 그런 것 같다.)

ffmpeg 프로세스는 계속 돌아가고 있고 연결된 것 처럼 보이지만 세그먼트 파일이 제대로 만들어 지고 있지 않았다. cpu 리소스도 고정적으로 잡고 있어서 말그대로 가짜 스트림을 만들고 있는 것이었다. (물론 화면도 연결 안됨)

그러던 중에 ffmpeg 로그를 살펴봤는데


이런식으로 스피드가 계속 줄고 time 값이 고정되어 증가하지 않는 형태의 로그 였다. (인터넷을 임의로 끊고 나서 재연결 후에 찍은 로그)

말 그래도 프로세스는 계속 작동 중인데 스트림은 제대로 인코딩 되고 있지 않는 상태였다.

그래서 로그의 시간을 받아 이전 로그의 시간보다 같거나 작으면 스트림이 제대로 되고 있지 않은 상태이므로 timeErrorCount를 올려주고 이 오류 상황이 일정 횟수 이상 지속되면 스트림을 재시작하도록 처리하였다.

아래는 간단한 일부 코드이다.

const pastTimeMatch = data.match(/time=(\d+):(\d+):(\d+\.\d+)/);
        if (pastTimeMatch) {
            const [_, hours, minutes, seconds] = pastTimeMatch;
            const currentStreamPastTime = parseFloat(hours) * 3600 + parseFloat(minutes) * 60 + parseFloat(seconds);
            
            // 마지막으로 확인했던 스트림 진행 시간과 현재 들어온 스트림 진행시간과 비교하여 현재 들어온 시간이 더 작거나 같으면 스트림이 정체되었다고 판단한다.
            if (currentStreamPastTime <= this.lastStreamPastTime) {
                // console.log('스트림시간 진행 정체 발생!!!!! streamTimeErrorCount: ' + this.streamTimeErrorCount);
                this.streamTimeErrorCount++;
            } else {
                // console.log('스트림 정상 진행' + this.streamTimeErrorCount);
                this.streamTimeErrorCount = 0;
            }

            this.lastStreamPastTime = currentStreamPastTime;

            // 스트림 정체 횟수가 최대 시간 보다 높으면 스트림을 재시작 시킨다.
            if (this.streamTimeErrorCount > MAX_STREAM_PAST_TIME_ERROR_COUNT) {
                console.log(
                    '스트림시간 정체로 인한 스트림 재시작 MAX_STREAM_PAST_TIME_ERROR_COUNT: ' +
                        MAX_STREAM_PAST_TIME_ERROR_COUNT,
                );
                this.restartStream();
              	this.streamTimeErrorCount = 0;
            }
        }

스트림이 정상 작동하는 것을 확인하였다!

0개의 댓글

관련 채용 정보