모바일 스트리밍
설명
> 모바일 요청 시 전체 파일 전송은 모바일에 데이터가 쌓이는 방식인거야?
ALLOW_DOWNLOAD도 데이터가 쌓이는 방식인거야?
● 스트리밍 방식 설명
1. "모바일 요청 시 전체 파일 전송"의 의미:
데이터가 쌓이지 않습니다!
- 스트리밍 방식: 파일을 한 번에 다 보내지만, 브라우저가 받으면서 동시에 재생
- 다운로드 아님: 파일이 저장되는 게 아니라 메모리 버퍼에서 재생하고 버림
- 예시: YouTube처럼 영상을 보면서 버퍼링하는 방식
현재 문제:
- Range Request (부분 요청): "0-1MB 주세요" → "1-2MB 주세요" → 중간에 끊김
- 전체 파일 전송: "전체 파일 스트리밍" → 끊김 없이 재생
2. ALLOW_DOWNLOAD의 의미:
이것도 데이터가 쌓이지 않습니다!
- ALLOW_DOWNLOAD=true: 다운로드 버튼이 UI에 표시됨 (사용자가 원할 때만 다운로드)
- ALLOW_DOWNLOAD=false: 다운로드 버튼 숨김
- 스트리밍과는 별개: 재생은 여전히 스트리밍으로 작동
3. 실제 데이터 사용량:
두 방식 모두 같은 양의 데이터 사용:
- Range Request: 1MB + 1MB + 1MB + ... = 전체 파일 크기
- 전체 스트리밍: 전체 파일 크기
차이점:
- Range Request: 조각조각 받음 → 모바일에서 끊김 발생
- 전체 스트리밍: 연속적으로 받음 → 안정적 재생
4. 진짜 "데이터가 쌓이는" 경우:
- 사용자가 다운로드 버튼 클릭 → 파일이 기기에 저장
- 오프라인 재생 앱 사용 → 캐시에 저장
- PWA 오프라인 모드 → 로컬 스토리지에 저장
현재 제안한 해결책은 모두 스트리밍 방식이므로 데이터가 기기에 쌓이지 않습니다!
╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ 노래가 끝까지 재생되지 않고 넘어가는 문제 원인 분석 │
│ │
│ 발견된 문제점들: │
│ │
│ 1. Range Request 처리 문제 │
│ - 같은 노래에 대해 206 (Partial Content) 응답이 여러 번 발생 │
│ - 예: 9fcfadca 파일이 4MB, 5MB, 6MB 등 다른 크기로 여러 번 전송 │
│ - 모바일 브라우저가 제대로 버퍼링하지 못하고 계속 새로운 Range 요청 │
│ 2. DaveRandom/Resume 라이브러리 사용 중 │
│ - 패치로 트랜스코딩은 비활성화했지만, StreamsLocalPath trait에서 여전히 DaveRandom/Resume 라이브러리 사용 │
│ - Safari의 특수한 Range 헤더 처리 (bytes=0-1 → bytes=0-)가 있지만 완벽하지 않음 │
│ 3. 모바일 브라우저의 스트리밍 버퍼 문제 │
│ - iOS Safari/Chrome이 부분적으로만 파일을 받고 재생 중단 │
│ - 200 OK 응답 (전체 파일)과 206 응답이 혼재 │
│ │
│ 근본 원인: │
│ │
│ DaveRandom/Resume 라이브러리가 모바일 브라우저의 Range Request를 제대로 처리하지 못함 │
│ │
│ 해결 방안: │
│ │
│ 방법 1: StreamsLocalPath 패치 │
│ │
│ - Range Request 처리 로직 수정 │
│ - 모바일 요청 시 전체 파일 전송 강제 │
│ │
│ 방법 2: 다른 스트리밍 어댑터 사용 │
│ │
│ - STREAMING_METHOD를 변경 │
│ - 직접 파일 읽기 방식으로 전환 │
│ │
│ 방법 3: Nginx 직접 서빙 │
│ │
│ - PHP를 거치지 않고 Nginx가 직접 파일 서빙 │
│ - 가장 안정적이지만 보안 문제 있을 수 있음 │
│ │
│ 구현 계획: │
│ │
│ 1. StreamsLocalPath.php 패치 │
│ - 모바일 User-Agent 감지 │
│ - 모바일인 경우 Range 헤더 무시하고 전체 파일 전송 │
│ 2. 또는 간단한 스트리밍 구현 │
│ - DaveRandom/Resume 대신 단순 readfile() 사용 │
│ - 모바일에 최적화된 스트리밍 │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯