已知限制與注意事項
本文件彙整了 FlowPick 目前版本的技術限制和已知問題。了解這些限制有助於避免在使用過程中遇到意外情況。
限制等級說明
本文件中的每個限制按影響程度分為三個等級:
| 等級 | 圖示 | 含義 | 範例 |
|---|---|---|---|
| 硬限制 | 🔴 | 無法繞過,目前版本不支援 | DRM 保護內容、Blob 模式 1.5GB 上限 |
| 軟限制 | 🟡 | 存在限制但有替代方案 | CORS 跨域(可用擴充功能繞過)、FFmpeg 效能(可選 TS 輸出) |
| 注意事項 | 🔵 | 不影響功能但需了解 | 首次載入較慢、分片 URL 可能過期 |
檔案大小限制
Blob 模式硬限制
當瀏覽器不支援 File System Access API 或 StreamSaver.js 時,FlowPick 降級為 Blob 模式寫入檔案。此模式存在硬性大小限制:
| 限制類型 | 閾值 | 行為 |
|---|---|---|
| 警告閾值 | 800MB | 主控台輸出警告,介面顯示提示 |
| 硬限制 | 1.5GB | 拒絕下載,提示使用者切換瀏覽器 |
原因:Blob 模式需要將整個檔案載入到記憶體中,超過 1.5GB 可能導致瀏覽器崩潰或頁面無回應。
解決方案:使用 Chrome 86+ 或 Edge 86+,它們支援 File System Access API,可以串流寫入任意大小的檔案。
記憶體壓力
即使使用串流寫入,以下因素仍會消耗記憶體:
- 並行下載的分片資料(每個分片通常 1-10MB)
- FFmpeg WASM 執行時記憶體(約 200-400MB)
- 頁面 UI 和其他元件
建議:
- 下載超大檔案(>5GB)時,將並行執行緒數降至 1-2
- 關閉其他佔用記憶體的分頁
- 避免同時執行多個 FFmpeg 轉封裝任務
串流媒體協定限制
DRM 保護內容
FlowPick 無法處理以下類型的受保護內容:
| 保護技術 | 常見平台 | 狀態 |
|---|---|---|
| Widevine | Netflix, Disney+ | 不支援 |
| PlayReady | 部分 Windows 平台 | 不支援 |
| FairPlay | Apple TV+ | 不支援 |
| ClearKey | 部分測試串流 | 不支援 |
偵測方式:DASH 清單中出現 <ContentProtection> 標籤時,下載器會明確提示不支援。
為什麼無法支援 DRM?
DRM 系統的核心是內容解密模組(CDM),它是瀏覽器內建的閉源二進位元件。CDM 與作業系統和硬體深度繫結,負責解密受保護的內容並將解碼後的幀直接輸出到顯示卡,應用層無法攔截或讀取解密後的資料。這是 DRM 系統的設計目標——確保內容在從解密到顯示的整個鏈路中不被截獲。
AES-128 加密
FlowPick 支援 HLS 的 AES-128 分片加密,但有以下限制:
- 僅支援
METHOD=AES-128,不支援 SAMPLE-AES - 金鑰檔案必須可透過 HTTP(S) 直接存取
- 不支援需要 Cookie 認證的金鑰 URL(線上工具模式)
直播串流
FlowPick 主要面向點播(VOD)內容設計:
- 直播 HLS 串流可以下載已快取的分片,但無法取得未來的分片
- 直播串流的分片列表會持續更新,下載器不會自動追蹤新增分片
- 建議等待直播結束後再下載完整回放
直播串流下載的實際效果:
直播進行中(已播放 30 分鐘):
M3U8 清單包含最近 ~30 秒的分片
→ 下載器只能取得這 30 秒的內容
→ 無法取得之前或之後的分片
直播結束後:
M3U8 清單包含完整分片列表
→ 下載器可以取得全部內容
→ 等同於點播下載
分離音影片串流
部分 DASH 串流將影片和音訊分離為獨立的 AdaptationSet:
- 下載器會分別列出影片串流和音訊串流
- 需要手動選擇匹配的影片和音訊串流
- 合併需要 FFmpeg WASM,耗時較長
- 如果音影片時長不一致,合併結果可能出現音畫不同步
瀏覽器限制
File System Access API
| 瀏覽器 | 支援狀態 |
|---|---|
| Chrome 86+ | 完整支援 |
| Edge 86+ | 完整支援 |
| Firefox | 不支援 |
| Safari | 不支援 |
在不支援的瀏覽器中,所有下載使用 Blob 模式,受 1.5GB 大小限制。
SharedArrayBuffer
FFmpeg WASM 多執行緒模式需要 SharedArrayBuffer,這要求網站設定以下 HTTP 回應標頭:
Cross-Origin-Opener-Policy: same-origin
Cross-Origin-Embedder-Policy: require-corp
如果這些標頭未設定,FFmpeg 自動降級為單執行緒模式,合併速度降低約 40-60%。
Service Worker
StreamSaver.js 依賴 Service Worker。以下情況會導致 StreamSaver 不可用:
- 瀏覽器隱私模式(部分瀏覽器限制 Service Worker)
- 企業策略停用 Service Worker
- 網站未正確部署
mitm.html和streamsaver-sw.js
網路限制
CORS 跨域限制
線上工具模式(/m3u8-downloader、/dash-downloader)受瀏覽器同源策略限制:
- 如果串流媒體伺服器未設定
Access-Control-Allow-Origin回應標頭,請求會被阻止 - 部分 CDN 會檢查
Referer或Origin請求標頭 - 擴充功能版本不受此限制,因為它使用擴充功能權限發起請求
CORS 錯誤的技術原理:
線上工具(flowpick.app)請求 CDN(cdn.example.com):
瀏覽器發送請求 → CDN 回傳分片資料
↓
瀏覽器檢查回應標頭:
Access-Control-Allow-Origin 是否包含 flowpick.app?
↓
否 → 瀏覽器阻止 JavaScript 讀取回應
是 → 正常讀取
擴充功能版本:
擴充功能透過 chrome.webRequest / chrome.fetch 發起請求
→ 不受同源策略限制
→ 可以讀取任何來源的回應
請求頻率限制
部分 CDN 會對高頻請求進行限流:
- 並行執行緒數過高可能觸發 429(Too Many Requests)錯誤
- 建議將並行數控制在 4 以內
- 如果遇到限流,降低並行數後重試
分片 URL 過期
部分串流媒體服務的分片 URL 包含時效性權杖:
- 權杖過期後分片無法下載
- 過期時間通常為幾分鐘到幾小時
- 建議在取得清單後盡快開始下載
- 如果下載中斷時間過長,可能需要重新取得清單
典型過期場景:
| 服務類型 | 典型過期時間 | 建議 |
|---|---|---|
| 線上課程平台 | 2-4 小時 | 取得清單後立即下載 |
| 直播回放 | 30 分鐘 - 2 小時 | 盡快完成,避免中斷 |
| 短影片平台 | 5-15 分鐘 | 單次下載通常足夠 |
| 付費串流媒體 | 1-5 分鐘 | 極短視窗,需快速完成 |
格式轉換限制
FFmpeg WASM 效能
FFmpeg 在瀏覽器中以 WebAssembly 執行,效能遠低於原生版本:
| 操作 | 原生 FFmpeg | FFmpeg WASM (單執行緒) | FFmpeg WASM (多執行緒) |
|---|---|---|---|
| TS → MP4 (1GB) | ~5 秒 | ~60-90 秒 | ~30-50 秒 |
| 音影片合併 (1GB) | ~10 秒 | ~120-180 秒 | ~60-90 秒 |
效能差異的原因:
- WASM 執行開銷:WebAssembly 在瀏覽器沙箱中執行,指令執行效率約為原生的 70-80%
- SIMD 限制:FFmpeg 大量使用 SIMD 指令最佳化,WASM SIMD 支援不如原生完善
- 記憶體存取:WASM 線性記憶體模型與原生記憶體管理有差異
- I/O 瓶頸:虛擬檔案系統的讀寫速度遠低於原生檔案系統
不支援的轉換
以下轉換路徑目前不支援:
- 任意格式 → AVI、MOV、MKV、WebM
- 影片編碼轉換(如 H.264 → H.265)
- 音訊編碼轉換(如 AAC → MP3)
- 解析度縮放
- 加入浮水印或字幕
FlowPick 的 FFmpeg 整合專注於容器格式轉換(轉封裝),不涉及編解碼。
轉封裝 vs 轉碼:
轉封裝(FlowPick 支援):
TS 容器 → 提取 H.264 影片串流 + AAC 音訊串流 → 封裝為 MP4 容器
特點:不改變編碼,速度快,無損
轉碼(FlowPick 不支援):
H.264 影片串流 → 解碼 → 重新編碼為 H.265 → 封裝
特點:改變編碼,速度慢,有損,CPU 密集
擴充功能版本限制
Manifest V3 限制
FlowPick 擴充功能使用 Chrome Manifest V3,存在以下平台限制:
- Service Worker 生命週期受限(閒置約 30 秒後終止)
- 無法使用持久化背景頁面
- 網路請求監聽依賴
webRequestAPI
Manifest V3 對 FlowPick 的影響:
| 限制 | 影響 | 應對措施 |
|---|---|---|
| Service Worker 30 秒逾時 | 長時間下載可能被中斷 | 下載過程中保持心跳,防止 SW 休眠 |
| 無持久化背景 | 無法在背景持續監控 | 使用者開啟彈出視窗時啟用偵測 |
webRequest 改為唯讀 | 無法修改請求標頭 | 不影響 FlowPick(僅讀取,不修改) |
偵測範圍
擴充功能的媒體偵測依賴於網路請求監控:
- 只能偵測擴充功能啟用後發起的請求
- 頁面重新整理後可以重新偵測
- 某些使用 WebSocket 或 MSE 的網站可能偵測不到媒體 URL
- iframe 中的媒體可能無法偵測(取決於 iframe 的跨域策略)
已知 Bug
大檔案 Blob 下載可能卡住
症狀:使用 Blob 模式下載接近 1.5GB 的檔案時,瀏覽器可能長時間無回應。
原因:new Blob([...]) 建構時需要複製所有資料,大檔案的記憶體分配和複製耗時較長。
暫時方案:使用 Chrome 瀏覽器以啟用串流寫入。
FFmpeg 首次載入較慢
症狀:首次使用格式轉換功能時,FFmpeg 載入需要 10-30 秒。
原因:FFmpeg WASM 核心檔案(約 8MB)需要從網路下載並編譯。
說明:這是正常現象,後續使用會利用瀏覽器快取,載入速度顯著提升。
載入時間分解:
首次載入:
下載 WASM 檔案(~8MB) → 2-5 秒(取決於網速)
WASM 編譯 → 5-15 秒(取決於 CPU)
初始化虛擬檔案系統 → 1-3 秒
總計 → 10-30 秒
後續載入(快取命中):
從快取讀取 WASM → <1 秒
WASM 編譯(可能快取) → 1-3 秒
總計 → 2-5 秒
部分 CDN 分片下載偶發失敗
症狀:下載過程中個別分片回傳 503 或網路錯誤。
原因:CDN 節點臨時故障或網路波動。
說明:FlowPick 內建了 3 次重試機制(指數退避),通常可以自動恢復。如果所有重試均失敗,該分片會被跳過並在日誌中記錄。