IP 카메라 영상을 모아 다시 내보내거나, 파일을 RTSP 로 흘려 시험용 스트림을 만들 때 쓴다. 구성 요소가 둘로 나뉜다는 점을 먼저 짚어야 한다.
| 역할 | 도구 |
|---|---|
| RTSP 서버 — 클라이언트의 요청을 받아 스트림을 나눠 준다 | MediaMTX, GStreamer rtsp-server, Live555 |
| 퍼블리셔 — 서버로 영상을 밀어 넣는다 | FFmpeg, GStreamer, IP 카메라 |
FFmpeg 하나로는 RTSP 서버가 되지 않는다. 다음 명령이 서버를 띄운다고 설명된 문서를 종종 보는데 틀렸다.
# 이것은 서버를 띄우는 명령이 아니다
ffmpeg -re -i video.mp4 -c copy -f rtsp rtsp://localhost:8554/live
-f rtsp 는 이미 떠 있는 RTSP 서버로 밀어 넣는(publish) 출력 형식이다. 받아 줄 서버가 없으면 Connection refused 로 끝난다.
rtsp-simple-server 가 이름을 바꾼 것이다. 단일 실행 파일이고 설정 파일 하나로 동작해 가장 다루기 쉽다. RTSP 외에 RTMP, HLS, WebRTC, SRT 도 같은 스트림으로 내보낸다.
tar xzf mediamtx_*_linux_amd64.tar.gz
sudo install -m 755 mediamtx /usr/local/bin/
sudo mkdir -p /etc/mediamtx
sudo cp mediamtx.yml /etc/mediamtx/
내려받을 파일은 GitHub 릴리스 페이지에서 현재 버전을 확인해 고른다. 옛 이름(rtsp-simple-server)으로 검색하면 배포가 멈춘 저장소로 가게 된다.
# /etc/mediamtx/mediamtx.yml
rtspAddress: :8554
rtmpAddress: :1935
hlsAddress: :8888
paths:
live:
# 퍼블리셔가 밀어 넣기를 기다린다
source: publisher
cam1:
# 카메라 스트림을 당겨 온다
source: rtsp://192.168.0.50:554/stream1
sourceOnDemand: yes
sourceOnDemand: yes 를 주면 보는 사람이 있을 때만 원본에 접속한다. 카메라가 많을 때 대역폭과 카메라 부하를 줄인다.
서비스로 등록한다.
[Unit]
Description=MediaMTX
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=mediamtx
ExecStart=/usr/local/bin/mediamtx /etc/mediamtx/mediamtx.yml
Restart=on-failure
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now mediamtx
sudo firewall-cmd --permanent --add-port=8554/tcp
sudo firewall-cmd --reload
시험용 스트림을 만들 때 쓴다.
ffmpeg -re -stream_loop -1 -i /srv/video/sample.mp4 \
-c copy -f rtsp -rtsp_transport tcp rtsp://127.0.0.1:8554/live
| 옵션 | 뜻 |
|---|---|
-re |
파일을 실시간 속도로 읽는다. 없으면 최대 속도로 밀어 넣어 스트림이 아니게 된다 |
-stream_loop -1 |
끝나면 처음부터 무한 반복 |
-c copy |
재인코딩하지 않는다. CPU 를 거의 쓰지 않는다 |
-rtsp_transport tcp |
RTP 를 TCP 로 실어 보낸다. 방화벽 환경에서 안정적 |
-c copy 는 원본 코덱을 그대로 쓰므로 빠르지만, RTSP 가 다루지 못하는 코덱이면 실패한다. H.264 + AAC 가 아니면 변환한다.
ffmpeg -re -i input.mkv -c:v libx264 -preset veryfast -tune zerolatency \
-c:a aac -f rtsp rtsp://127.0.0.1:8554/live
ffprobe -rtsp_transport tcp rtsp://192.168.0.10:8554/live
ffplay -rtsp_transport tcp rtsp://192.168.0.10:8554/live
VLC 에서는 미디어 → 네트워크 스트림 열기 에 주소를 넣는다. 지연이 크면 VLC 의 네트워크 캐싱 값을 줄인다.
RTSP 는 제어 채널(기본 554 또는 8554/TCP)과 미디어 채널이 분리돼 있다. 기본 동작에서 미디어는 협상으로 정한 임의의 UDP 포트로 흐르므로 제어 포트만 방화벽에서 열면 화면이 나오지 않는다. 연결은 되는데 영상이 오지 않는 전형적인 증상이다.
해결은 둘 중 하나다.
-rtsp_transport tcp 를 써서 미디어를 제어 연결에 실어 보낸다. 방화벽·NAT 환경에서는 사실상 이쪽이 표준이다rtpAddress: :8000
rtcpAddress: :8001
services:
mediamtx:
image: bluenviron/mediamtx:latest
network_mode: host
volumes:
- ./mediamtx.yml:/mediamtx.yml:ro
restart: unless-stopped
RTSP 는 협상한 포트로 미디어가 흐르므로 포트 매핑보다 network_mode: host 가 문제를 덜 만든다. 격리가 필요하면 전송을 TCP 로 고정하고 그 포트만 매핑한다.