방송자는 이미 OBS로 본방을 인코딩하고 있습니다. 같은 화면을 PokeClip에도 보내기 위해 영상 인코더를 하나 더 실행하기보다, 본방이 만든 압축 프레임을 SRT 출력에도 전달하기로 했습니다. 하지만 인코더 하나를 공유하면 두 출력이 설정과 수명도 함께 나눠 갖습니다. 추가 출력을 만드는 것만으로 끝나는 작업은 아니었습니다.
저는 전체 송출 구조와 미디어 입력 계약을 정하고 OBS 담당 팀원과 통합 조건을 검토했습니다. PR #179의 C++ 플러그인 구현과 실측은 jaehwan-space의 작업입니다. 팀의 로컬 실험에서는 x264 인스턴스 1개로 RTMP·SRT 녹화를 함께 생성했고, 그 과정에서 시작 전에 적용할 설정과 시작을 거절해야 할 조건을 구분했습니다.
범용 플러그인 전체보다 출력에 필요한 부분을 가져왔습니다
본방 출력의 비디오·오디오 인코더를 참조하면서 SRT/MPEG-TS 출력을 추가하는 구조를 선택했습니다. 범용 다중 송출 플러그인에는 여러 타깃의 URL과 키를 직접 편집하는 UI가 있지만, PokeClip은 페어링으로 계정을 연결하려 했습니다. 따라서 설정 화면 전체 대신 출력 생성·인코더 참조·해제에 필요한 부분을 이식했습니다.
| 대안 | 장점 | 남는 문제 |
|---|---|---|
| 별도 영상 인코더 | 출력 설정을 독립적으로 변경 | 같은 화면을 다시 인코딩 |
| 범용 다중 송출 플러그인 전체 사용 | 기존 기능을 폭넓게 활용 | 필요 없는 URL·키 편집 UI까지 노출 |
| 본방 인코더 공유 + 필요한 출력 수명 이식 | 추가 영상 인코더 없이 동시 송출 | 본방 시작·실패·종료에 수명을 맞춰야 함 |
공유를 선택한 뒤에는 서버가 기대하는 키프레임 간격을 언제 적용할지가 문제가 됐습니다. 이미 실행 중인 인코더를 두 출력이 쓰고 있다면 한 출력만을 위해 설정을 바꿀 수 없기 때문입니다.
GOP 2초를 맞추되, 실행 중인 인코더는 조용히 바꾸지 않았습니다
서버 입력 계약은 GOP 2초였습니다. 팀은 OBS 소스를 대조해 프로필 설정 적용 뒤이면서 실제 인코더 생성 전인 STREAMING_STARTING에서 값을 맞췄습니다. 이벤트 이름만 보고 고른 것이 아니라 실제 설정 순서를 확인한 결과입니다.
이미 녹화가 본방 인코더를 공유하며 실행 중인 경우에는 이 순서를 사용할 수 없습니다. 해당 x264 경로는 실행 중 GOP 변경을 받아들이지 않았습니다. 이때는 다른 규격으로 송출을 계속하기보다 비호환 활성 인코더를 거절하도록 했습니다. 서버에서 녹화 조각 길이가 달라진 이유를 뒤늦게 찾는 대신, 입력을 시작할 때 맞지 않는 조건을 알리는 쪽을 택했습니다.
종료도 공유한 수명에 맞춰야 했습니다. 본방 실패·정지와 OBS 종료 때 부가 SRT 출력이 남지 않도록 인코더 참조와 서비스 해제 순서를 다뤘습니다. OBS 플러그인 API뿐 아니라 실제 버전의 동작을 확인해야 하는 부분이었습니다.
비밀 전달과 UI는 송출 코어에서 분리했습니다
passphrase는 SRT URL 안에 넣지 않고 별도 서비스 필드로 전달하도록 했습니다. URL이 로그에 남을 때 비밀까지 함께 남는 경로를 피하기 위한 선택입니다. 브라우저 독과 플러그인은 루프백 브리지로 연결하고 Host·Origin·토큰·본문 크기를 검사하며, 독이 없으면 최소 Qt 패널을 사용할 수 있도록 구성했습니다.
다만 당시 개발 Auth 주소는 HTTP였고, 로컬 MediaMTX에 passphrase가 설정되지 않아 송출 실측은 send_passphrase=false 조건이었습니다. 별도 필드로 전달하는 구조와 계정별 암호가 켜진 전체 수신 경로는 다른 검증 대상입니다. HTTPS와 계정별 암호 연동은 후속 조건으로 남았습니다.
인코더 수와 실제 수신 산출물을 함께 확인했습니다
팀의 측정 환경은 macOS OBS 32.2.2, x264 1080p30, 로컬 Compose MediaMTX와 로컬 Auth였습니다. 본방 목적지도 실제 치지직이 아닌 로컬 RTMP였습니다.
| 확인 대상 | PR의 관측 |
|---|---|
| 두 출력 | RTMP·SRT 녹화가 함께 생성 |
| 영상 인코더 | x264 인스턴스 1개 |
| 수신 키프레임 간격 | 약 2초 |
| 수신 조각 길이 | 약 4.06~4.07초, 오디오 포함 |
| 종료·재연결 | 미디어 재시작 후 재연결, 본방 실패·정지와 동반 종료, 송출 중 OBS 종료 확인 |
이 실험은 추가 영상 인코더 없이 두 출력이 만들어지는 것과 그 수명을 대조했습니다. CPU·GPU 절감률은 측정하지 않았으며 Windows 실기와 실제 치지직 동시 송출 검증도 포함하지 않았습니다.
처음에는 인코딩을 한 번 덜 하는 선택이었지만, 구현에서 더 까다로웠던 것은 두 출력이 같은 인코더를 사용해도 되는 시점이었습니다. 시작 전 설정을 맞추고, 맞출 수 없는 상태에서는 거절하며, 본방이 끝날 때 함께 정리해야 공유가 성립했습니다. 정상 출력뿐 아니라 시작하지 말아야 할 조건까지 입력 계약에 포함한 이유입니다.