格式轉換

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 concat使用 concat demuxer 拼接分片TS 分片無法直接合併,需要 demuxer 處理
-safe 0允許任意檔案路徑WASM 虛擬檔案系統的路徑格式特殊
-c copy串流拷貝模式,不重新編碼保證無損轉換,速度最快
-movflags +faststart將 moov 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)
  • 轉換過程中分片缺失導致檔案不完整
  • 來源串流本身存在問題
如果遇到播放問題,請檢視 常見問題排查已知問題

相關文件