라이브 스트림 상태 점검 — ffprobe와 GStreamer
RTSP 등 live input의 연결 상태, stream metadata, packet·frame timestamp를 ffprobe와 GStreamer 도구로 확인합니다. timeout을 둔 probe, PTS·DTS 출력, frame CSV 추출, `gst-discoverer-1.0` 사용법을 나누고 각 명령이 실제 media 수신까지 보장하는지 여부도 구분합니다.
목차(21개 항목)
- 점검 4가지 사용처 매트릭스
방법 1 — ffprobe 단순 호출: "살아있는지"만 확인
방법 2 — `-show_packets`: 패킷 단위 타임스탬프 분석
방법 3 — lavfi 필터로 프레임별 타임스탬프 + 이미지 매칭
방법 4 — gstreamer로 한눈에 보기
한눈 정리
- 자동화 한 줄 — 카메라 프로브 스크립트
- 관련 글
- 참고 자료
"이 RTSP 카메라 살아있나?", "녹화된 mp4의 타임스탬프가 비정상이라는데 어디 보지?". 라이브 스트림 트러블슈팅에서 가장 먼저 던지는 질문들입니다. 이 글은 현장에서 실제로 쓰는 4가지 점검 명령어를 사용처별로 정리합니다. 각 방법이 무엇을 보여주고, 어떤 신호를 읽어야 하는지에 초점을 둡니다.
점검 4가지 사용처 매트릭스
| 상황 | 도구 | 핵심 지표 |
|---|---|---|
| RTSP/HTTP URL을 열 수 있나? | ffprobe URL | 연결·인증·헤더 파싱 결과 |
| 패킷 타임스탬프가 정상인가? | ffprobe -show_packets | DTS 순서와 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 간격이 예상과 다름 | 가변 프레임레이트, 프레임 드롭, 타임스탬프 재작성 여부를 함께 확인 |
| pts가 갑자기 큰 점프 | 타임스탬프 wrap-around, 인코더 리셋 |
| 전송 순서에서 pts 역행 | B-frame 재정렬이면 정상일 수 있음. DTS·패킷 순서와 함께 확인 |
| pts ≠ dts | B-frame이 있어 정상. 둘이 다른 게 자연스러운 상황 (#29 참고) |
pts/dts가 왜 다를 수 있는지는 B-frame 이해하기 참조.
타임스탬프만 추리기
전체 패킷이 너무 많으면 pts_time만 뽑습니다.
방법 3 — lavfi 필터로 프레임별 타임스탬프 + 이미지 매칭
분석 목적상 "이 프레임이 어느 시점인가"를 csv로 만들어야 할 때가 있습니다. 예: 영상에서 추출한 이미지 100장이 각각 몇 초 시점인지 매칭.
프레임 타임스탬프 csv 만들기
필드명 주의: 현재 ffprobe의 프레임 출력은
pts_time을 사용합니다. 과거 빌드에서는pkt_pts_time이 보일 수 있으므로, 설치된 버전의-show_frames출력과 공식 문서를 기준으로 필드명을 선택하세요. FFmpeg 개발 브랜치에서는 2021년 7월 이 이름 변경이 반영됐습니다.
fps=25 필터는 입력 영상을 균일한 25fps로 리샘플하면서 프레임 타임스탬프를 새로 부여합니다.
이미지 추출 + 리스트와 매칭
RTSP에서 1초당 한 장 캡처
스트림에서 주기적으로 스냅샷이 필요할 때:
fps=1→ 1초당 한 장- 모니터링 시스템에서 카메라가 정말 화면을 내고 있는지 시각 검증할 때 유용
방법 4 — gstreamer로 한눈에 보기
ffprobe는 강력하지만 출력이 장황합니다. 메타데이터를 한 화면에 깔끔히 보고 싶으면 gstreamer의 gst-discoverer-1.0이 더 빠릅니다.
출력 예시
아래는 형식을 설명하기 위한 축약 예시입니다. 실제 필드와 값은 URI, 플러그인, GStreamer 버전에 따라 달라집니다.
한 번에 잡히는 것
| 정보 | 의미 |
|---|---|
| Container/Topology | 발견된 컨테이너 또는 스트림 구성 |
| 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 tools tutorial — gst-discoverer-1.0 — CLI의 역할과 출력 예시
- FFmpeg-devel — ffprobe frame PTS field rename —
pkt_pts_time에서pts_time으로 변경된 개발 이력 - RFC 7826 — Real-Time Streaming Protocol 2.0 — RTSP 시그널링 표준(원조 RFC 2326의 개정판)
- RFC 3550 — RTP: A Transport Protocol for Real-Time Applications — RTP 타임스탬프 의미와, B-frame 전송에서 타임스탬프가 비단조일 수 있다는 규격