포맷 변환

FlowPick 포맷 변환의 완전한 기술 가이드 — TS/MP4 리무싱 원리, FFmpeg WASM 워크플로우, 출력 포맷 선택 및 성능 비교.

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


전제 개념: 컨테이너 vs 코덱

포맷 변환을 이해하기 전, 혼동하기 쉬운 두 가지 개념을 구분해야 합니다:

개념설명유비
컨테이너(Container)파일의 "외피", 파일 확장자와 내부 데이터의 조직 방식 결정택배 상자 — 포장의 외형 결정
코덱(Codec)오디오/비디오 데이터의 압축 알고리즘상자에 들어있는 물건

FlowPick의 포맷 변환은 컨테이너만 변경하고 코덱은 변경하지 않습니다(즉 "리무싱" 또는 Remux). 이것은 다음을 의미합니다:

  • 비디오 품질과 오디오 음질이 완전히 불변
  • 변환 속도가 매우 빠름(재인코딩 불필요)
  • 코덱 포맷 변경 불가능(예: H.265 → H.264)
코덱 포맷 변경(예: 비디오 압축, 코덱 변환)이 필요한 경우, 원본 FFmpeg 명령줄 도구를 사용하세요. 명령줄 대안 참조.

변환 경로 개요

FlowPick은 다음 변환 경로를 지원하며, HLS와 DASH 두 가지 주류 스트리밍 프로토콜을 모두 포괄합니다:

소스 포맷대상 포맷변환 방식속도품질전형적 시나리오
HLS (TS 세그먼트)MP4FFmpeg WASM 리무싱중간무손실범용 재생, 비디오 편집
HLS (TS 세그먼트)TS바이너리 직접 연결극히 빠름무손실속도 추구, 후속 처리
DASH (MP4 세그먼트)MP4FFmpeg WASM 리무싱중간무손실범용 재생
DASH (FMP4 세그먼트)MP4FFmpeg WASM 재조립중간무손실초기화 세그먼트 필요
DASH (분리 오디오/비디오)MP4FFmpeg WASM 병합느림무손실DASH 오디오/비디오 분리 스트림

"무손실"은 재인코딩하지 않음을 의미하며, 컨테이너 포맷만 변경. 비디오와 오디오의 코딩 데이터는 그대로 유지.


변환 기술 원리

FlowPick은 두 세트의 변환 엔진을 사용하며, 시나리오에 따라 최적 방안 자동 선택:

엔진적용 시나리오장점단점
FFmpeg WASMTS→MP4 리무싱, DASH 병합, 오디오/비디오 병합기능 완전, 복잡한 변환 지원WASM 파일 로딩 필요, 메모리 점유 높음
TSToMP4MuxerTS→MP4 스트리밍 리무싱순수 JS 구현, FFmpeg 로딩 불필요, 메모리 효율 높음TS→MP4 단일 시나리오만 지원

TS 세그먼트 → MP4(FFmpeg WASM 리무싱)

HLS 스트림은 보통 MPEG-TS 컨테이너로 캡슐화됩니다. MP4로 변환 시, FlowPick은 FFmpeg WASM으로 다음 작업 수행:

입력: 여러 .ts 세그먼트 파일

처리 흐름:

  1. 모든 TS 세그먼트를 FFmpeg 가상 파일 시스템(WASM 메모리)에 기록
  2. concat 파일 목록 생성(filelist.txt)
  3. 리무싱 명령 실행:
ffmpeg -f concat -safe 0 -i filelist.txt \
  -c copy \
  -movflags +faststart \
  -bsf:a aac_adtstoasc \
  output.mp4

주요 파라미터 설명:

파라미터역할필요한 이유
-f concatconcat demuxer 사용하여 세그먼트 연결TS 세그먼트 직접 병합 불가, demuxer 처리 필요
-safe 0임의 파일 경로 허용WASM 가상 파일 시스템의 경로 형식 특수
-c copy스트림 카피 모드, 재인코딩 안 함무손실 변환 보장, 최고 속도
-movflags +faststartmoov atom을 파일 앞쪽으로 이동네트워크 점진식 재생 지원, 다운로드 중 재생 가능
-bsf:a aac_adtstoascAAC 오디오 포맷 변환TS는 ADTS 포맷 사용, MP4는 ASC 포맷 필요

성능 특징:

  • 인코딩/디코딩 불포함, CPU 점유 낮음
  • 주요 시간 소모는 파일 I/O(WASM 가상 파일 시스템 읽기/쓰기)
  • 처리 속도 약 50-100 MB/s(CPU 및 세그먼트 수량 따라 다름)

TS 세그먼트 → MP4(TSToMP4Muxer 스트리밍 리무싱)

대용량 파일 시나리오에서, FlowPick은 자체 개발한 TSToMP4Muxer를 우선 사용하여 스트리밍 리무싱을 수행하며, FFmpeg WASM의 메모리 제한 회피:

처리 흐름:

  1. 세그먼트별 TS 패킷(188바이트/패킷) 파싱, PES 데이터 추출
  2. 실시간으로 MP4 포맷 미디어 데이터로 변환
  3. Streams API 통해 디스크(FSA) 또는 메모리(Blob)로 스트리밍 쓰기

장점:

  • 순수 JavaScript 구현, FFmpeg WASM 로딩 불필요(~30MB 메모리 절약)
  • 스트리밍 처리, 메모리 점유와 파일 크기 무관
  • File System Access API로 디스크 직접 쓰기 지원

단점:

  • TS→MP4 단일 변환 경로만 지원
  • 오디오/비디오 분리 병합 불지원
TSToMP4Muxer는 FlowPick의 핵심 혁신 중 하나입니다. 이것은 브라우저에서 GB급 비디오 파일 처리를 가능하게 하며, 메모리 오버플로우를 트리거하지 않습니다. 상세 내용은 다운로드 엔진를 참조하세요.

TS 세그먼트 → TS(직접 연결)

가장 빠른 "변환" 방식 — 실제로 어떤 변환도 수행하지 않으며, TS 세그먼트를 순서대로 바이너리 연결만 합니다.

처리 흐름:

  1. 모든 TS 세그먼트를 메모리에 다운로드
  2. 순서대로 ArrayBuffer를 단일 Uint8Array로 연결
  3. 파일에 직접 기록

장점:

  • 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
DASH 오디오/비디오 분리는 DASH 프로토콜의 중요한 특징으로, 플랫폼이 비디오와 오디오에 독립적인 비트레이트 옵션 제공을 허용합니다. FlowPick은 자동으로 분리된 오디오/비디오 트랙을 감지하고 병합합니다. 상세 내용은 비디오 스니핑 — DASH 스트림을 참조하세요.

출력 포맷 선택 가이드

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 헤더 필요
2GB 초과 파일의 경우, FlowPick은 자동으로 스트리밍 Muxer 또는 TS 직접 연결 모드를 사용하여 FFmpeg WASM의 메모리 제한 회피합니다. 상세 내용은 다운로드 엔진 — 메모리 관리를 참조하세요.

브라우저 호환성

기능ChromeEdgeFirefoxSafari
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)
  • 변환 과정에서 세그먼트 누락으로 파일 불완전
  • 원본 스트림 자체에 문제 존재
재생 문제 발생 시, 일반적인 문제 해결알려진 문제를 확인하세요.

관련 문서