MistServer DVR(Time-Shift) 설정과 재생 실습
"본 글은 과거 티스토리에서 발행했던 콘텐츠를 기반으로, 최신 정보를 반영해 새롭게 정리한 업데이트 버전입니다."
📚 목차
1. DVR 기능 개요와 활용 시나리오
2. DVR 녹화 환경 구성하기
3. DVR 저장 및 관리 설정 예시
4. 녹화 스트림 재생하기
5. Time-Shift 기능으로 과거 영상 재생
✔ 마무리
1. DVR 기능 개요와 활용 시나리오
MistServer의 DVR(Digital Video Recorder) 기능은 단순 녹화 기능을 넘어, 실시간 스트림과 과거 영상의 경계를 허무는 핵심 기술입니다.
라이브로 송출되는 스트림을 .ts(Transport Stream) 형식의 작은 조각(세그먼트)으로 나누어 저장하고, 이를 연결한 .m3u8(HLS 플레이리스트)를 자동 생성함으로써, 시청자 또는 관리자가 원하는 시점으로 되돌아가 재생(Time-Shift)할 수 있습니다.
이 방식은 단순한 VOD(Video On Demand)와 달리, 라이브 방송 중에도 실시간 재생과 과거 탐색이 동시에 가능하다는 점에서 실무 가치가 높습니다.
예를 들어, 스트리밍이 진행 중인 상황에서 “5분 전 장면”이나 “어제 같은 시간대의 화면”을 별도의 파일 변환 없이 즉시 확인할 수 있습니다.
🔷 주요 활용 사례
🔸 CCTV 관제
▸ 보안 상황 발생 시 특정 시간대 영상 즉시 확인
▸ 예: “오전 9시 35분부터 10분 동안의 영상”을 URL 매개변수로 바로 재생
▸ 실시간 감시 중에도 과거 영상을 조회 가능해 상황 분석 속도 향상
🔸 라이브 방송
▸ 시청자가 놓친 구간을 ‘되감기’ 버튼처럼 바로 시청 가능
▸ 예: 실시간 콘서트 중 특정 곡의 하이라이트를 다시 보는 기능
▸ 방송 사고나 멘트 실수를 곧바로 재확인 가능
🔸 스포츠 중계
▸ 경기 중 골 장면 리플레이를 수 초 내 재생
▸ 예: 축구 경기에서 ‘방금 전 골 장면’을 분석용으로 반복 재생
▸ 하이라이트 편집 및 소셜미디어 업로드에도 활용 가능
🔸 교육/세미나 스트리밍
▸ 실시간 강의를 놓친 학생이 지정된 시점부터 시청 재개
▸ 회의·세미나에서 특정 발언이 있었던 시각을 빠르게 되돌려 보기

2. DVR 녹화 환경 구성하기
MistServer에서 DVR 기능을 활성화하려면, Push 설정을 통해 스트림을 세그먼트(.ts) 단위로 저장하고 이를 재생목록(.m3u8)으로 연결하는 구성을 만들어야 합니다.
이 단계는 DVR 기능의 핵심이며, 어떻게 세그먼트를 저장하고, 어떤 방식으로 플레이리스트를 구성할지에 따라 서비스 품질과 유지보수 편의성이 크게 달라집니다.
🔷 DVR 동작 구조 이해
1. 입력(Input)
▸ 라이브 스트림을 MistServer로 받아옵니다. (RTMP, RTSP, SRT 등)
2. Push 설정
▸ 받은 스트림을 지정 경로에 세그먼트 파일(.ts)로 나눠 저장
▸ 동시에 .m3u8 재생목록 파일을 생성하여 플레이어가 연속 재생 가능하게 함
3. 출력(Output)
▸ HLS/RTSP 등 표준 스트리밍 방식으로 DVR 콘텐츠 제공
4. Time-Shift
▸ 재생 URL에 시간 관련 매개변수를 붙여 과거 영상 재생
🔷 필수 설정 항목
| 항목 | 설명 | 예시 |
| m3u8=path/file.m3u8 | 저장된 세그먼트를 포함하는 플레이리스트 파일 경로 | m3u8=../../camera.m3u8 |
| $segmentCounter | 세그먼트 번호를 자동 부여하여 파일명 중복 방지 | ..._$segmentCounter.ts |
| $currentMediaTime | 세그먼트 시작 시간(타임스탬프)을 파일명에 반영 | ..._$currentMediaTime.ts |
▸ $segmentCounter는 간단한 번호 체계이므로 디버깅에 유리
▸ $currentMediaTime은 절대 시간이 필요할 때 유용 (예: 로그 분석, 이벤트 타임라인 매칭)
#날짜별로 세그먼트를 저장하며, 스트림별 m3u8 플레이리스트를 관리
/mnt/d/nvtest/$basename/$yday/$hour/$minute_$segmentCounter.ts?m3u8=../../$basename.m3u8
🔷 선택 옵션
| 옵션 | 설명 | 예시 |
| split | 세그먼트 분할 길이(초) | split=24 |
| maxEntries | 재생목록에 유지할 세그먼트 개수 | maxEntries=3600 |
| targetAge | 특정 시간(초) 이상 지난 세그먼트 자동 삭제 | targetAge=86400 |
| append | 스트림 재시작 시 기존 파일에 이어서 기록 | append=1 |
| noendlist | 스트림 종료 후에도 m3u8의 ENDLIST 태그를 추가하지 않음 | noendlist=1 |
#예시
#split=24 → 24초 단위로 세그먼트 저장
#maxEntries=3600 → 3600개의 세그먼트 유지 (1일 동안 기록)
#append=1 → 중단 후 재시작 시 기존 녹화 파일 유지
#noendlist=1 → 플레이리스트 종료 방지
&split=24&maxEntries=3600&append=1&noendlist=1
✔️ 설정 유의 사항
1. 세그먼트 크기 설정 (split 값)
▸ 기본적으로 세그먼트 크기는 60초로 설정됨.
▸ 세그먼트 크기가 클수록 서버 리소스가 절약되지만, 지연 시간이 길어질 수 있음.
▸ 낮은 지연 시간(DVR 딜레이 최소화)이 필요하면 작은 값(예: 10~30초)으로 설정.
2. 녹화가 중단되었을 때 대응 방법
▸ noendlist=1을 설정하면, 녹화가 중단되더라도 DVR 스트림이 VOD로 변환되지 않고 계속 사용할 수 있음.
▸ append=1을 추가하면, 스트림이 중단되었다가 재시작될 경우 기존 파일을 유지하고 새로운 세그먼트를 추가함.
3. DVR 저장 공간 관리
▸ maxEntries 또는 targetAge를 설정하지 않으면 저장 공간이 무한정 증가할 수 있음.
▸ maxEntries=3600(1일 기록), targetAge=86400(1일 이상 지난 세그먼트 삭제) 등의 값을 설정하여 저장 공간을 효율적으로 관리 가능.
3. DVR 저장 및 관리 설정 예시
DVR 저장 설정은 “얼마나 자주 나누어 저장할 것인지(split)”, “얼마나 오래 보관할 것인지(maxEntries·targetAge)”, 그리고 “스트림이 중단되었을 때 어떻게 이어갈 것인지(append·noendlist)”를 결정하는 핵심 단계입니다.
이 값들을 어떻게 설계하느냐에 따라 Time-Shift 지연 시간, 저장 공간 사용량, 서비스 안정성이 달라집니다.
🔷 설정 예시
(24초 단위 세그먼트, 24시간 보관, 재시작 시 기존 파일 유지)
/mnt/d/nvtest/$basename/$yday/$hour/$minute_$segmentCounter.ts
?m3u8=../../$basename.m3u8
&split=24
&maxEntries=3600
&append=1
&noendlist=1
/mnt/d/nvtest/ → 저장 폴더
$basename → 스트림 이름
$yday/$hour/ → 날짜 및 시간별 폴더 구조 생성
$minute_$segmentCounter.ts → 세그먼트 파일명 (고유 번호 포함)
m3u8=../../$basename.m3u8 → 스트림별 .m3u8 플레이리스트 생성
split=24 → 세그먼트를 24초 단위로 생성
maxEntries=3600 → 최대 3600개 세그먼트 유지 (24시간 유지)
append=1 → 중단 후 다시 시작 시 기존 파일 유지
noendlist=1 → 스트림 종료 시 플레이리스트가 종료되지 않도록 설정
✔️ 왜 24초 단위인가?
▸ 짧은 세그먼트 → 시청자가 되돌리기 요청 시 빠른 응답
▸ 너무 짧으면 세그먼트 수가 급증해 CPU·I/O 부하 증가
▸ 24초는 지연·리소스 부하·저장 효율의 균형이 잘 맞는 구간

🔷 설정 내용
1. DVR 녹화용 명령문을 사용하여 Push 작업을 설정 후 저장합니다.

2. Push 작업 동작을 확인합니다.

3. 저장경로에 .ts 세크먼트 파일과 재생목록이 생성되는 것을 확인 합니다

4. 녹화 스트림 재생하기
MistServer에서 Push 설정을 통해 camera.m3u8 플레이리스트가 생성되면, 이 파일을 새로운 스트림 이름(dvr)으로 등록하여 HLS 또는 RTSP 형태로 서비스할 수 있습니다.
이렇게 하면, 별도의 원본 입력 없이 녹화된 영상을 재생 전용 스트림으로 제공할 수 있습니다.
1. 녹화데이터 스트림 설정 하기

2. VLC로 rtsp://127.0.0.1:5554/dvr에 접속하여 영상이 재생되는 것을 확인합니다.

3. 다음은 VLC에서 Stream 연결 방식에 따른 지연 속도를 비교해 보았습니다.

▸ 1) vlc로 IP Camera에 직접 연결하여 plyer 한 경우
▸ 2) MistServer에서 IP Camera 에 연결하고 vlc에서 MistServer에 연결하여 play 한 경우
▸ 3) MistServer에서 IP Camera 영상을 DVR 녹화하고, vlc에서 DVR 녹화영상 Stream에 연결하여 play한 경우
5. Time-Shift 기능으로 과거 영상 재생
MistServer의 Time-Shift 기능은 DVR 녹화 데이터를 기반으로 과거 특정 시점의 영상을 실시간처럼 재생할 수 있도록 해 줍니다.
이는 단순한 파일 다운로드나 재인코딩 없이, URL 매개변수(Query String) 만으로 재생 구간을 지정하는 방식이므로 매우 빠르고 유연합니다.
즉, 현재 라이브 스트림이 계속 진행 중이더라도, 사용자는 URL에 시간을 지정해 몇 초 전·몇 분 전·혹은 특정 시각의 장면을 바로 불러올 수 있습니다.
🔷 지원 매개변수와 용도
MistServer Time-Shift 기능은 다양한 시간 지정 방식과 재생 범위를 지원합니다.
| 매개변수 | 설명 | 예시 |
| startunix | UTC 기준 Unix Timestamp에서 재생 시작 | startunix=1708381200 |
| start | HH:MM:SS 형식으로 시작 시간 지정 | start=01:30:00 |
| startrelative | 현재 시각 기준 N초 전부터 재생 | startrelative=-600 (10분 전) |
| endunix | UTC 기준 Unix Timestamp에서 재생 종료 | endunix=1708381800 |
| end | HH:MM:SS 형식으로 재생 종료 시각 지정 | end=02:00:00 |
| duration | 시작 시각부터 N초 동안만 재생 | duration=300 (5분만 재생) |
✔️ 녹화영상 시작 시간 지정 예시
1. RTSP URL 예제
#UTC 기분 Unix Timestamp 사용(10분전)
rtsp://172.18.89.20:5554/dvr?startunix=1708381200
#start=hh:mm:ss (특정 시간부터 재생)
rtsp://172.18.89.20:5554/dvr?start=01:30:00
$startrelative=-secs (현재 시간 기준 10분전)
rtsp://172.18.89.20:5554/dvr?startrelative=-600
2. HLS URL 예제
#UTC 기분 Unix Timestamp 사용(10분전)
http://172.18.89.20/dvr.m3u8?startunix=1708381200
#start=hh:mm:ss (특정 시간부터 재생)
http://172.18.89.20/dvr.m3u8?start=01:30:00
$startrelative=-secs (현재 시간 기준 10분전)
http://172.18.89.20/dvr.m3u8?startrelative=-600
✔️ 녹화영상 종료 시간 지정 예시
1. RTSP URL 예제
#endunix= (특정 Unix Timestamp에서 종료), 10분전 영상시작, 5분후 종료
rtsp://172.18.89.20:5554/dvr?startunix=1708381200&endunix=1708381800
#end=hh:mm:ss (특정 시간에서 종료)
rtsp://172.18.89.20:5554/dvr?start=01:30:00&end=02:00:00
#duration=secs (지정된 길이만큼 재생), (10분 전부터 5분 동안만 재생)
rtsp://172.18.89.20:5554/dvr?startrelative=-600&duration=300
2. HLS URL 예제
#endunix= (특정 Unix Timestamp에서 종료), 10분전 영상시작, 5분후 종료
rtsp://172.18.89.20:5554/dvr?startunix=1708381200&endunix=1708381800
#end=hh:mm:ss (특정 시간에서 종료)
http://172.18.89.20/dvr.m3u8?start=01:30:00&end=02:00:00
#duration=secs (지정된 길이만큼 재생), (10분 전부터 5분 동안만 재생)
http://172.18.89.20/dvr.m3u8?startrelative=-600&duration=300
✔️ 10분 전 영상을 rtsp로 연결하여 영상을 재생한 결과입니다

✔️ 실무 적용 팁
1. 짧은 split 값과 함께 사용
▸ 세그먼트 길이(split)가 짧을수록 Time-Shift 시점 지정의 정밀도가 높아집니다.
▸ 예: split=6초 → 최대 ±6초 오차 범위로 정확한 장면 재생 가능
2. 보안 환경에서는 인증과 함께 사용
▸ 사내 CCTV나 프리미엄 방송 서비스의 경우 URL 매개변수를 포함한 링크를 토큰 기반 인증으로 보호
3. Web Player 통합 시 Seek 기능 매핑
▸ HLS.js, Video.js 같은 플레이어에 start, duration 값을 연동하면 UI에서 시각적으로 시간 조절 가능
✔ 마무리
MistServer의 DVR(Time-Shift) 기능은 라이브 스트림에 시간 제어 기능을 더해, 사용자가 원하는 시점으로 자유롭게 이동하며 콘텐츠를 시청할 수 있게 해줍니다.
라이브와 녹화를 동시에 처리하면서도 서비스 중단 없이 운영 가능하다는 점이 가장 큰 장점입니다.
핵심 장점
🔸 운영 유연성 – 라이브·녹화 동시 운영, 특정 시각 영상 즉시 확인
🔸세밀한 설정 – split, maxEntries, targetAge로 저장 용량·품질 조정
🔸광범위한 호환성 – VLC, Web Player 등 다양한 환경에서 바로 재생
운영 시 유의사항
🔸 저장 용량 관리를 위해 maxEntries 또는 targetAge 설정 필수
🔸 민감 영상 접근을 막기 위한 인증·보안 설정 필요
🔸 세그먼트 크기와 네트워크 환경에 따른 재생 품질 사전 테스트
DVR & Time-Shift는 CCTV, 방송, 교육 등에서 서비스 품질과 사용자 만족도를 동시에 높일 수 있는 기능입니다.
적절한 설정과 관리만 갖추면, 실시간 서비스에 “되돌려 보기”와 “즉시 탐색”이라는 강력한 사용자 경험을 제공할 수 있습니다.
👉 관련 글 링크
1. [MistServer] 설치 실습 - Ubuntu에 직접 설치 vs Docker 컨테이너 실행
2. [MistServer] 설치 후 필수 기본 설정 가이드 (v3.8 기준)
3. [MistServer] Input 실습: 다양한 입력 방식 설정과 스트림 결과 확인
4. [MistServer] Push 기능을 이용한 스트림 녹화 설정
5. [MistServer] DVR(Time-Shift) 설정과 재생 실습
6. [MistServer] OBS Studio와 MistServer 3.8을 이용한 라이브 방송 실습(RTMP,WHIP)
7. [MistServer] API 인증 방식과 HTTP·WebSocket API 비교
8. [MistServer] 스트림 관리 API 실습 (Python)
※ 게시된 글 및 이미지 중 일부는 AI 도구의 도움을 받아 생성되거나 다듬어졌습니다.
'1.시스템&인프라 > 스트리밍' 카테고리의 다른 글
| [MistServer] API 인증 방식과 HTTP·WebSocket API 비교 (0) | 2025.11.06 |
|---|---|
| [MistServer] OBS Studio와 MistServer 3.8을 이용한 라이브 방송 실습(RTMP,WHIP) (0) | 2025.11.06 |
| [MistServer] Push 기능을 이용한 스트림 녹화 설정 (0) | 2025.11.06 |
| [MistServer] Input 실습: 다양한 입력 방식 설정과 스트림 결과 확인 (0) | 2025.11.06 |
| [MistServer] 설치 후 필수 기본 설정 가이드 (v3.8 기준) (0) | 2025.11.06 |