프로프리젠터 슬라이드 라벨로 OBS 카메라 자동 전환하기 (플러그인 없이 무료)
세 줄 요약
- 프로프리젠터 슬라이드 라벨에 OBS 장면 이름을 적어 두면, 그 슬라이드가 라이브될 때 OBS 카메라가 저절로 바뀝니다.
- 플러그인도 MIDI도 없이, 프로프리젠터 API와 obs-websocket을 잇는 파이썬 스크립트 하나로 됩니다(무료).
- 라벨 구간이 끝나면 원래 장면으로 돌아가고, 방송 담당이 손으로 바꾼 장면은 건드리지 않습니다.
작은 교회에서는 슬라이드를 넘기는 사람이 곧 생방송 담당입니다. 광고 시간이나 어린이 설교처럼 바쁜 구간에서는 한 손은 프로프리젠터에, 다른 손은 OBS에 있다 보니 카메라 전환을 놓치게 됩니다.
그래서 슬라이드가 카메라를 정하게 만들었습니다. 슬라이드에 "카메라 2"라고 표시해 두면, 그 슬라이드가 라이브되는 순간 OBS가 카메라 2로 넘어갑니다. 클로드(Claude)와 한자리에서 만들었고, 이 글에는 원리와 설정 방법, 코드를 담았습니다.

준비물
- 프로프리젠터 21(저는 21.3.1)과 OBS 28 이상(저는 30.0.2). 같은 윈도우 PC에서 실행
- 파이썬 3와 라이브러리 두 개:
requests,obsws-python - OBS에 카메라별 장면(저는
카메라 1~카메라 4)
왜 플러그인 없이 스크립트인가
프로프리젠터의 '커뮤니케이션' 동작은 MIDI와 TCP/UDP만 지원하고, OBS는 원격 명령을 웹소켓으로 받습니다. 둘 사이에 뭔가 끼어야 합니다. 가상 MIDI 케이블(loopMIDI)과 Advanced Scene Switcher 플러그인을 쓰는 방법도 있지만, 프로그램을 둘 더 깔아야 하고 슬라이드마다 '전환'과 '되돌리기' 동작을 붙여야 합니다. 저는 그 대신 프로프리젠터가 스스로 알려 주는 "지금 라이브 슬라이드의 라벨"을 읽기로 했습니다.

규칙: 슬라이드 라벨 = OBS 장면 이름
슬라이드 우클릭 → 라벨에서 OBS 장면 이름을 그대로 적습니다. 라벨은 조작 화면에만 보이고 스크린이나 방송에는 나가지 않습니다.

카메라 이름으로 라벨을 붙인 시험 슬라이드. '카메라 2' 라벨의 4번 슬라이드가 라이브(주황색)

잠시 뒤 OBS에서 '카메라 2' 장면이 송출됩니다
스크립트는 네 가지 규칙을 따릅니다.
- 라벨 = 장면 이름: 그 슬라이드가 라이브될 때마다 전환
- 라벨 구간이 끝나면: 구간 시작 전 장면으로 복귀. 어린이 설교가 끝나면 알아서 메인 화면으로
- 방송 담당이 손으로 바꿨으면: 건드리지 않음
- 장면 이름이 아닌 라벨(예:
Veil_03_4K): 무시
설정 순서
1. 프로프리젠터 네트워크 API 켜기
설정 → 네트워크에서 네트워크를 켜고 포트 번호를 적어 둡니다(저는 1234). 같은 PC 브라우저에서 아래 주소를 열어 ProPresenter 21.x가 들어간 글이 나오면 성공입니다.
http://127.0.0.1:1234/version
2. OBS 웹소켓 서버 켜기
OBS에서 도구 → WebSocket 서버 설정을 열고 WebSocket 서버 활성화 항목에 체크한 뒤 비밀번호를 정합니다. 기본 포트는 4455입니다.
3. 스크립트 실행
명령 프롬프트에서 pip install requests obsws-python을 실행합니다. 아래 코드를 pp_obs_label_switcher.py로 저장하고 OBS 비밀번호를 넣은 뒤 python pp_obs_label_switcher.py로 실행합니다. 예배 중에는 창을 열어 둡니다.
"""프로프리젠터 슬라이드 라벨로 OBS 장면을 바꾼다.
라벨이 OBS 장면 이름과 같은 슬라이드가 라이브되면 OBS를 그 장면으로 바꾼다.
라벨 붙은 슬라이드 구간이 끝나고 라벨 없는 슬라이드가 나오면, 구간 시작 전
장면으로 되돌린다. 단, 그사이 누가 손으로 장면을 바꿨으면 그대로 둔다.
2026-09-27 시험: 프로프리젠터 21.3.1(윈도우), OBS 30.0.2 + obs-websocket 5.3.4,
파이썬 3.12. 설치: pip install requests obsws-python
"""
import time
import requests
import obsws_python as obs
PP = "http://127.0.0.1:1234" # 프로프리젠터 > 설정 > 네트워크
OBS_HOST, OBS_PORT = "127.0.0.1", 4455 # OBS > 도구 > WebSocket 서버 설정
OBS_PASSWORD = "여기에-OBS-웹소켓-비밀번호"
def pp(path):
return requests.get(PP + path, timeout=2).json()
def live_slide():
"""화면에 떠 있는 슬라이드의 (키, 라벨). 라이브가 없으면 (None, "")."""
live = pp("/v1/presentation/slide_index").get("presentation_index")
if not live:
return None, ""
uuid, index = live["presentation_id"]["uuid"], live["index"]
pres = pp(f"/v1/presentation/{uuid}")["presentation"]
slides = [s for g in pres["groups"] for s in g["slides"]]
label = slides[index].get("label", "") if index < len(slides) else ""
return (uuid, index), (label or "").strip()
def program_scene(cl):
r = cl.get_current_program_scene()
return getattr(r, "current_program_scene_name", None) or getattr(r, "scene_name", None)
def main():
cl = obs.ReqClient(host=OBS_HOST, port=OBS_PORT, password=OBS_PASSWORD)
last_key, in_run, restore, last_set = None, False, None, None
while True:
key, label = live_slide()
if key != last_key: # 다른 슬라이드가 라이브됨
last_key = key
scenes = {s["sceneName"] for s in cl.get_scene_list().scenes}
current = program_scene(cl)
if label in scenes: # 라벨이 장면 이름
if not in_run:
restore, in_run = current, True
if current != label:
cl.set_current_program_scene(label)
print(f"라벨 '{label}' -> 장면 '{label}'")
last_set = label
elif in_run: # 라벨 구간 뒤 첫 라벨 없는 슬라이드
if current == last_set and restore != current:
cl.set_current_program_scene(restore)
print(f"라벨 구간 끝 -> '{restore}'(으)로 복귀")
in_run = False
time.sleep(0.25)
if __name__ == "__main__":
main()
1초에 네 번 라이브 슬라이드를 확인하고, 다른 슬라이드가 라이브됐을 때만 움직입니다.
4. 슬라이드에 라벨 붙이기
장면 이름을 띄어쓰기까지 똑같이 입력합니다. "카메라 2"와 "카메라2"는 다른 장면입니다. 자주 쓰는 라벨은 설정 → 슬라이드 라벨에 등록해 두면 고르기만 하면 됩니다.
꼭 지킬 것 하나: 방송 장비는 내부망에
프로프리젠터 API는 비밀번호 없이 응답합니다. 같은 네트워크의 누구든 슬라이드 정보를 읽을 수 있다는 뜻입니다. 방송·찬양 PC는 손님용 와이파이와 꼭 분리해 두세요.
처음에 실패했던 부분과 매주 자동으로 돌아가게 만든 방법은 시리즈 2편에 적었습니다.
프로프리젠터 → OBS 자동 전환 시리즈
- 원리와 설정, 코드 (지금 읽는 글)
- 운영기: 처음에 실패한 것들과 매주 자동 실행하기