라이브 스트림 상태 점검 — ffprobe / gstreamer 실전 명령어
"이 RTSP 카메라 살아있나?" 라이브 스트림에 문제가 생기면 제일 먼저 던지는 질문입니다. 이 글은 현장에서 실제로 쓰는 네 가지 점검 명령어를 상황별로 정리합니다. ffprobe로 응답 여부를 찔러보고, 패킷의 pts/dts 타임스탬프를 까서 끊김이나 시간 어긋남을 진단하고, 프레임별 시각을 csv로 뽑아 이미지와 매칭하고, gst-discoverer로 코덱과 해상도를 한 화면에 확인하는 법까지 다룹니다. 각 도구가 무엇을 보여주고 어떤 신호를 읽어야 하는지에 초점을 맞췄습니다.
목차(21개 항목)
- 점검 4가지 사용처 매트릭스
방법 1 — ffprobe 단순 호출: "살아있는지"만 확인
방법 2 — `-show_packets`: 패킷 단위 타임스탬프 분석
방법 3 — lavfi 필터로 프레임별 타임스탬프 + 이미지 매칭
방법 4 — gstreamer로 한눈에 보기
한눈 정리
- 자동화 한 줄 — 카메라 헬스체크 스크립트
- 관련 글
- 참고 자료
"이 RTSP 카메라 살아있나?", "녹화된 mp4의 타임스탬프가 비정상이라는데 어디 보지?". 라이브 스트림 트러블슈팅에서 가장 먼저 던지는 질문들입니다. 이 글은 현장에서 실제로 쓰는 4가지 점검 명령어를 사용처별로 정리합니다. 각 방법이 무엇을 보여주고, 어떤 신호를 읽어야 하는지에 초점을 둡니다.
점검 4가지 사용처 매트릭스
| 상황 | 도구 | 핵심 지표 |
|---|---|---|
| RTSP/HTTP 스트림이 응답하나? | ffprobe URL | 즉시 응답 여부 |
| 패킷 타임스탬프가 정상인가? | ffprobe -show_packets | pts/dts 단조 증가 |
| 프레임별 시각을 csv로 뽑고 싶다 | ffprobe -f lavfi -i movie=... | frame timestamp 매칭 |
| 코덱·해상도·라이브 여부 한 번에 | gst-discoverer-1.0 | 메타데이터 한 화면 |
목적에 따라 도구를 골라야 합니다. 모든 도구를 매번 다 돌리는 건 시간 낭비입니다.
방법 1 — ffprobe 단순 호출: "살아있는지"만 확인
가장 가벼운 첫 단계. URL이 RTSP·HTTP·로컬 파일이든 그냥 찔러봅니다.
읽는 법
- 즉시 응답 → 스트림 살아있음, 메타데이터 출력 (코덱·해상도·프레임레이트)
- 수 초 이상 응답 없음 → 카메라 도달 불가, 인증 실패, 또는 RTSP 방화벽 차단
Connection refused→ 포트 닫힘401 Unauthorized→ 인증 정보 오류
타임아웃 옵션: 무한 대기 방지하려면
-rw_timeout 5000000(마이크로초 단위, = 5초) 추가. CI나 모니터링 스크립트에서 필수.
방법 2 — -show_packets: 패킷 단위 타임스탬프 분석
스트림은 살아있는데 화면이 끊기거나 시간이 어긋나는 경우. 패킷 헤더를 까서 pts/dts를 직접 읽습니다.
출력 핵심 필드
정상 패턴
비정상 신호
| 신호 | 의심 |
|---|---|
| pts 간격이 들쑥날쑥 | 카메라 시계 불안정, 프레임 드롭, jitter |
| pts가 갑자기 큰 점프 | 타임스탬프 wrap-around, 인코더 리셋 |
| pts 역행 | timestamp rollback (#26에서 다룬 RTMP B-frame 케이스가 대표) |
| pts ≠ dts | B-frame이 있어 정상. 둘이 다른 게 자연스러운 상황 (#29 참고) |
pts/dts가 왜 다를 수 있는지는 B-frame 완전정복 참조.
타임스탬프만 추리기
전체 패킷이 너무 많으면 pts_time만 뽑습니다.
방법 3 — lavfi 필터로 프레임별 타임스탬프 + 이미지 매칭
분석 목적상 "이 프레임이 어느 시점인가"를 csv로 만들어야 할 때가 있습니다. 예: 영상에서 추출한 이미지 100장이 각각 몇 초 시점인지 매칭.
프레임 타임스탬프 csv 만들기
정정 — 필드명 주의: 예전 ffprobe(4.x 이하)에서는
pkt_pts_time였지만, ffmpeg 5.0부터pts_time으로 통일·개명되었습니다. 최신 빌드에서pkt_pts_time을 쓰면 빈 값이 나오니pts_time을 쓰세요. (패킷에 대한-show_packets의 필드명도pts_time으로 동일.)
fps=25 필터는 입력 영상을 균일한 25fps로 리샘플하면서 프레임 타임스탬프를 새로 부여합니다.
이미지 추출 + 리스트와 매칭
RTSP에서 1초당 한 장 캡처
스트림에서 주기적으로 스냅샷이 필요할 때:
fps=1→ 1초당 한 장- 모니터링 시스템에서 카메라가 정말 화면을 내고 있는지 시각 검증할 때 유용
방법 4 — gstreamer로 한눈에 보기
ffprobe는 강력하지만 출력이 장황합니다. 메타데이터를 한 화면에 깔끔히 보고 싶으면 gstreamer의 gst-discoverer-1.0이 더 빠릅니다.
출력 예시
한 번에 잡히는 것
| 정보 | 의미 |
|---|---|
| Container | RTSP/RTP, MP4 등 컨테이너 종류 |
| Live | 라이브 스트림 여부 |
| Seekable | 점프 가능 여부 |
| Resolution | 해상도 |
| Frame rate | fps (30/1 = 30fps) |
| Bitrate | 비트레이트 (#18) |
| Codec | H.264 profile 등 (#28) |
언제 gstreamer를 쓰나
- ffprobe보다 요약된 출력이 필요할 때
- 컨테이너 타입과 코덱 프로파일을 빠르게 확인할 때
- gstreamer 파이프라인 디버깅 중 (gstreamer 외 환경에서는 굳이 설치할 필요 없음)
ffprobe로 같은 정보를 얻으려면 옵션을 여러 개 조합해야 합니다.
한눈 정리
트러블슈팅 흐름
자동화 한 줄 — 카메라 헬스체크 스크립트
모니터링 시스템에 꽂을 수 있는 간단한 헬스체크.
관련 글
- #29 B-frame 완전정복 — pts ≠ dts가 정상인 이유, 전송/표시 순서 재배열
- #26 RTMP B-frame PTS rollback — WebRTC 변환 — 본문에서 다룬 실제 timestamp 역행 현상
- #16 FFmpeg 컨테이너/코덱/스트림 — ffprobe가 읽어내는 컨테이너·코덱·스트림 개념 기초
- #32 시그널링과 미디어 분리 — RTSP/SIP vs RTP — ffprobe로 찔러보는 RTSP가 실제로 무엇을 주고받는지
- #18 Bitrate 완전 정복 — gst-discoverer가 보여주는 Bitrate 값을 어떻게 해석하나
참고 자료
- ffprobe Documentation —
-show_packets/-show_frames/-show_entries/-of옵션 공식 레퍼런스 - ffmpeg-protocols: rtsp — RTSP 입력,
rtsp_transport,-rw_timeout등 네트워크 옵션 - FFmpeg lavfi / movie source filter —
movie=...lavfi 소스 필터로 프레임 타임스탬프를 뽑는 근거 - GStreamer gst-discoverer-1.0 manual — 컨테이너·코덱·Live/Seekable 메타데이터 요약 도구
- RFC 7826 — Real-Time Streaming Protocol 2.0 — RTSP 시그널링 표준(원조 RFC 2326의 개정판)
- RFC 3550 — RTP: A Transport Protocol for Real-Time Applications — RTP 타임스탬프 의미와 단조 증가 규약의 1차 출처