IP카메라 CCTV 구현을 위한 필수 지식: RTSP와 FFmpeg 완벽 가이드

2025. 6. 17. 11:00·파이썬
반응형

IP카메라를 이용한 CCTV 시스템을 구축하기 전에는 영상 스트리밍의 핵심 기술들을 이해하는 것이 중요합니다. 이 글에서는 RTSP 프로토콜과 FFmpeg의 기본 개념부터 실제 활용 방법까지 상세히 알아보겠습니다.

RTSP란 무엇인가?

RTSP(Real Time Streaming Protocol)는 실시간 멀티미디어 데이터 스트리밍을 제어하기 위한 네트워크 프로토콜입니다. HTTP와 유사한 텍스트 기반 프로토콜로, 영상과 음성 스트림의 재생, 일시정지, 탐색 등을 제어할 수 있습니다.

RTSP의 주요 특징

프로토콜 구조:

  • 포트: 기본적으로 TCP 554번 포트 사용
  • 전송 방식: TCP 또는 UDP를 통한 데이터 전송
  • 세션 관리: 상태 기반(stateful) 프로토콜로 클라이언트와 서버 간 세션 유지

주요 메서드:

  • DESCRIBE: 미디어 정보 요청
  • SETUP: 전송 방법 설정
  • PLAY: 스트림 재생 시작
  • PAUSE: 스트림 일시정지
  • TEARDOWN: 세션 종료

 

RTSP URL 구조

RTSP URL은 다음과 같은 형식을 따릅니다:

rtsp://[username:password@]hostname[:port]/path

실제 IP카메라 URL 예시:

rtsp://admin:password123@192.168.1.100:554/stream1
rtsp://user:pass@camera.example.com/live/main
rtsp://192.168.0.50/video.sdp

RTSP와 다른 프로토콜의 차이점

특징 RTSP HTTP WebRTC HLS
실시간성 매우 높음 낮음 매우 높음 중간
지연시간 100-500ms 5-30초 50-200ms 5-15초
방화벽 통과 어려움 쉬움 쉬움 쉬움
브라우저 지원 제한적 완전 완전 완전
전용 플레이어 필요 예 아니오 아니오 아니오
적합한 용도 전문 보안 시스템 웹 스트리밍 화상회의 동영상 플랫폼

FFmpeg 소개

FFmpeg는 오디오, 비디오 및 기타 멀티미디어 파일과 스트림을 기록, 변환, 스트리밍하기 위한 완전하고 크로스 플랫폼 솔루션입니다. 거의 모든 멀티미디어 형식을 지원하며, 명령줄 도구와 프로그래밍 라이브러리를 모두 제공합니다.

FFmpeg의 구성 요소

핵심 라이브러리:

  • libavformat: 컨테이너 형식 처리 (MP4, AVI, MOV 등)
  • libavcodec: 코덱 처리 (H.264, H.265, VP9 등)
  • libavfilter: 오디오/비디오 필터링
  • libavutil: 공통 유틸리티 함수
  • libswscale: 이미지 스케일링 및 색상 공간 변환
  • libswresample: 오디오 리샘플링

주요 명령줄 도구:

  • ffmpeg: 파일 변환 및 스트리밍
  • ffplay: 멀티미디어 플레이어
  • ffprobe: 멀티미디어 파일 분석

FFmpeg 설치하기

Windows:

  1. FFmpeg 공식 웹사이트에서 Windows 빌드 다운로드
  2. 압축 해제 후 환경 변수 PATH에 bin 폴더 경로 추가

Ubuntu/Debian:

sudo apt update
sudo apt install ffmpeg

macOS (Homebrew):

brew install ffmpeg

설치 확인:

ffmpeg -version

RTSP 스트림 다루기

기본 RTSP 스트림 정보 확인

IP카메라의 RTSP 스트림 정보를 확인하는 방법:

# 스트림 정보 분석
ffprobe -i rtsp://admin:password@192.168.1.100:554/stream1

# 상세 정보 출력
ffprobe -v quiet -print_format json -show_format -show_streams \
  rtsp://admin:password@192.168.1.100:554/stream1

RTSP 스트림 재생하기

FFplay를 사용한 실시간 재생:

# 기본 재생
ffplay rtsp://192.168.1.100:554/stream1

# 낮은 지연시간으로 재생
ffplay -fflags nobuffer -flags low_delay -framedrop \
  rtsp://192.168.1.100:554/stream1

# UDP 전송 방식 사용
ffplay -rtsp_transport udp rtsp://192.168.1.100:554/stream1

RTSP 스트림 녹화하기

실시간 스트림을 파일로 저장:

# 기본 녹화 (코덱 복사로 빠른 처리)
ffmpeg -i rtsp://192.168.1.100:554/stream1 -c copy output.mp4

# 시간 제한 녹화 (10분)
ffmpeg -i rtsp://192.168.1.100:554/stream1 -c copy -t 600 recording.mp4

# 세그먼트 단위 녹화 (10분마다 새 파일)
ffmpeg -i rtsp://192.168.1.100:554/stream1 -c copy \
  -f segment -segment_time 600 -segment_format mp4 \
  recording_%03d.mp4

스트림 변환과 최적화

해상도 및 비트레이트 조정

고해상도 RTSP 스트림을 낮은 해상도로 변환:

# 1080p를 720p로 변환
ffmpeg -i rtsp://192.168.1.100:554/stream1 \
  -vf scale=1280:720 -c:v libx264 -b:v 2M -c:a aac output.mp4

# 모바일 최적화 (480p, 낮은 비트레이트)
ffmpeg -i rtsp://192.168.1.100:554/stream1 \
  -vf scale=854:480 -c:v libx264 -b:v 1M -c:a aac mobile.mp4

실시간 스트림 변환

RTSP를 다른 형식으로 실시간 변환:

# RTSP를 HLS로 변환 (웹 스트리밍용)
ffmpeg -i rtsp://192.168.1.100:554/stream1 \
  -c:v libx264 -c:a aac -f hls -hls_time 2 -hls_list_size 3 \
  -hls_flags delete_segments stream.m3u8

# RTSP를 WebM으로 변환
ffmpeg -i rtsp://192.168.1.100:554/stream1 \
  -c:v libvp9 -c:a libopus -f webm output.webm

다중 출력 생성

하나의 RTSP 입력으로 여러 해상도 출력 생성:

ffmpeg -i rtsp://192.168.1.100:554/stream1 \
  -filter_complex \
  "[0:v]split=3[v1][v2][v3]; \
   [v1]scale=1920:1080[v1out]; \
   [v2]scale=1280:720[v2out]; \
   [v3]scale=854:480[v3out]" \
  -map "[v1out]" -c:v libx264 -b:v 5M high.mp4 \
  -map "[v2out]" -c:v libx264 -b:v 3M medium.mp4 \
  -map "[v3out]" -c:v libx264 -b:v 1M low.mp4

실용적인 IP카메라 CCTV 구현 사례

1. 실시간 모니터링 시스템

여러 IP카메라를 동시에 모니터링하는 스크립트:

#!/bin/bash

# 4개 카메라 동시 재생
ffplay -i rtsp://192.168.1.101:554/stream1 -x 640 -y 480 &
ffplay -i rtsp://192.168.1.102:554/stream1 -x 640 -y 480 &
ffplay -i rtsp://192.168.1.103:554/stream1 -x 640 -y 480 &
ffplay -i rtsp://192.168.1.104:554/stream1 -x 640 -y 480 &

wait

2. 움직임 감지 녹화

움직임이 감지될 때만 녹화하는 시스템:

# 움직임 감지 필터를 사용한 녹화
ffmpeg -i rtsp://192.168.1.100:554/stream1 \
  -vf "select='gt(scene,0.3)'" -vsync vfr \
  -c:v libx264 motion_detected.mp4

3. 웹 브라우저용 스트림 변환

RTSP를 웹 브라우저에서 재생 가능한 HLS로 변환:

# HLS 스트림 생성 (실시간)
ffmpeg -i rtsp://192.168.1.100:554/stream1 \
  -c:v libx264 -preset ultrafast -tune zerolatency \
  -c:a aac -ar 44100 -b:a 64k \
  -f hls -hls_time 2 -hls_list_size 3 \
  -hls_flags delete_segments+omit_endlist \
  /var/www/html/stream/index.m3u8

HTML에서 재생:

<!DOCTYPE html>
<html>
<head>
    <title>Live CCTV Stream</title>
    <script src="https://vjs.zencdn.net/7.18.1/video.min.js"></script>
    <link href="https://vjs.zencdn.net/7.18.1/video-js.css" rel="stylesheet">
</head>
<body>
    <video-js id="live-stream" class="vjs-default-skin" controls preload="auto" 
             width="1280" height="720" data-setup="{}">
        <source src="/stream/index.m3u8" type="application/x-mpegURL">
    </video-js>

    <script>
        var player = videojs('live-stream');
    </script>
</body>
</html>

4. 스케줄 기반 녹화 시스템

특정 시간대에만 녹화하는 시스템:

#!/bin/bash

# 스케줄 기반 녹화 스크립트
CAMERA_URL="rtsp://admin:password@192.168.1.100:554/stream1"
OUTPUT_DIR="/var/recordings"
DATE=$(date +%Y%m%d_%H%M%S)

# 평일 오전 9시-오후 6시만 녹화
HOUR=$(date +%H)
DAY=$(date +%u)  # 1=월요일, 7=일요일

if [ $DAY -le 5 ] && [ $HOUR -ge 9 ] && [ $HOUR -lt 18 ]; then
    echo "업무 시간 녹화 시작: $DATE"
    ffmpeg -i $CAMERA_URL -c copy \
           -f segment -segment_time 3600 -segment_format mp4 \
           "$OUTPUT_DIR/work_${DATE}_%03d.mp4"
else
    echo "업무 시간 외: 녹화하지 않음"
fi

성능 최적화 및 문제 해결

지연시간 최소화

실시간 모니터링에서 지연시간을 줄이는 방법:

# 최소 지연시간 설정
ffmpeg -fflags nobuffer -flags low_delay -avioflags direct \
  -i rtsp://192.168.1.100:554/stream1 \
  -c:v libx264 -preset ultrafast -tune zerolatency \
  -f flv rtmp://streaming-server/live/stream

CPU 사용량 최적화

하드웨어 가속을 활용한 인코딩:

# NVIDIA GPU 하드웨어 가속 (NVENC)
ffmpeg -hwaccel cuda -i rtsp://192.168.1.100:554/stream1 \
  -c:v h264_nvenc -preset fast output.mp4

# Intel Quick Sync Video 하드웨어 가속
ffmpeg -hwaccel qsv -i rtsp://192.168.1.100:554/stream1 \
  -c:v h264_qsv -preset fast output.mp4

네트워크 이슈 해결

연결 불안정 문제 해결:

# 재연결 옵션 추가
ffmpeg -reconnect 1 -reconnect_at_eof 1 -reconnect_streamed 1 \
  -i rtsp://192.168.1.100:554/stream1 \
  -c copy output.mp4

# 타임아웃 설정
ffmpeg -timeout 10000000 -i rtsp://192.168.1.100:554/stream1 \
  -c copy output.mp4

프로그래밍 언어별 통합

Python에서 FFmpeg 사용

import subprocess
import threading
import time

class RTSPRecorder:
    def __init__(self, rtsp_url, output_path):
        self.rtsp_url = rtsp_url
        self.output_path = output_path
        self.process = None
        self.recording = False

    def start_recording(self):
        if self.recording:
            return

        cmd = [
            'ffmpeg',
            '-i', self.rtsp_url,
            '-c', 'copy',
            '-f', 'segment',
            '-segment_time', '3600',  # 1시간마다 새 파일
            '-segment_format', 'mp4',
            f'{self.output_path}_%03d.mp4'
        ]

        self.process = subprocess.Popen(cmd)
        self.recording = True
        print(f"녹화 시작: {self.rtsp_url}")

    def stop_recording(self):
        if self.process and self.recording:
            self.process.terminate()
            self.process.wait()
            self.recording = False
            print("녹화 중지")

# 사용 예시
recorder = RTSPRecorder(
    'rtsp://admin:password@192.168.1.100:554/stream1',
    '/recordings/camera1'
)
recorder.start_recording()

# 10분 후 중지
time.sleep(600)
recorder.stop_recording()

Node.js에서 FFmpeg 사용

const { spawn } = require('child_process');

class RTSPStreamer {
    constructor(rtspUrl, outputPath) {
        this.rtspUrl = rtspUrl;
        this.outputPath = outputPath;
        this.ffmpegProcess = null;
    }

    startStreaming() {
        const args = [
            '-i', this.rtspUrl,
            '-c:v', 'libx264',
            '-preset', 'ultrafast',
            '-f', 'hls',
            '-hls_time', '2',
            '-hls_list_size', '3',
            '-hls_flags', 'delete_segments',
            this.outputPath
        ];

        this.ffmpegProcess = spawn('ffmpeg', args);

        this.ffmpegProcess.stdout.on('data', (data) => {
            console.log(`stdout: ${data}`);
        });

        this.ffmpegProcess.stderr.on('data', (data) => {
            console.log(`stderr: ${data}`);
        });

        this.ffmpegProcess.on('close', (code) => {
            console.log(`FFmpeg process exited with code ${code}`);
        });
    }

    stopStreaming() {
        if (this.ffmpegProcess) {
            this.ffmpegProcess.kill('SIGTERM');
        }
    }
}

// 사용 예시
const streamer = new RTSPStreamer(
    'rtsp://admin:password@192.168.1.100:554/stream1',
    '/var/www/html/stream/index.m3u8'
);
streamer.startStreaming();

보안 고려사항

RTSP 스트림 보안

IP카메라 RTSP 스트림을 보호하는 방법:

  1. 인증 설정: 강력한 사용자명/비밀번호 사용
  2. 네트워크 격리: VLAN을 통한 카메라 네트워크 분리
  3. VPN 터널링: 원격 접근 시 VPN 사용
  4. 암호화: RTSPS(RTSP over SSL/TLS) 사용
# RTSPS 스트림 접근
ffmpeg -i rtsps://admin:password@192.168.1.100:322/stream1 \
  -c copy secure_output.mp4

접근 제어

웹 스트리밍 시 접근 제어 구현:

# Nginx 설정 예시
location /stream/ {
    auth_basic "Restricted Content";
    auth_basic_user_file /etc/nginx/.htpasswd;

    add_header Cache-Control no-cache;
    add_header Access-Control-Allow-Origin *;
}

결론

IP카메라를 활용한 CCTV 시스템 구현에는 RTSP 프로토콜과 FFmpeg에 대한 이해가 필수적입니다. RTSP는 실시간 스트리밍에 특화된 프로토콜로 낮은 지연시간을 제공하며, FFmpeg는 이러한 스트림을 다양한 형태로 변환하고 처리할 수 있는 강력한 도구입니다.

실제 CCTV 시스템을 구축할 때는 요구사항에 따라 적절한 해상도, 비트레이트, 저장 방식을 선택해야 하며, 네트워크 환경과 하드웨어 성능을 고려한 최적화가 중요합니다. 또한 보안 측면에서 인증, 암호화, 접근 제어 등을 철저히 구현해야 합니다.

이러한 기본 지식을 바탕으로 Python, Node.js 등 다양한 프로그래밍 언어와 웹 기술을 활용하여 사용자 친화적인 CCTV 인터페이스를 구현할 수 있습니다. 움직임 감지, 알림 시스템, 원격 모니터링 등의 고급 기능도 FFmpeg의 필터와 외부 라이브러리를 조합하여 구현 가능합니다.

저작자표시 비영리 변경금지 (새창열림)

'파이썬' 카테고리의 다른 글

Python 3.11 ~ 3.13: 개발자를 위한 핵심 업데이트 총정리  (0) 2025.07.12
Pydantic ConfigDict: 모델 동작 커스터마이징 가이드  (0) 2025.03.21
KoNLPy: 한국어 자연어 처리 라이브러리  (1) 2025.02.28
Pydantic Field : 데이터 유효성 검사  (0) 2025.02.06
[Web API] URL 파라미터 데이터 전송  (1) 2025.01.23
'파이썬' 카테고리의 다른 글
  • Python 3.11 ~ 3.13: 개발자를 위한 핵심 업데이트 총정리
  • Pydantic ConfigDict: 모델 동작 커스터마이징 가이드
  • KoNLPy: 한국어 자연어 처리 라이브러리
  • Pydantic Field : 데이터 유효성 검사
코샵
코샵
나의 코딩 일기장
    반응형
  • 코샵
    끄적끄적 코딩 공방
    코샵
    • 분류 전체보기 (725)
      • 스마트팜 (0)
      • 상품 추천 (223)
      • MongoDB (4)
      • 하드웨어 (17)
      • 일기장 (4)
      • 파이썬 (130)
        • Basic (41)
        • OpenCV (8)
        • Pandas (15)
        • PyQT (3)
        • SBC(Single Board Computer) (1)
        • 크롤링 (14)
        • Fast API (29)
        • Package (6)
      • Unity (138)
        • Tip (41)
        • Project (1)
        • Design Pattern (8)
        • Firebase (6)
        • Asset (2)
      • Linux (4)
      • C# (97)
        • Algorithm (11)
        • Window (7)
      • TypeScript (51)
        • CSS (10)
      • Git (11)
      • SQL (5)
      • Flutter (10)
        • Tip (1)
      • System (1)
      • BaekJoon (6)
      • Portfolio (2)
      • MacOS (1)
      • 유틸리티 (1)
      • 서비스 (6)
      • 자동화 (3)
      • Hobby (10)
        • 물생활 (10)
        • 식집사 (0)
  • 인기 글

  • 태그

    상품 리뷰 크롤링
    list
    codingcommunity
    쇼핑몰리뷰
    라떼우유
    programmerlife
    카페24리뷰이관
    셀레니움
    믈레코비타멸균우유
    ipcamera
    codingtips
    리뷰관리
    cv2
    파이썬
    rtsp
    스마트스토어리뷰
    스크립트 실행
    스크립트 실행 순서
    유니티
    리스트
    Python
    긴유통기한우유
    C#
    카페24리뷰
    programming101
    리뷰이관
    unity
    learntocode
    appdevelopment
    devlife
  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
코샵
IP카메라 CCTV 구현을 위한 필수 지식: RTSP와 FFmpeg 완벽 가이드
상단으로

티스토리툴바