已知限制與注意事項

FlowPick 目前版本的技術限制、已知問題和邊界情況說明。

本文件彙整了 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,可以串流寫入任意大小的檔案。

關於三級寫入策略的完整對比和降級邏輯,請參閱 下載引擎架構 — 策略對比總結。關於大檔案下載失敗的排查步驟,請參閱 常見問題排查 — 大檔案下載失敗。關於各瀏覽器對 FSA API 的支援情況,請參閱 瀏覽器相容性 — 功能支援矩陣

記憶體壓力

即使使用串流寫入,以下因素仍會消耗記憶體:

  • 並行下載的分片資料(每個分片通常 1-10MB)
  • FFmpeg WASM 執行時記憶體(約 200-400MB)
  • 頁面 UI 和其他元件

建議

  • 下載超大檔案(>5GB)時,將並行執行緒數降至 1-2
  • 關閉其他佔用記憶體的分頁
  • 避免同時執行多個 FFmpeg 轉封裝任務
關於記憶體安全管理的完整機制(大小預估、閾值檢查、執行時監控),請參閱 下載引擎架構 — 記憶體安全管理。關於並行數的設定方法,請參閱 設定參考

串流媒體協定限制

DRM 保護內容

FlowPick 無法處理以下類型的受保護內容:

保護技術常見平台狀態
WidevineNetflix, Disney+不支援
PlayReady部分 Windows 平台不支援
FairPlayApple TV+不支援
ClearKey部分測試串流不支援

偵測方式:DASH 清單中出現 <ContentProtection> 標籤時,下載器會明確提示不支援。

為什麼無法支援 DRM?

DRM 系統的核心是內容解密模組(CDM),它是瀏覽器內建的閉源二進位元件。CDM 與作業系統和硬體深度繫結,負責解密受保護的內容並將解碼後的幀直接輸出到顯示卡,應用層無法攔截或讀取解密後的資料。這是 DRM 系統的設計目標——確保內容在從解密到顯示的整個鏈路中不被截獲。

關於 DRM 串流的偵測提示和使用者介面表現,請參閱 影片嗅探 — DASH 串流。關於媒體偵測不到 DRM 內容的排查,請參閱 常見問題排查 — 擴充功能無法偵測到任何媒體

AES-128 加密

FlowPick 支援 HLS 的 AES-128 分片加密,但有以下限制:

  • 僅支援 METHOD=AES-128,不支援 SAMPLE-AES
  • 金鑰檔案必須可透過 HTTP(S) 直接存取
  • 不支援需要 Cookie 認證的金鑰 URL(線上工具模式)
關於 AES-128 解密的完整技術實作(Web Crypto API、IV 處理),請參閱 下載引擎架構 — AES-128 解密。關於加密串流的偵測流程,請參閱 影片嗅探 — 加密串流

直播串流

FlowPick 主要面向點播(VOD)內容設計:

  • 直播 HLS 串流可以下載已快取的分片,但無法取得未來的分片
  • 直播串流的分片列表會持續更新,下載器不會自動追蹤新增分片
  • 建議等待直播結束後再下載完整回放

直播串流下載的實際效果

直播進行中(已播放 30 分鐘):
  M3U8 清單包含最近 ~30 秒的分片
  → 下載器只能取得這 30 秒的內容
  → 無法取得之前或之後的分片

直播結束後:
  M3U8 清單包含完整分片列表
  → 下載器可以取得全部內容
  → 等同於點播下載
關於直播回放下載的完整場景說明,請參閱 直播回放儲存。關於 HLS 直播串流的清單結構,請參閱 影片嗅探 — HLS 串流

分離音影片串流

部分 DASH 串流將影片和音訊分離為獨立的 AdaptationSet:

  • 下載器會分別列出影片串流和音訊串流
  • 需要手動選擇匹配的影片和音訊串流
  • 合併需要 FFmpeg WASM,耗時較長
  • 如果音影片時長不一致,合併結果可能出現音畫不同步
關於 DASH 串流音影片分離的處理流程和 FMP4 重組,請參閱 下載引擎架構 — DASH 串流的特殊處理。關於音畫不同步的排查和修復,請參閱 常見問題排查 — 合併後的影片音畫不同步

瀏覽器限制

File System Access API

瀏覽器支援狀態
Chrome 86+完整支援
Edge 86+完整支援
Firefox不支援
Safari不支援

在不支援的瀏覽器中,所有下載使用 Blob 模式,受 1.5GB 大小限制。

關於各瀏覽器的完整功能支援矩陣和瀏覽器選擇建議,請參閱 瀏覽器相容性。關於 FSA API 不可用時的排查,請參閱 常見問題排查 — File System Access API 不可用

SharedArrayBuffer

FFmpeg WASM 多執行緒模式需要 SharedArrayBuffer,這要求網站設定以下 HTTP 回應標頭:

Cross-Origin-Opener-Policy: same-origin
Cross-Origin-Embedder-Policy: require-corp

如果這些標頭未設定,FFmpeg 自動降級為單執行緒模式,合併速度降低約 40-60%。

關於 SharedArrayBuffer 的瀏覽器支援詳情和自部署設定,請參閱 瀏覽器相容性 — 進階 API。關於單執行緒與多執行緒的效能對比資料,請參閱 格式轉換 — 多執行緒模式

Service Worker

StreamSaver.js 依賴 Service Worker。以下情況會導致 StreamSaver 不可用:

  • 瀏覽器隱私模式(部分瀏覽器限制 Service Worker)
  • 企業策略停用 Service Worker
  • 網站未正確部署 mitm.htmlstreamsaver-sw.js
關於 StreamSaver.js 的降級行為和寫入策略優先級,請參閱 下載引擎架構 — 檔案寫入模組。關於企業網路環境的特殊限制,請參閱 常見問題排查 — 企業網路環境

網路限制

CORS 跨域限制

線上工具模式(/m3u8-downloader/dash-downloader)受瀏覽器同源策略限制:

  • 如果串流媒體伺服器未設定 Access-Control-Allow-Origin 回應標頭,請求會被阻止
  • 部分 CDN 會檢查 RefererOrigin 請求標頭
  • 擴充功能版本不受此限制,因為它使用擴充功能權限發起請求

CORS 錯誤的技術原理

線上工具(flowpick.app)請求 CDN(cdn.example.com):

瀏覽器發送請求 → CDN 回傳分片資料
                      ↓
              瀏覽器檢查回應標頭:
              Access-Control-Allow-Origin 是否包含 flowpick.app?
                      ↓
              否 → 瀏覽器阻止 JavaScript 讀取回應
              是 → 正常讀取

擴充功能版本:
擴充功能透過 chrome.webRequest / chrome.fetch 發起請求
→ 不受同源策略限制
→ 可以讀取任何來源的回應
關於 CORS 錯誤的排查和解決方案,請參閱 常見問題排查 — 下載中途失敗。關於擴充功能與線上工具的功能差異,請參閱 線上工具

請求頻率限制

部分 CDN 會對高頻請求進行限流:

  • 並行執行緒數過高可能觸發 429(Too Many Requests)錯誤
  • 建議將並行數控制在 4 以內
  • 如果遇到限流,降低並行數後重試
關於並行數與效能的關係(含邊際收益遞減分析),請參閱 下載引擎架構 — 並行數與效能的關係。關於下載速度慢的診斷流程,請參閱 常見問題排查 — 下載速度慢

分片 URL 過期

部分串流媒體服務的分片 URL 包含時效性權杖:

  • 權杖過期後分片無法下載
  • 過期時間通常為幾分鐘到幾小時
  • 建議在取得清單後盡快開始下載
  • 如果下載中斷時間過長,可能需要重新取得清單

典型過期場景

服務類型典型過期時間建議
線上課程平台2-4 小時取得清單後立即下載
直播回放30 分鐘 - 2 小時盡快完成,避免中斷
短影片平台5-15 分鐘單次下載通常足夠
付費串流媒體1-5 分鐘極短視窗,需快速完成
關於下載中途失敗的排查(含 HTTP 403 錯誤處理),請參閱 常見問題排查 — 下載中途失敗。關於下載引擎的重試機制,請參閱 下載引擎架構 — 重試機制

格式轉換限制

FFmpeg WASM 效能

FFmpeg 在瀏覽器中以 WebAssembly 執行,效能遠低於原生版本:

操作原生 FFmpegFFmpeg WASM (單執行緒)FFmpeg WASM (多執行緒)
TS → MP4 (1GB)~5 秒~60-90 秒~30-50 秒
音影片合併 (1GB)~10 秒~120-180 秒~60-90 秒

效能差異的原因

  1. WASM 執行開銷:WebAssembly 在瀏覽器沙箱中執行,指令執行效率約為原生的 70-80%
  2. SIMD 限制:FFmpeg 大量使用 SIMD 指令最佳化,WASM SIMD 支援不如原生完善
  3. 記憶體存取:WASM 線性記憶體模型與原生記憶體管理有差異
  4. I/O 瓶頸:虛擬檔案系統的讀寫速度遠低於原生檔案系統
關於 FFmpeg WASM 的完整技術實作(載入、多執行緒偵測、命令執行),請參閱 格式轉換 — FFmpeg WASM 引擎。關於如何透過選擇 TS 輸出來跳過 FFmpeg,請參閱 格式轉換 — 輸出格式選擇

不支援的轉換

以下轉換路徑目前不支援:

  • 任意格式 → 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 密集
關於容器與編解碼器的概念區分,請參閱 格式轉換 — 容器與編解碼器。關於 TS 和 MP4 格式的播放器相容性,請參閱 格式轉換 — 輸出格式選擇

擴充功能版本限制

Manifest V3 限制

FlowPick 擴充功能使用 Chrome Manifest V3,存在以下平台限制:

  • Service Worker 生命週期受限(閒置約 30 秒後終止)
  • 無法使用持久化背景頁面
  • 網路請求監聽依賴 webRequest API

Manifest V3 對 FlowPick 的影響

限制影響應對措施
Service Worker 30 秒逾時長時間下載可能被中斷下載過程中保持心跳,防止 SW 休眠
無持久化背景無法在背景持續監控使用者開啟彈出視窗時啟用偵測
webRequest 改為唯讀無法修改請求標頭不影響 FlowPick(僅讀取,不修改)
關於擴充功能的安裝和啟用步驟,請參閱 安裝指南。關於擴充功能請求的權限及其用途,請參閱 隱私與安全 — 權限說明

偵測範圍

擴充功能的媒體偵測依賴於網路請求監控:

  • 只能偵測擴充功能啟用後發起的請求
  • 頁面重新整理後可以重新偵測
  • 某些使用 WebSocket 或 MSE 的網站可能偵測不到媒體 URL
  • iframe 中的媒體可能無法偵測(取決於 iframe 的跨域策略)
關於媒體偵測的技術原理和 HLS/DASH 清單解析,請參閱 影片嗅探。關於偵測不到媒體的排查步驟,請參閱 常見問題排查 — 媒體偵測問題

已知 Bug

大檔案 Blob 下載可能卡住

症狀:使用 Blob 模式下載接近 1.5GB 的檔案時,瀏覽器可能長時間無回應。

原因new Blob([...]) 建構時需要複製所有資料,大檔案的記憶體分配和複製耗時較長。

暫時方案:使用 Chrome 瀏覽器以啟用串流寫入。

關於 Blob 模式的記憶體限制和替代方案,請參閱 下載引擎架構 — 策略三:Blob 備援

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 秒
關於 FFmpeg WASM 的載入流程和多執行緒偵測,請參閱 格式轉換 — FFmpeg WASM 引擎

部分 CDN 分片下載偶發失敗

症狀:下載過程中個別分片回傳 503 或網路錯誤。

原因:CDN 節點臨時故障或網路波動。

說明:FlowPick 內建了 3 次重試機制(指數退避),通常可以自動恢復。如果所有重試均失敗,該分片會被跳過並在日誌中記錄。

關於重試機制的詳細策略(指數退避時間表、不觸發重試的情況),請參閱 下載引擎架構 — 重試機制

相關文件