Снимок экрана OSX с использованием AVScreenCaptureInput

В моем Mac-приложении мне нужно захватить экран и отправить его в другой,

Возможно ли это AVCaptureSession ?

если да, мне просто нужны данные RGB или YUV, а не аудио, возможно ли это настроить?

если не AVFoundation class / framework, то какой из них рекомендуется?

1

Решение

Если вам нужен непрерывный поток изображений yuv, вы можете сделать что-то вроде этого:

#import <AVFoundation/AVFoundation.h>

@interface ScreenCapture() <AVCaptureVideoDataOutputSampleBufferDelegate>

@property (nonatomic) AVCaptureSession *captureSession;

@end

@implementation ScreenCapture

- (instancetype)init
{
self = [super init];
if (self) {
self.captureSession = [[AVCaptureSession alloc] init];

AVCaptureScreenInput *input = [[AVCaptureScreenInput alloc] initWithDisplayID:CGMainDisplayID()];
[self.captureSession addInput:input];

AVCaptureVideoDataOutput *output = [[AVCaptureVideoDataOutput alloc] init];
[self.captureSession addOutput:output];

// TODO: create a dedicated queue.
[output setSampleBufferDelegate:self queue:dispatch_get_main_queue()];

[self.captureSession startRunning];
}
return self;
}

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection {
// sampleBuffer contains screen cap, for me it's yuv
}

@end

Это дает мне около 15 кадров в секунду. Вы можете получить более высокую частоту кадров, снизив минимальную частоту кадров:

input.minFrameDuration = CMTimeMake(1, 60);

Для более зрелой реализации, которая больше проверяет ошибки, см. Apple Пример кода AVScreenShack.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]