포맷 변환
FlowPick은 스트리밍 다운로드 시 세그먼트를 병합하고 표준 포맷으로 변환할 수 있습니다. 본 문서는 지원하는 변환 경로, 기저 기술 원리, 출력 포맷 선택 및 성능 특징을 설명합니다.

전제 개념: 컨테이너 vs 코덱
포맷 변환을 이해하기 전, 혼동하기 쉬운 두 가지 개념을 구분해야 합니다:
| 개념 | 설명 | 유비 |
|---|---|---|
| 컨테이너(Container) | 파일의 "외피", 파일 확장자와 내부 데이터의 조직 방식 결정 | 택배 상자 — 포장의 외형 결정 |
| 코덱(Codec) | 오디오/비디오 데이터의 압축 알고리즘 | 상자에 들어있는 물건 |
FlowPick의 포맷 변환은 컨테이너만 변경하고 코덱은 변경하지 않습니다(즉 "리무싱" 또는 Remux). 이것은 다음을 의미합니다:
- 비디오 품질과 오디오 음질이 완전히 불변
- 변환 속도가 매우 빠름(재인코딩 불필요)
- 코덱 포맷 변경 불가능(예: H.265 → H.264)
변환 경로 개요
FlowPick은 다음 변환 경로를 지원하며, HLS와 DASH 두 가지 주류 스트리밍 프로토콜을 모두 포괄합니다:
| 소스 포맷 | 대상 포맷 | 변환 방식 | 속도 | 품질 | 전형적 시나리오 |
|---|---|---|---|---|---|
| HLS (TS 세그먼트) | MP4 | FFmpeg WASM 리무싱 | 중간 | 무손실 | 범용 재생, 비디오 편집 |
| HLS (TS 세그먼트) | TS | 바이너리 직접 연결 | 극히 빠름 | 무손실 | 속도 추구, 후속 처리 |
| DASH (MP4 세그먼트) | MP4 | FFmpeg WASM 리무싱 | 중간 | 무손실 | 범용 재생 |
| DASH (FMP4 세그먼트) | MP4 | FFmpeg WASM 재조립 | 중간 | 무손실 | 초기화 세그먼트 필요 |
| DASH (분리 오디오/비디오) | MP4 | FFmpeg WASM 병합 | 느림 | 무손실 | DASH 오디오/비디오 분리 스트림 |
"무손실"은 재인코딩하지 않음을 의미하며, 컨테이너 포맷만 변경. 비디오와 오디오의 코딩 데이터는 그대로 유지.
변환 기술 원리
FlowPick은 두 세트의 변환 엔진을 사용하며, 시나리오에 따라 최적 방안 자동 선택:
| 엔진 | 적용 시나리오 | 장점 | 단점 |
|---|---|---|---|
| FFmpeg WASM | TS→MP4 리무싱, DASH 병합, 오디오/비디오 병합 | 기능 완전, 복잡한 변환 지원 | WASM 파일 로딩 필요, 메모리 점유 높음 |
| TSToMP4Muxer | TS→MP4 스트리밍 리무싱 | 순수 JS 구현, FFmpeg 로딩 불필요, 메모리 효율 높음 | TS→MP4 단일 시나리오만 지원 |
TS 세그먼트 → MP4(FFmpeg WASM 리무싱)
HLS 스트림은 보통 MPEG-TS 컨테이너로 캡슐화됩니다. MP4로 변환 시, FlowPick은 FFmpeg WASM으로 다음 작업 수행:
입력: 여러 .ts 세그먼트 파일
처리 흐름:
- 모든 TS 세그먼트를 FFmpeg 가상 파일 시스템(WASM 메모리)에 기록
- concat 파일 목록 생성(
filelist.txt) - 리무싱 명령 실행:
ffmpeg -f concat -safe 0 -i filelist.txt \
-c copy \
-movflags +faststart \
-bsf:a aac_adtstoasc \
output.mp4
주요 파라미터 설명:
| 파라미터 | 역할 | 필요한 이유 |
|---|---|---|
-f concat | concat demuxer 사용하여 세그먼트 연결 | TS 세그먼트 직접 병합 불가, demuxer 처리 필요 |
-safe 0 | 임의 파일 경로 허용 | WASM 가상 파일 시스템의 경로 형식 특수 |
-c copy | 스트림 카피 모드, 재인코딩 안 함 | 무손실 변환 보장, 최고 속도 |
-movflags +faststart | moov atom을 파일 앞쪽으로 이동 | 네트워크 점진식 재생 지원, 다운로드 중 재생 가능 |
-bsf:a aac_adtstoasc | AAC 오디오 포맷 변환 | TS는 ADTS 포맷 사용, MP4는 ASC 포맷 필요 |
성능 특징:
- 인코딩/디코딩 불포함, CPU 점유 낮음
- 주요 시간 소모는 파일 I/O(WASM 가상 파일 시스템 읽기/쓰기)
- 처리 속도 약 50-100 MB/s(CPU 및 세그먼트 수량 따라 다름)
TS 세그먼트 → MP4(TSToMP4Muxer 스트리밍 리무싱)
대용량 파일 시나리오에서, FlowPick은 자체 개발한 TSToMP4Muxer를 우선 사용하여 스트리밍 리무싱을 수행하며, FFmpeg WASM의 메모리 제한 회피:
처리 흐름:
- 세그먼트별 TS 패킷(188바이트/패킷) 파싱, PES 데이터 추출
- 실시간으로 MP4 포맷 미디어 데이터로 변환
- Streams API 통해 디스크(FSA) 또는 메모리(Blob)로 스트리밍 쓰기
장점:
- 순수 JavaScript 구현, FFmpeg WASM 로딩 불필요(~30MB 메모리 절약)
- 스트리밍 처리, 메모리 점유와 파일 크기 무관
- File System Access API로 디스크 직접 쓰기 지원
단점:
- TS→MP4 단일 변환 경로만 지원
- 오디오/비디오 분리 병합 불지원
TSToMP4Muxer는 FlowPick의 핵심 혁신 중 하나입니다. 이것은 브라우저에서 GB급 비디오 파일 처리를 가능하게 하며, 메모리 오버플로우를 트리거하지 않습니다. 상세 내용은 다운로드 엔진를 참조하세요.TS 세그먼트 → TS(직접 연결)
가장 빠른 "변환" 방식 — 실제로 어떤 변환도 수행하지 않으며, TS 세그먼트를 순서대로 바이너리 연결만 합니다.
처리 흐름:
- 모든 TS 세그먼트를 메모리에 다운로드
- 순서대로
ArrayBuffer를 단일Uint8Array로 연결 - 파일에 직접 기록
장점:
- CPU 오버헤드 제로, 속도는 디스크 쓰기 속도에만 의존
- 완전 충실, 어떤 바이트도 수정하지 않음
- 후속 전문 도구 처리에 적합
단점:
- 파일 크기가 MP4보다 약간 클 수 있음(TS 컨테이너 오버헤드 약 5-15%)
- 일부 플레이어에서 TS 파일 지원이 MP4보다 약함
DASH 세그먼트 → MP4
DASH 스트림의 세그먼트는 보통 MP4 또는 FMP4 포맷입니다. 변환 과정:
표준 MP4 세그먼트:
ffmpeg -f concat -safe 0 -i filelist.txt \
-c copy \
-movflags +faststart \
output.mp4
FMP4 세그먼트(초기화 세그먼트 필요):
ffmpeg -i init.mp4 -i video.mp4 -i audio.mp4 \
-c:v copy -c:a copy \
-movflags +faststart \
output.mp4
오디오/비디오 분리 병합
DASH 스트림의 비디오와 오디오는 보통 서로 다른 AdaptationSet에 있습니다. 병합 과정:
ffmpeg -f concat -safe 0 -i video_list.txt \
-f concat -safe 0 -i audio_list.txt \
-c:v copy -c:a copy \
-movflags +faststart \
-bsf:a aac_adtstoasc \
output.mp4
출력 포맷 선택 가이드
MP4 (권장)
적용 시나리오:
- 다양한 플레이어와 기기에서 재생 필요
- 비디오 편집 소프트웨어(Premiere, DaVinci Resolve 등)로 가져오기 필요
- 비디오 플랫폼(YouTube, Bilibili 등)에 업로드 필요
- 최대 호환성 확보 필요
기술적 세부사항:
- 컨테이너: MPEG-4 Part 14
- MIME 타입:
video/mp4 - H.264/AVC, H.265/HEVC, AAC, MP3 등 코덱 지원
faststart플래그로 네트워크 점진식 재생 보장
TS
적용 시나리오:
- 최고 다운로드 속도 추구(리무싱 단계 생략)
- 후속 전문 도구(예: FFmpeg 명령줄)로 추가 처리 예정
- 원본 스트림이 이미 TS 포맷이며 변환 불필요
- 임시 저장, 후속 삭제 가능성 있음
기술적 세부사항:
- 컨테이너: MPEG Transport Stream
- MIME 타입:
video/mp2t - 각 세그먼트 독립적으로 재생 가능
- 파일 크기가 보통 MP4보다 5-15% 큼
포맷 선택 의사결정 나무
최대 호환성 필요? ──예──→ MP4 선택
│
아니오
│
▼
최고 속도 추구? ──예──→ TS 선택
│
아니오
│
▼
후속 FFmpeg 처리? ──예──→ TS 선택
│
아니오
│
▼
MP4 선택 (권장)
성능 비교
다음은 전형적 조건(Chrome 126, Intel i7-13700, 16GB RAM)에서의 실측 데이터입니다:
| 시나리오 | 세그먼트 수 | 총 크기 | TS 연결 | MP4 리무싱 (FFmpeg) | MP4 스트리밍 (Muxer) |
|---|---|---|---|---|---|
| 10분 1080p 비디오 | ~60 | ~200 MB | <1초 | ~3초 | ~2초 |
| 30분 1080p 비디오 | ~180 | ~600 MB | <1초 | ~8초 | ~5초 |
| 60분 4K 비디오 | ~360 | ~2.5 GB | ~2초 | ~30초 | ~18초 |
| 120분 4K 비디오 | ~720 | ~5 GB | ~4초 | ~60초 | ~35초 |
위 데이터는 추정치이며, 실제 성능은 CPU, 메모리, 브라우저 상태에 따라 다릅니다. 스트리밍 Muxer는 대용량 파일 처리 시 장점 더 현저.
변환 속도 영향 요소
| 요소 | 영향 정도 | 설명 |
|---|---|---|
| 세그먼트 수량 | 높음 | 세그먼트 많을수록 파일 I/O 횟수 증가 |
| 파일 총 크기 | 높음 | 읽기/쓰기 시간에 직접 영향 |
| CPU 성능 | 중간 | FFmpeg WASM이 CPU로 demux/mux 필요 |
| 메모리 크기 | 중간 | WASM 가상 파일 시스템에 충분한 메모리 필요 |
| 디스크 쓰기 속도 | 중간 | FSA 직접 쓰기 시 영향 큼 |
| 브라우저 버전 | 낮음 | 신버전 브라우저의 WASM 성능 우수 |
제한 사항 및 주의사항
코덱 포맷 제한
FlowPick의 변환은 컨테이너 포맷만 변경하며 재인코딩하지 않습니다. 이것은 다음을 의미합니다:
| 제한 | 설명 | 영향 |
|---|---|---|
| 코덱 변환 불가 | H.265 소스 출력도 H.265 | 구형 플레이어 지원 불가능 가능 |
| 비트레이트 변경 불가 | 출력 비트레이트는 소스와 동일 | 파일 크기 압축 불가 |
| 해상도 변경 불가 | 출력 해상도는 소스와 동일 | 화질 다운그레이드/업그레이드 불가 |
| 프레임 레이트 변경 불가 | 출력 프레임 레이트는 소스와 동일 | 60fps→30fps 변환 불가 |
| 비표준 샘플링 레이트 | 출력은 원본 유지 | 일부 플레이어에서 이상 가능 |
메모리 제한
FFmpeg WASM은 브라우저에서 실행되며 다음 제한 받음:
| 제한 항목 | 구체적 값 | 영향 |
|---|---|---|
| WASM 메모리 상한 | 4GB(32비트 주소 공간) | 초대형 파일 초과 가능성 |
| 가상 파일 시스템 | 메모리에 저장 | 파일 크기는 가용 메모리 제한 |
| 멀티스레드 모드 | SharedArrayBuffer 필요 | 올바른 COEP/COOP 헤더 필요 |
브라우저 호환성
| 기능 | Chrome | Edge | Firefox | Safari |
|---|---|---|---|---|
| FFmpeg WASM 싱글스레드 | 지원 | 지원 | 지원 | 부분 지원 |
| FFmpeg WASM 멀티스레드 | COEP/COOP 필요 | COEP/COOP 필요 | COEP/COOP 필요 | 미지원 |
| TSToMP4Muxer 스트리밍 | 지원 | 지원 | 지원 | 지원 |
| TS 직접 연결 | 지원 | 지원 | 지원 | 지원 |
명령줄 대안
명령줄에 익숙한 경우, 원본 FFmpeg을 사용하여 더 좋은 성능 얻을 수 있습니다:
# HLS → MP4
ffmpeg -i "https://example.com/playlist.m3u8" -c copy -bsf:a aac_adtstoasc output.mp4
# DASH → MP4
ffmpeg -i "https://example.com/manifest.mpd" -c copy output.mp4
# TS 세그먼트 병합
cat segment_*.ts > output.ts
# TS → MP4 리무싱
ffmpeg -i output.ts -c copy -bsf:a aac_adtstoasc output.mp4
원본 FFmpeg의 장점:
| 장점 | 설명 |
|---|---|
| 브라우저 메모리 제한 없음 | 시스템 전체 메모리 사용 가능 |
| 하드웨어 가속 인코딩/디코딩 | NVENC, QSV, VideoToolbox 등 지원 |
| 더 많은 포맷과 코덱 | 수백 가지 포맷과 코덱 지원 |
| 처리 속도 더 빠름 | 네이티브 코드 성능이 WASM보다 월등 |
| 재인코딩 지원 | 코덱 포맷, 비트레이트, 해상도 변경 가능 |
일반적인 문제
변환 후 MP4 파일이 TS보다 왜 작은가요?
TS 컨테이너의 188바이트 패킷마다 패킷 헤드 오버헤드가 있는 반면, MP4 컨테이너의 인덱스 구조는 더紧凑합니다. 리무싱 후 파일 크기는 보통 5-15% 감소하지만, 오디오/비디오 데이터는 완전히 불변입니다.
변환 시 품질 저하가 있나요?
없습니다. FlowPick은 -c copy(스트림 카피) 모드를 사용하여, 컨테이너 포맷만 변경하고 재인코딩하지 않습니다. 비디오와 오디오의 모든 바이트가 원본 그대로 보존됩니다.
일부 비디오 변환 후 재생 불가능한 이유?
가능한 원인:
- 원본 비디오가 플레이어가 지원하지 않는 코덱 사용(예: H.265)
- 변환 과정에서 세그먼트 누락으로 파일 불완전
- 원본 스트림 자체에 문제 존재