2025 年 7 月 16 日

Audio&Video iOS iPadOS macOS Photos&Camera VideoToolbox WWDC WWDC25

Video Toolbox 的機器學習革命:深入探討全新 VTFrameProcessor API

已複製到剪貼板


對於開發影片剪輯、視訊會議或串流應用的開發者來說,「效能」與「畫質」往往是天秤的兩端。過去,若要在 App 中實作高品質的超解析度(Super Resolution)或精準的幀率轉換(Frame Rate Conversion),我們通常得自行封裝 Core ML 模型,或深入 Metal 撰寫複雜的著色器,這不僅開發門檻極高,更難以針對每一代 Apple Silicon 的神經網路引擎(Neural Engine)與 GPU 進行極致優化。

WWDC 2025|Enhance your app with machine-learning-based video effects:Super Resolution
WWDC 2025|Enhance your app with machine-learning-based video effects:Super Resolution

在最近的技術更新中,Apple 於 Video Toolbox 框架內推出了全新的 VTFrameProcessor API(支援 macOS 15.4+ 與 iOS 26+)。作為一名長期關注 Apple 平台的開發者,我認為這標誌著一個重要轉折:Apple 正式將機器學習驅動的影片處理演算法「第一類公民化 First-class citizen」。它將複雜的 ML 運算封裝在簡潔的 API 之下,讓開發者能直接調用 Apple 訓練有素且硬體加速的模型,徹底解決了處理高解析度、高幀率影片時的效能瓶頸。

VTFrameProcessor:Apple Silicon 驅動的影片處理新核心

VTFrameProcessor 的核心定位是一套專為 Apple Silicon 最佳化的機器學習影片處理引擎。它不只是簡單的濾鏡,而是深度整合了硬體加速器的演算法集,旨在提供專業級的影像強化能力。

從技術架構上看,VTFrameProcessor 抽象化了底層 Neural Engine 的複雜度。開發者不再需要處理 MLMultiArrayCVPixelBuffer 之間的繁瑣轉換,系統會根據硬體規格自動排程最優路徑。這種「軟硬一體」的設計,讓即便是在行動裝置上處理 4K 影片的特效運算,也能維持極佳的功耗比。

專家觀點:

這反映了 Apple 軟體生態的演進趨勢,將底層硬體效能透過高階框架 API 釋放,開發者只需專注於「應用場景」的邏輯,而將「如何跑得快」交給系統。

六大核心影片特效技術解析

VTFrameProcessor 目前提供六大核心技術,精準涵蓋了從離線剪輯到即時通訊的全方位需求。

幀率轉換(Frame Rate Conversion)與慢動作(Slow Motion)

這項技術透過合成(Synthesizing)全新的影格並精準插入既有影格之間,來調整影片的 FPS。除了能解決因幀率不匹配產生的抖動(Judder),它在創造慢動作效果上表現極佳。

  • 應用場景:專業運動賽事分析。例如在足球賽慶祝畫面中,透過合成影格能將慶祝的張力拉長,捕捉細微的情緒起伏
  • 演講者語錄:「透過放慢動作,影片能捕捉到慶祝的強烈張力,並突顯球員的情緒。」

超解析度縮放(Super Resolution)

不同於傳統的雙線性插值(Bilinear Interpolation),此功能利用 ML 模型恢復遺失細節。特別的是,API 提供了兩款模型:一個針對單張靜態影像(Still Images)優化,另一個則針對連續影片幀(Sequential Video Frames)設計,以維持時域上的連貫性。在處理船隻影片的範例中,可以看到船體細節變得銳利,且減少了邊緣模糊。

動態模糊(Motion Blur)

動態模糊能模擬快門速度,使運動畫面更自然。

  • 技術規格:開發者可透過 blurStrength 參數(範圍 1-100)微調強度
  • 實例:在機車騎士(Biker)的高速移動畫面中,加入動態模糊能顯著提升速度感;在高速公路縮時攝影中,則能消除幀與幀之間的跳躍感,使車流看起來更流暢

時域雜訊過濾(Temporal Noise Filtering)

基於運動估計(Motion Estimation)原理,它會分析過去與未來的參考幀來判斷雜訊。在處理路牌與樹木的場景中,它能有效移除惱人的色彩雜訊(Color Noise),不僅視覺更乾淨,更有助於後續編碼器的壓縮效率。

低延遲幀插值(Low Latency Frame Interpolation)

針對即時視訊設計,這套 API 提供了一個全方位工具(Utility),能同時執行幀率倍增(Frame Rate Doubling)與解析度提升(Resolution Upscaling)。在網路不穩導致畫面斷續(Choppy)時,它能讓說話者的動作回復流暢與清晰。

低延遲超解析度(Low Latency Super Resolution)

這是一套輕量級的縮放器。在視訊會議中,它能針對面部特徵進行強化,例如鬍鬚紋理(Beard Texture)與面部輪廓。它不僅能銳化邊緣,更能有效抑制因低頻寬導致的編碼偽影(Compression Artifacts)。

技術實作:從 API 到影格處理

整合 VTFrameProcessor 的關鍵在於理解其「配置 Configuration」與「參數 Parameters」分離的設計模式。開發者必須負責管理 CVPixelBuffer 池,以確保記憶體效率。

實作流程重點:

  1. Session 初始化:選擇特效並建立 Configuration 對象
  2. Buffer 管理:呼叫者需預先配置緩衝區陣列
  3. 參數設定:透過 Parameters 指定插值相位(Interpolation Phase)
  4. 處理:呼叫 process 函數

程式碼範例:建立幀率轉換會話

import VideoToolbox

// 1. 建立配置對象
guard let config = VTFrameRateConversionConfiguration(
    frameWidth: 1920,
    frameHeight: 1080,
    usePrecomputedFlow: false,      // 交給系統即時計算光流
    qualityPrioritization: .normal, // 或 .quality
    revision: .revision1
) else {
    fatalError("無法建立 VTFrameRateConversionConfiguration(尺寸或參數無效)")
}

// 2. 啟動處理會話取得 processor
//    直接 new VTFrameProcessor(),再呼叫 startSession(會 throw)
let processor = VTFrameProcessor()

do {
    try processor.startSession(configuration: config)
    print("VTFrameProcessor 會話啟動成功")
} catch {
    fatalError("啟動 VTFrameProcessor 失敗:\(error)")
}

程式碼範例:處理影格邏輯

import VideoToolbox

// 1. 設定 Processor
let processor = VTFrameProcessor()

// 假設已從 CVPixelBuffer 取得寬高(或從第一幀讀取)
guard let configuration = VTFrameRateConversionConfiguration(
    frameWidth: 1920,
    frameHeight: 1080,
    usePrecomputedFlow: false,
    qualityPrioritization: .normal, // 或 .quality
    revision: VTFrameRateConversionConfiguration.defaultRevision
) else {
    fatalError("無法建立 Frame Rate Conversion Configuration")
}

try processor.startSession(configuration: configuration)

// 2. 插入單一插值幀(FPS 兩倍化)
func insertInterpolatedFrame(
    currentBuffer: CVPixelBuffer,
    nextBuffer: CVPixelBuffer,
    outputBuffer: CVPixelBuffer, // 必須預先分配好 writable 的 pixel buffer
    currentPTS: CMTime,
    nextPTS: CMTime
) async throws {
    // 包裝成 VTFrameProcessorFrame
    guard let sourceFrame = VTFrameProcessorFrame(
        buffer: currentBuffer,
        presentationTimeStamp: currentPTS
    ) else { throw NSError(domain: "VT", code: -1, userInfo: [NSLocalizedDescriptionKey: "無法建立 sourceFrame"]) }
    
    guard let nextFrame = VTFrameProcessorFrame(
        buffer: nextBuffer,
        presentationTimeStamp: nextPTS
    ) else { throw NSError(domain: "VT", code: -1, userInfo: [NSLocalizedDescriptionKey: "無法建立 nextFrame"]) }
    
    // 計算插值時間點(中間點)
    let interpolatedPTS = CMTimeAdd(
        currentPTS,
        CMTimeMultiplyByRatio(CMTimeSubtract(nextPTS, currentPTS), multiplier: 1, divisor: 2)
    )
    
    guard let outputFrame = VTFrameProcessorFrame(
        buffer: outputBuffer,
        presentationTimeStamp: interpolatedPTS
    ) else { throw NSError(domain: "VT", code: -1, userInfo: [NSLocalizedDescriptionKey: "無法建立 outputFrame"]) }
    
    // 插值相位:只插入 1 幀 → [0.5]
    let interpolationPhase: [Float] = [0.5]
    
    // destinationFrames 必須傳入 VTFrameProcessorFrame 陣列
    let destinationFrames = [outputFrame]
    
    // 建立 parameters
    guard let parameters = VTFrameRateConversionParameters(
        sourceFrame: sourceFrame,
        nextFrame: nextFrame,
        opticalFlow: nil, // usePrecomputedFlow = false 時傳 nil
        interpolationPhase: interpolationPhase,
        submissionMode: .sequential, // 必須加上,效能最佳
        destinationFrames: destinationFrames
    ) else {
        throw NSError(domain: "VT", code: -1, userInfo: [NSLocalizedDescriptionKey: "無法建立 VTFrameRateConversionParameters"])
    }
    
    for try await readOnlyOutputFrame in processor.process(parameters: parameters) {
        // readOnlyOutputFrame 就是插值後的結果
        // 可以直接使用 outputBuffer,或從 readOnlyOutputFrame.buffer 取出
        print("插值幀已產生,PTS: \(readOnlyOutputFrame.timeStamp)")
    }
}

// 使用範例(在 async context 中呼叫)
// try await insertInterpolatedFrame(currentBuffer: ..., nextBuffer: ..., outputBuffer: ..., ...)

進階考量:光流(Optical Flow)的預計算

在追求效能的過程中,「光流計算」是資源消耗最大的環節。VTFrameProcessor 給予開發者極大的彈性:

  • 即時計算 On-the-fly:usePrecomputedFlow 設為 false,系統會在處理影格時即時計算。這適合即時通訊場景
  • 預計算 Pre-computed:對於剪輯 App,可以在「轉檔階段」先使用 VTOpticalFlowConfiguration 產出光流資料並儲存。在最終「渲染階段」時直接傳入該資料

這是一個典型的空間換時間策略:預計算雖增加了儲存需求與初始處理時間,但能確保在最終導出或預覽時,GPU/CPU 的負載降至最低,提供流暢的編輯體驗。

結語與展望

VTFrameProcessor 的問世,意味著 Apple Silicon 的硬體潛能已被更深度地封裝進開發工具鏈中。對於專業剪輯軟體,它提供了以前難以觸及的電影級慢動作與降噪;對於社交通訊軟體,它則利用輕量級模型解決了惡劣網路環境下的畫質痛點。

這套 API 不僅簡化了開發流程,更確保了應用程式能隨著 Apple 晶片的升級而自動獲得效能提升。

延伸思考:

在您的應用場景中,您認為哪項技術最具潛力?是能強化面部細節的低延遲超解析度,還是能讓動作場景更具張力的動態模糊特效?歡迎在開發者社群分享您的實作心得!

分享文章

已複製到剪貼板

追蹤網站

透過 Google 追蹤

超級感謝

關於 XcodeProject

XcodeProject 創立於 2023,致力於協助開發者探索 Apple 的創新世界,學習在 iOS、iPadOS、macOS、tvOS、visionOS 與 watchOS 上開發 App,發現眾多技術與框架,讓開發者獲得更多能力。


Contacts

Ricky Chuang

XcodeProject

RickyChuang.xcodeproj@gmail.com

XcodeProject 聯絡

contact.xcodeproj@gmail.com

XcodeProject 的最新文章