格式轉換
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)
- 轉換過程中分片缺失導致檔案不完整
- 來源串流本身存在問題