송출 장비 설정
push 스트림은 카메라·NVR·인코더·중계기가 CastLine 으로 영상을 보내는 방식입니다. 공유기 뒤에 있어도 별도 포트포워딩이 필요 없습니다(CCTV 연결 방식).
아래 예시의 <slug>(고객사 주소 이름), <code>(스트림 코드), pk_…(송출 키)는 콘솔 스트림의 송출 설정 탭에 표시되는 값으로 바꿉니다. 송출 키 원문은 소유자가 열람을 눌러야 보이며, 재발급하면 이전 키로 보내던 장비는 끊깁니다.
송출 키는 비밀번호와 같습니다
송출 키를 아는 사람은 그 스트림에 영상을 보낼 수 있습니다. 메신저·게시판에 올리지 말고, 유출이 의심되면 콘솔에서 재발급하세요.
OBS Studio — RTMP
설정 → 방송 → 서비스 사용자 지정을 고르고 서버와 스트림 키를 넣습니다.
rtmp://castline.dotoritos.net:1935/c/<slug><code>?token=pk_…서버·키를 한 줄로 받는 장비(NVR 의 “RTMP 주소” 칸 등)에는 전체 URL 을 넣습니다.
rtmp://castline.dotoritos.net:1935/c/<slug>/<code>?token=pk_…- 권장: 키프레임 간격 1~2초, 영상 H.264, 음성 AAC.
- RTMP 로는 H.265 를 보낼 수 없는 장비가 많습니다. H.265 카메라는 아래 SRT 를 쓰세요.
OBS Studio 30 이상 — WebRTC (WHIP)
설정 → 방송 → 서비스 WHIP 을 고르고 서버와 Bearer Token 을 넣습니다.
https://rtc.castline.dotoritos.net/c/<slug>/<code>/whippk_…WHIP 은 지연이 가장 짧습니다. OBS 는 WHIP 음성을 Opus 로 보내며, 웹 플레이어(WebRTC·HLS)에서 그대로 재생됩니다.
SRT (카메라·인코더·ffmpeg)
SRT 는 손실이 있는 회선에서 안정적이고 H.265 도 그대로 보낼 수 있습니다. 장비의 SRT 주소 칸에 넣습니다.
srt://castline.dotoritos.net:8890?streamid=publish:c/<slug>/<code>:castline:pk_…&pkt_size=1316스트림에 SRT passphrase 를 설정했다면 끝에 &passphrase= 를 붙입니다(10~79자).
srt://castline.dotoritos.net:8890?streamid=publish:c/<slug>/<code>:castline:pk_…&pkt_size=1316&passphrase=<passphrase>장비에 “Stream ID” 칸이 따로 있으면 streamid= 뒤의 값(publish:c/<slug>/<code>:castline:pk_…)만 그 칸에 넣고, 주소 칸에는 srt://호스트:포트 만 넣습니다.
RTSP 로 보내기
카메라의 “RTSP 푸시” 기능이나 ffmpeg 에서 씁니다. TCP 전송만 지원합니다.
rtsp://castline.dotoritos.net:8554/c/<slug>/<code>?token=pk_…ffmpeg -re -i input.mp4 -c copy -f rtsp -rtsp_transport tcp "rtsp://castline.dotoritos.net:8554/c/<slug>/<code>?token=pk_…"현장 중계기 (ffmpeg)
카메라가 RTSP·HTTP 로만 영상을 줄 때, 같은 LAN 의 PC·미니PC·라즈베리파이에서 영상을 받아 CastLine 으로 보냅니다. 카메라 비밀번호는 중계기에만 있고 CastLine 에 저장되지 않습니다.
| 카메라 출력 | 방법 |
|---|---|
| RTSP (H.264) | 트랜스코딩 없이 그대로 RTMP 로 |
| RTSP (H.265) | 그대로 SRT 로 (-f mpegts) |
HTTP MJPEG (/video.mjpg 등) | 중계기에서 H.264 로 인코딩 (720p 기준 라즈베리파이 4 이상 권장, 음성 없음) |
| HTTP-FLV (H.264) | 트랜스코딩 없이 그대로 |
| JPEG 스냅샷만 | 초당 1장 수준의 저속 영상. 실시간 영상이 필요하면 카메라의 RTSP 출력을 쓰세요 |
ffmpeg -rtsp_transport tcp -i "rtsp://<계정>:<비밀번호>@<카메라>/<경로>" -c copy -f flv "rtmp://castline.dotoritos.net:1935/c/<slug>/<code>?token=pk_…"ffmpeg -rtsp_transport tcp -i "rtsp://<계정>:<비밀번호>@<카메라>/<경로>" -c copy -f mpegts "srt://castline.dotoritos.net:8890?streamid=publish:c/<slug>/<code>:castline:pk_…&pkt_size=1316"ffmpeg -f mjpeg -i "http://<계정>:<비밀번호>@<카메라>/video.mjpg" -c:v libx264 -preset veryfast -tune zerolatency -pix_fmt yuv420p -g 50 -an -f flv "rtmp://castline.dotoritos.net:1935/c/<slug>/<code>?token=pk_…"ffmpeg -i "http://<카메라>/live.flv" -c copy -f flv "rtmp://castline.dotoritos.net:1935/c/<slug>/<code>?token=pk_…"while true; do curl -s "http://<카메라>/snapshot.jpg"; sleep 1; done | ffmpeg -f image2pipe -framerate 1 -i - -c:v libx264 -r 5 -g 10 -pix_fmt yuv420p -f flv "rtmp://castline.dotoritos.net:1935/c/<slug>/<code>?token=pk_…"현장 중계기 (MediaMTX)
카메라가 여러 대이거나 중계기에서도 영상을 확인하고 싶으면 중계기에 MediaMTX 를 설치하고, 카메라가 연결되면 CastLine 으로 보내도록 설정합니다.
# 현장 중계기(PC·미니PC·라즈베리파이)의 mediamtx.yml 일부
# 카메라마다 path 하나. 카메라 비밀번호는 이 파일에만 있고 CastLine 에는 저장되지 않습니다.
# ffmpeg 가 설치되어 있어야 합니다(도커 이미지 bluenviron/mediamtx:1.21.1-ffmpeg 에는 포함).
paths:
cam1:
source: rtsp://<계정>:<비밀번호>@<카메라>/<경로>
rtspTransport: tcp
sourceOnDemand: no
runOnReady: >
ffmpeg -rtsp_transport tcp -i rtsp://127.0.0.1:8554/cam1
-c copy -f flv "rtmp://castline.dotoritos.net:1935/c/<slug>/<code>?token=pk_…"
runOnReadyRestart: yes카메라마다 CastLine 에 push 스트림을 하나씩 만들고, cam1·cam2 … path 마다 그 스트림의 <code> 와 송출 키를 넣습니다.
부팅 시 자동 실행·끊기면 재시작
중계기는 전원이 나갔다 들어오거나 회선이 끊겨도 스스로 다시 보내야 합니다. 리눅스(라즈베리파이 포함)는 systemd 서비스로 등록합니다.
[Unit]
Description=CastLine 중계 (cam1)
After=network-online.target
Wants=network-online.target
[Service]
ExecStart=/usr/bin/ffmpeg -rtsp_transport tcp -i "rtsp://<계정>:<비밀번호>@<카메라>/<경로>" -c copy -f flv "rtmp://castline.dotoritos.net:1935/c/<slug>/<code>?token=pk_…"
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
# 적용: sudo systemctl daemon-reload && sudo systemctl enable --now castline-cam1Windows 중계기는 작업 스케줄러에서 “컴퓨터 시작 시” 실행 + “실패하면 다시 시작”을 설정합니다.
잘 안 될 때
- 콘솔 스트림 상세의 이벤트에 송출 거부(
stream.publish_denied)가 보이면 송출 키·<code>가 틀렸거나 등급이 그 입력 프로토콜을 허용하지 않는 경우입니다. - 스트림이 꺼짐 상태면 송출이 거부됩니다. 콘솔에서 먼저 켜세요.
- 웹 플레이어에서 소리가 안 나면 재배포 URL 사용의 코덱 호환 표를 확인하세요.