교회 방송실

프로프리젠터 슬라이드 라벨로 OBS 카메라 자동 전환하기 (플러그인 없이 무료)

꿈꾸는 조피디 2026. 10. 20. 08:00

세 줄 요약

  • 프로프리젠터 슬라이드 라벨에 OBS 장면 이름을 적어 두면, 그 슬라이드가 라이브될 때 OBS 카메라가 저절로 바뀝니다.
  • 플러그인도 MIDI도 없이, 프로프리젠터 API와 obs-websocket을 잇는 파이썬 스크립트 하나로 됩니다(무료).
  • 라벨 구간이 끝나면 원래 장면으로 돌아가고, 방송 담당이 손으로 바꾼 장면은 건드리지 않습니다.

작은 교회에서는 슬라이드를 넘기는 사람이 곧 생방송 담당입니다. 광고 시간이나 어린이 설교처럼 바쁜 구간에서는 한 손은 프로프리젠터에, 다른 손은 OBS에 있다 보니 카메라 전환을 놓치게 됩니다.

그래서 슬라이드가 카메라를 정하게 만들었습니다. 슬라이드에 "카메라 2"라고 표시해 두면, 그 슬라이드가 라이브되는 순간 OBS가 카메라 2로 넘어갑니다. 클로드(Claude)와 한자리에서 만들었고, 이 글에는 원리와 설정 방법, 코드를 담았습니다.

프로프리젠터 슬라이드 라벨로 OBS 카메라 자동 전환 대표 이미지

준비물

  • 프로프리젠터 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 플러그인을 쓰는 방법도 있지만, 프로그램을 둘 더 깔아야 하고 슬라이드마다 '전환'과 '되돌리기' 동작을 붙여야 합니다. 저는 그 대신 프로프리젠터가 스스로 알려 주는 "지금 라이브 슬라이드의 라벨"을 읽기로 했습니다.

슬라이드 라벨이 API와 웹소켓을 거쳐 OBS 장면을 바꾸는 흐름도

규칙: 슬라이드 라벨 = OBS 장면 이름

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

카메라 1부터 카메라 4까지 라벨을 붙인 프로프리젠터 슬라이드, 4번 슬라이드가 라이브

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

라벨 붙은 슬라이드가 라이브된 뒤 OBS에서 카메라 2 장면이 선택된 모습

잠시 뒤 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 자동 전환 시리즈

  1. 원리와 설정, 코드 (지금 읽는 글)
  2. 운영기: 처음에 실패한 것들과 매주 자동 실행하기