프로젝트에서 보기 →

모바일 스트리밍

시작일
종료일
수정일

모바일 요청 시 전체 파일 전송은 모바일에 데이터가 쌓이는 방식인거야? ALLOW_DOWNLOAD도 데이터가 쌓이는 방식인거야?

● 스트리밍 방식 설명

  1. "모바일 요청 시 전체 파일 전송"의 의미:

데이터가 쌓이지 않습니다!

  • 스트리밍 방식: 파일을 한 번에 다 보내지만, 브라우저가 받으면서 동시에 재생
  • 다운로드 아님: 파일이 저장되는 게 아니라 메모리 버퍼에서 재생하고 버림
  • 예시: YouTube처럼 영상을 보면서 버퍼링하는 방식

현재 문제:

  • Range Request (부분 요청): "0-1MB 주세요" → "1-2MB 주세요" → 중간에 끊김
  • 전체 파일 전송: "전체 파일 스트리밍" → 끊김 없이 재생
  1. ALLOW_DOWNLOAD의 의미:

이것도 데이터가 쌓이지 않습니다!

  • ALLOW_DOWNLOAD=true: 다운로드 버튼이 UI에 표시됨 (사용자가 원할 때만 다운로드)
  • ALLOW_DOWNLOAD=false: 다운로드 버튼 숨김
  • 스트리밍과는 별개: 재생은 여전히 스트리밍으로 작동
  1. 실제 데이터 사용량:

두 방식 모두 같은 양의 데이터 사용:

  • Range Request: 1MB + 1MB + 1MB + ... = 전체 파일 크기
  • 전체 스트리밍: 전체 파일 크기

차이점:

  • Range Request: 조각조각 받음 → 모바일에서 끊김 발생
  • 전체 스트리밍: 연속적으로 받음 → 안정적 재생
  1. 진짜 "데이터가 쌓이는" 경우:
  • 사용자가 다운로드 버튼 클릭 → 파일이 기기에 저장
  • 오프라인 재생 앱 사용 → 캐시에 저장
  • 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() 사용                                                             │
 │   - 모바일에 최적화된 스트리밍                                                                              │
 ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
← 프로젝트에서 보기