간트 차트에서 보기 →
작업

모바일 스트리밍

시작일
종료일

설명

> 모바일 요청 시 전체 파일 전송은 모바일에 데이터가 쌓이는 방식인거야? 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() 사용 │ │ - 모바일에 최적화된 스트리밍 │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
← 간트 차트에서 보기