피드로 돌아가기
Dev.toBackend
원문 읽기
ffmpeg 기반 3단계 스트리밍 전략으로 이종 코덱 비디오 재생 최적화
JS video player with ffmpeg HTTP streaming in PHP: state machine, watchdog, subtitles
AI 요약
Context
브라우저 네이티브 플레이어의 제한적인 코덱 지원으로 인해 MKV, HEVC 등 고해상도/특수 포맷 파일 재생 시 무응답 현상 발생. 클라이언트의 단순 시도-오류 방식은 네트워크 지연 시 오탐률이 높고 사용자 경험을 저해하는 한계 존재.
Technical Solution
- 코덱 특성에 따른 3가지 스트리밍 모드(Native, Remux, Transcode)를 설계하여 리소스 소비 최적화
- Remux 모드에서 Fragmented MP4 설정을 통한 moov atom 대기 시간 제거 및 실시간 파이프 스트리밍 구현
- PHP Semaphore를 활용해 ffmpeg 동시 실행 수를 4개로 제한하여 CPU 자원 고갈 방지
- connection_aborted() 체크와 register_shutdown_function을 결합한 고립 프로세스(Orphan Process) 제거 메커니즘 구축
- SQLite 기반의 (path, mtime) 캐시 레이어를 도입하여 ffprobe의 분석 지연 시간을 12초에서 100ms로 단축
- iOS Safari의 Range Request 오동작 방지를 위해 Accept-Ranges: none 헤더 적용
실천 포인트
1. 스트리밍 파이프라인 설계 시 Fragmented MP4의 moov atom 처리 여부 확인
2. 외부 프로세스 호출 시 세마포어를 통한 동시성 제어 및 종료 핸들러 강제 적용
3. 비디오 메타데이터 추출 등 고비용 작업에 대해 파일 수정 시간(mtime) 기반 캐싱 전략 검토
4. iOS Safari 등 특정 브라우저의 Byte-range 요청 특성에 따른 응답 헤더 제어