PokeClip의 Live와 DVR을 나누고, 다시 이어 붙이는 조건
Live·DVR URL 분리, DB 기준의 S3 매니페스트 발행, 자동 핸드오프의 조건을 연결합니다. 완료한 발행·되감기 연동과 진행 중인 시간축 검증을 구분합니다.
문제의 시작부터 검증의 끝까지. 총 90편의 글.
Live·DVR URL 분리, DB 기준의 S3 매니페스트 발행, 자동 핸드오프의 조건을 연결합니다. 완료한 발행·되감기 연동과 진행 중인 시간축 검증을 구분합니다.
비정상 종료 시험에서 남은 컨테이너와 삭제된 비밀 파일이 충돌한 원인을 추적하고, 정리·마운트·재생성 조건을 함께 보완했습니다.
경로의 방송 ID와 playback 쿼리를 대조하고, 정규화·중복 파라미터 우회 요청이 상류에 도달하지 않도록 검증한 기록입니다.
읽기 전용 파일시스템에서 발생한 CertLoader 종료 교착을 재현하고, no-watch 경로의 완료 신호와 저장 성공·실패 회귀 테스트로 수정한 PR #6427 기록.
동시 개발 세션이 검사 상태를 공유하고 워크트리 편집을 놓치던 문제를 세션별 상태와 고정 루트로 개선한 기록.
두 서비스의 세 연결 풀에 흩어진 DB 접속 정책을 pgconf로 모으고, IAM 토큰 재발급과 verify-full을 실험 RDS에서 검증한 기록.
공통 DB 인증, nginx 요청 검증, DVR 발행과 복구, MediaMTX 기여를 만든 판단과 검증을 연결한 기술 글 모음.
채널별 기준선·고유 참여자·미디어 시간 보정을 검토한 연구 기록. 검증된 정확도 성과와 구분합니다.
원본을 보존하고 편집 의도를 데이터로 남기면서, 되감기 재포장과 최종 렌더를 구분한 PokeClip 설계 기록.
테스트 제외 실험과 정수 교차곱으로 80% 커버리지 게이트의 실제 차단과 경계값을 검증한 기록.
미디어와 무관한 PR의 CI 표시를 없애며 필수 검사 포기, 적용 순서, 롤백을 함께 다룬 PR #163.
말소리 검출과 마이크 선택을 구분하고, 클립 구간의 RMS·미리듣기로 분석 범위를 줄인 설계 판단.
방송 회차와 실제 미디어 경로를 분리하면서 기존 소비자의 조회와 배포 순서를 조율한 계약 변경.
nil·빈 슬라이스 비교와 중첩 기본값 공유를 함께 고친 MediaMTX #6205의 수정·회귀 테스트·호환성.
종료 요청과 실제 완료를 분리하고 갱신 중간을 통제해 20/20 실패→20/20 통과를 확인한 MediaMTX #6261.
MediaMTX #6154에서 런타임 먹서의 최소 조각 수를 공통 설정 검증에 맞추고 v1.21.0에 반영한 과정.
MediaMTX #6155에서 non-Windows 훅의 실패 종료 코드를 복구하고 재시작 설정별 관측 결과를 검증한 기록.
동시 훅 1·4·8·16개의 파일 로그 유실과 종료 꼬리, 별도 가드 v2 보존 실험을 구분한 로컬 관측 기록.
로거 재생성 전에 훅을 기다리는 접근의 가용성 비용과 교착 한계, 유지보수자의 대체 수정까지 남긴 기록.
기존 #5767의 기여를 보존하고 static source·offline reload 경계를 보완해 MediaMTX v1.21.0에 반영한 #6182.
13개 외부 명령 생성 지점을 대조해 빠진 실패 보고 7곳을 연결하고 통제한 19개 사건을 검증한 #6259.
MySQL 수동 스냅샷과 MongoDB 데이터 볼륨을 새 대상에 복원하고, 이전 데이터·새 쓰기를 검증하며 자동 백업의 권한 한계를 구분했습니다.
MySQL의 정상 TLS와 잘못된 호스트 거부를 짝으로 확인하고, MongoDB의 암호화·단일 primary 장애 전환을 별도 검증했습니다.
Semgrep 경로에서 잘못된 Java 구문이 ALLOW를 받은 반례를 유지하고, Tree-sitter 사전 검사로 SCAN_FAILED 경계를 보완했습니다.
수동 시작이 필요했던 초기 결과를 보완하고, 제품 API 배포 뒤 재부팅 복구와 DELETE 뒤 미부활을 두 번의 실제 EC2 재부팅으로 확인했습니다.
MediaMTX 포크 전환 때 설정·훅·녹화 입력의 9개 전제를 재검증하고, 제품 이미지와 테스트·라이브러리의 버전 기준을 함께 맞췄습니다.
기존 Dockerfile과 지원 스택 규칙을 먼저 사용하고, 실패할 때만 Claude를 호출하도록 이미지 생성과 인프라 판단의 범위를 제한했습니다.
저장된 배포 계획을 실제 AWS 자원에 연결하고, 기동·중지 시간 예산과 태스크·RDS 장애 뒤 복구를 별도 조건으로 확인했습니다.
사용자별 SRT passphrase 제안에서 기존 경로 암호의 호환성, 비밀값 처리, HTTP 성공 본문을 기다리는 비용을 함께 검증했습니다.
같은 녹화 파일 10개에서 init 분리와 tfdt 변경을 분리해 S3·CDN 직접 재생의 시간축 조건을 확인했습니다.
DB 장부·작성 권한·세대·S3 조건부 PUT을 나눈 설계와 실제 S3에서 재시작 전후 발행을 확인한 결과를 설명합니다.
FFmpeg 프로세스 호출을 상주 Go 재포장으로 바꾸고, 같은 입력·읽기·쓰기를 포함한 200회 대조와 동시성 비용을 확인했습니다.
완료 훅·파일 감시·재스캔을 나눠 설계하고, 정상과 알림 유실 네 조건에서 누락·중복과 마지막 파일 지연을 확인했습니다.
재생목록 창·실제 시청 지연·녹화 길이를 분리해 7조각·약 14초 창과 녹화 4초를 독립적으로 선택했습니다.
연속 확정 구간과 최근 1시간 창을 계산하고, 10만 행 원장의 초기 계산·tail 갱신·전체 렌더 비용을 구분했습니다.
원본·재생 조각·init의 독립 상태, MinIO 업로드 확인, 16MiB 입력 경계와 동시성 비용을 설명합니다.
이른 트랙 끝과 DISCONTINUITY 조합을 대조하고, 동일 init 조건에서 150조각·두 재접속 경계를 확인했습니다.
런타임 root 작업 없이 녹화와 사이드카 읽기를 유지하기 위해 이미지 단계에서 소유권을 확정했습니다.
시작점 BETWEEN을 실제 구간 겹침으로 정정하고, 계약 확정·팀원 구현·SQL 정확성 시험을 구분했습니다.
송출 키·녹화기 표식·논리 회차를 분리하고 ENDLIST 불변과 조건부 이전 회차 계승을 설계했습니다.
4초 객체라는 작업 단위를 기준으로 새 저장 계층 도입을 보류하고 PUT·GET·동시성의 실제 측정 범위를 나눴습니다.
테스트 종료 정리로 해결되지 않는 개발 DB 오염을 전용 DB와 명시적 소유 표식으로 차단한 과정입니다.
큐 접수·객체 생성·DB 완료를 나누고, 스위퍼의 접수 회차와 실제 PostgreSQL 상태 복구를 별도로 검증했습니다.
141.97초 목록이 80.03초로 인식되고 60초 탐색이 약 87초로 이동한 현상에서 재생 성공 조건을 다시 정했습니다.
본방 트랙 2의 440Hz 보존과 컬렉션별 복원을 대조했습니다. 자동 배정을 켜는 것만큼 끈 뒤의 상태도 확인한 기록입니다.
서버 오류를 없애도 검은 화면은 남았습니다. GAP 7개와 hls.js 초기화를 차례로 조사하고 실제 재생·되감기까지 확인했습니다.
401이 난 첫 시도에서 캐시 키와 원본 전달 정책을 분리했습니다. 원본 요청 1,254→28건과 97.95%의 분모, 403 검증을 함께 설명합니다.
편집 결과를 보존하면서 게시 결정은 방송자에게 남기기 위해 제작·직접 업로드·자동 업로드와 승인 대기를 나눈 설계입니다.
채팅 담당자가 바뀌면서 Node 자산 재사용과 이후 변경 검토 비용을 다시 비교해 Spring 전환을 선택했습니다.
편집 원본에는 오디오 6개를 보존하고 되감기는 1개로 단순화했습니다. 같은 방송의 소비 목적이 달라 처리 경로를 나눈 이유입니다.
OBS→SRT→녹화·재생을 확인한 뒤 직접 구현할 범위를 파일 색인·복구·시간축으로 좁혔습니다.
6트랙의 존재, 선택 추출, 실제 소리 보존을 나누어 검사했습니다. 무음 입력과 테스트 톤은 다른 것을 증명합니다.
로컬에서 x264 인코더 1개로 RTMP·SRT를 함께 보냈습니다. 시작 전 GOP 설정과 실행 중 거절, 종료 수명을 함께 다뤘습니다.
8자·10분·일회용 코드로 OBS를 연결하면서 시도 제한과 재사용 응답, 사용 기록의 보존 기간까지 정했습니다.
연결별 인증으로 전환하며 폐기한 path-reconciler 설계입니다. 부분 목록으로 삭제하지 않는 규칙과 인증 지연의 영향을 남겼습니다.
현재 PG의 passphrase를 Secrets Manager로 옮기는 전환을 준비 중입니다. 원문 사용과 키 대조를 나눈 이유 및 변경 조건을 설명합니다.
약 10개 소스를 직접 추적하는 대신 필요한 편집 조합을 OBS 6트랙으로 표현하고 전달·복원을 확인했습니다.
UDP 세션·진행 중 녹화·업로드 전 파일이 남는 미디어를 코어 API와 다르게 배치한 이유입니다.
방송 채팅 데이터로 하이라이트를 찾아내는 도구를 만들면서 부딪힌 문제들과 해결 과정, 그리고 한 번의 틀린 가설에 대한 기록이다.
지난 글에서 PokéClip의 v3 아키텍처를 소개했다. 영상(YOLO)·음성(Whisper)·채팅 세 신호를 병렬로 분석하고, 둘 이상이 임계치를 넘으면 하이라이트로 판정하는 "E 하이브리드" 구조였다.
이 글은 가상의 라이브 파이프라인을 구성해 책임과 비용을 비교하는 학습 노트다. 처음부터 등장하는 6.2초는 단계별 시간을 임의로 배정한 예시이며, 치지직이나 다른 서비스에서 측정한 시작 지연이 아니다.
HLS와 DASH는 서로 다른 매니페스트를 사용한다. 그렇다고 항상 영상을 두 번 인코딩해야 하는 것은 아니다. 같은 압축 비트스트림을 다른 컨테이너로 포장할 수 있기 때문이다.
NVENC의 비용을 x264와 비교하려면 같은 입력·출력 사다리·화질 목표에서 지속 처리량을 측정해야 한다. 동시 방송 1,000개와 5개 출력이 있다는 사실만으로 서버 대수를 결정할 수 없다. 5개 출력의 해상도와 처리 비용도 서로 다르다.
ABR은 같은 콘텐츠를 여러 해상도·비트레이트로 준비해 재생 조건에 맞게 선택하는 방식이다. 코덱까지 나누면 출력 개수가 더 늘어난다. 그러나 “Netflix는 모든 영화를 50번 인코딩한다”는 고정 숫자를 뒷받침할 근거는 없어 제거했다.
지금까지 H.264, AAC, H.265, Opus, AV1, VP9까지 코덱 6개를 봤다. 각각의 압축 원리와 라이센스 구조를 알아도, 실무 질문은 결국 하나로 모인다.
치지직, Twitch, Netflix의 라이브/VOD 인프라를 뜯어보면 공통점이 있다. 모두 FFmpeg 위에서 굴러간다. 그것도 인프라만이 아니다.
영상 코덱의 역사는 단순했다. ITU + ISO가 H.264 만들고, H.265 만들고. 모두 그걸 쓰면 됐다.
Discord 음성 채팅을 켜놓고 게임할 때, 통신사가 LTE 약전계에 진입해도 목소리가 거의 안 끊기는 경험. WhatsApp 보이스 메시지가 1990년대 모뎀 같은 인터넷에서도 들리는 경험. Zoom이 카페 와이파이에서도 화면은 깨져도 음성은 계속 들리는 경험.
H.265(HEVC)는 H.264보다 발전한 압축 도구를 제공한다. 실제 비트레이트 절감률과 인코딩 비용은 콘텐츠·설정·구현에 따라 달라진다. 보급률 1%나 항상 50% 절감처럼 단일 숫자로 일반화할 근거는 이 글에 없다.
영상 6Mbps와 오디오 128kbps를 가정하면 오디오 비중은 128 ÷ (6000 + 128) × 100 ≈ 2.09%다. 오버헤드를 제외한 예시이며, 고정적인 5%가 아니다.
1080p 60fps를 RGB 8비트 × 3채널, 패딩 없는 raw 영상으로 계산하면 1920 × 1080 × 3 × 60 = 373,248,000바이트/초, 즉 373.248MB/s다. 1시간은 약 1.344TB다. 여기서 MB·TB는 10진 단위다.
[지난 시리즈](../rtmp-still-alive/)에서 RTMP가 20년이 지나도 안 죽는 이유를 봤다. 도입 비용 0, 호환성 100%, 생태계 관성.
2010년만 해도 화상 통화는 무조건 별도 프로그램 설치가 필요했다. Skype, MSN Messenger, 시스코의 WebEx. 브라우저에서 카메라/마이크에 접근할 방법이 없었다. 자체 P2P 프로토콜은 폐쇄적이었고, 기업이 가입자를 가두는 도구였다.
올림픽이나 월드컵 중계를 보면 현장 카메라 → 본사 → 시청자로 신호가 흐른다. 옛날엔 위성/전용선이었다. 한 번 깔면 안정적이지만 한 번 쏘는 데 수천만 원.
라이브 방송을 보다가 채팅이 영상보다 빠른 경험, 게임 스포일러가 채팅으로 먼저 새는 경험, 다 해봤을 거다. 이게 일반 HLS의 18~25초 지연 때문이다.
기술 표준의 역사에서 자주 보이는 패턴이 있다. 기술적으로 더 우수한 게 시장에서 진다.
2009년 Apple이 한 결정이 라이브 스트리밍의 모든 걸 바꿨다.
OBS 켜본 사람은 다 알 거다. 방송 설정에 들어가면 "서버"와 "스트림 키"를 입력하라고 한다. 그 서버 주소가 rtmp://로 시작한다.
라이브 CDN의 전송량은 평균 동시 시청자 수, 비트레이트, 시간으로 추산할 수 있다. 청구 금액에는 실제 계약 단가와 과금 조건이 더 필요하다.
"왜 갑자기 영상이 멈추지?"
"이 영상 1080p인데 왜 깨져 보이지?"
치지직 입사를 목표로 스트리밍 기술을 공부 중이다. HLS, WebRTC 같은 프로토콜부터 본 게 아니라 더 아래 — "동영상이 도대체 뭐길래 압축이 필요한가", "TCP는 왜 라이브에 안 맞나" 같은 기초부터 다시 정리했다.
라이브 방송에서 하이라이트 클립을 자동으로 뽑아내는 시스템을 만들었다. 치지직 스트림을 실시간으로 받아서 재밌는 순간을 감지하고, 클립으로 저장하는 파이프라인이다.
치지직 스트림에서 오디오를 분리해서 분석하는 파이프라인을 짜야 했다. 처음엔 HLS로 받으면 되는 거 아닌가 싶었는데, 알고 보니 완전히 다른 문제였다.
--- 이력서

2009년 애플이 만들었다. 당시 웹 영상 재생은 Flash 기반이었는데 아이폰에 Flash가 없었다. 그래서 Flash 없이 HTTP만으로 스트리밍할 수 있는 방법으로 만든 게 HLS다.
본 문서는 GitHub Pages 블로그 자동화 시스템 초기 구축 이후 진행된 기능 고도화 작업에 대한 회고 보고서이다. 성공적으로 구현된 기능뿐 아니라 시도하였으나 실패하거나 한계에 부딪힌 사례도 함께 기록하여, 실제 개발 과정을 있는 그대로 남긴다.
- - -
카프카란 대용량 이벤트 처리 시스템 디스크에 순차적으로 저장하기 때문에 속도가 빠름 비동기 처리 백에서 작동 직접적으로 클라이언트와 소통하지 않음 이녀석의 역할을 단순히 데이터를 저장하는 역할 jvm에 접근하지 않고 os cache page를 사용하기 때문에 속도가 빠름 실시간성이 강함 메세지 묶음 처리 그러나 용도…