我想記錄在 macOS 上運行的螢屏外 NSView 的視頻輸出(編碼與否)。我很確定沒有 API 可以做到這一點,但是我相信通過將其逐幀渲染到幀緩沖區中是可行的。
問題是我找不到以足夠快的速度渲染視圖的方法。我嘗試過的方法沒有成功(在運行 Monterey 的 MacBook M1 Pro 上測驗):
[view dataWithPDFInsideRect:]和[view dataWithEPSInsideRect:]: 執行大約需要 200 毫秒。[view.layer renderInContext:]: 執行大約需要 350 毫秒。[view cacheDisplayInRect: toBitmapImageRep:]: 執行大約需要 100 毫秒。
我還嘗試將視圖嵌入視窗并捕獲視窗。視窗捕獲功能(例如CGWindowListCreateImage)要快得多,但在視窗離屏時不起作用。
考慮到可以毫無問題地在視窗中以 60fps 的速度渲染視圖,為什么這些方法要花費這么多時間?我錯過了將 NSView 渲染到幀緩沖區中的任何方法嗎?
uj5u.com熱心網友回復:
我終于找到了一種高效的方法。通過以這種方式捕獲視圖,我能夠達到 60 fps。
NSView* view = ...;
NSBitmapImageRep *bitmap = [
[NSBitmapImageRep alloc]
initWithBitmapDataPlanes:nil
pixelsWide:view.bounds.size.width
pixelsHigh:view.bounds.size.height
bitsPerSample:8
samplesPerPixel:4
hasAlpha:YES
isPlanar:NO
colorSpaceName:NSCalibratedRGBColorSpace
bitmapFormat:0
bytesPerRow:(4 * view.bounds.size.width)
bitsPerPixel:32
];
NSGraphicsContext *graphicsContext = [NSGraphicsContext graphicsContextWithBitmapImageRep:bitmap];
[NSGraphicsContext saveGraphicsState];
[NSGraphicsContext setCurrentContext:graphicsContext];
[view displayRectIgnoringOpacity:view.bounds inContext:graphicsContext];
[NSGraphicsContext restoreGraphicsState];
// pixels are in format [R, G, B, A, R, G, B, A, ...]
unsigned char* pixels = [bitmap bitmapData];
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/438109.html
