2016-04-15 6 views
0

Ich mag den Bildschirm des Mac erfassen, und ich weiß AVCaptureStillImageOutput ist worked.But Ich weiß nicht, wie es in Mac zu verwenden.Wie die AVCaptureStillImageOutput verwenden, um den Bildschirm in Mac zu erfassen

hoffe, dass ich jemanden, der mir einige Beispiel-Code zur Verwendung der Klasse geben kann, die screen.Or einige Ratschläge OK zu erfassen.

Der folgende Code wird AVCaptureStillImageOutput mit dem Bild in der IOS devices.Maybe erfassen sie modifiziert und in dem Mac nutzen kann?

Jede Hilfe, Dank im Voraus geschätzt.

///////////////////////////////////////////////// 
//// 
//// Utility to find front camera 
//// 
    ///////////////////////////////////////////////// 
    -(AVCaptureDevice *) frontFacingCameraIfAvailable{ 
    NSArray *videoDevices = [AVCaptureDevice 
    devicesWithMediaType:AVMediaTypeVideo]; 
    AVCaptureDevice *captureDevice = nil; 

    for (AVCaptureDevice *device in videoDevices){ 

     if (device.position == AVCaptureDevicePositionFront){ 

     captureDevice = device; 
     break; 
    } 
} 

// couldn't find one on the front, so just get the default video device. 
if (!captureDevice){ 

    captureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; 
} 

return captureDevice; 
} 

///////////////////////////////////////////////// 
//// 
//// Setup Session, attach Video Preview Layer 
//// and Capture Device, start running session 
//// 
///////////////////////////////////////////////// 
-(void) setupCaptureSession { 
AVCaptureSession *session = [[AVCaptureSession alloc] init]; 
session.sessionPreset = AVCaptureSessionPresetMedium; 

AVCaptureVideoPreviewLayer *captureVideoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session]; 
[self.view.layer addSublayer:captureVideoPreviewLayer]; 

NSError *error = nil; 
AVCaptureDevice *device = [self frontFacingCameraIfAvailable]; 
AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:&error]; 
if (!input) { 
    // Handle the error appropriately. 
    NSLog(@"ERROR: trying to open camera: %@", error); 
} 
[session addInput:input]; 

self.stillImageOutput = [[AVCaptureStillImageOutput alloc] init]; 
NSDictionary *outputSettings = [[NSDictionary alloc] initWithObjectsAndKeys: AVVideoCodecJPEG, AVVideoCodecKey, nil]; 
[self.stillImageOutput setOutputSettings:outputSettings]; 

[session addOutput:self.stillImageOutput]; 

[session startRunning]; 
} 

///////////////////////////////////////////////// 
//// 
//// Method to capture Still Image from 
//// Video Preview Layer 
//// 
///////////////////////////////////////////////// 
-(void) captureNow { 
AVCaptureConnection *videoConnection = nil; 
for (AVCaptureConnection *connection in self.stillImageOutput.connections) { 
    for (AVCaptureInputPort *port in [connection inputPorts]) { 
     if ([[port mediaType] isEqual:AVMediaTypeVideo]) { 
      videoConnection = connection; 
      break; 
     } 
    } 
    if (videoConnection) { break; } 
} 

NSLog(@"about to request a capture from: %@", self.stillImageOutput); 
__weak typeof(self) weakSelf = self; 
[self.stillImageOutput captureStillImageAsynchronouslyFromConnection:videoConnection completionHandler: ^(CMSampleBufferRef imageSampleBuffer, NSError *error) { 

    NSData *imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageSampleBuffer]; 
    UIImage *image = [[UIImage alloc] initWithData:imageData]; 

    [weakSelf displayImage:image]; 
}]; 
    } 
+0

Nehmen Sie den Bildschirm auf, was bedeutet, dass Sie einen Film über Desktop-Aktivitäten erstellen möchten? –

+0

Aufnahme eines Standbildes des Bildschirms. Eigentlich möchte ich das Aufnahmevideo von Desktop-Aktivitäten zu einer Multicast-Gruppe senden, während das Video aufgezeichnet wird. Ich weiß nicht, wie ich die Stream-Medien an das Netzwerk senden soll. Daher ist das kontinuierliche Senden von Bildern anstelle des Sendens von Stream-Medien die einzige Lösung, die mir einfällt. –

+0

Sie bestätigen für einen und möchten einen anderen tun. Ich weiß nicht was du willst. –

Antwort

1

Es klingt, als ob Sie eine Bildschirmaufnahme machen möchten. Hier

ist, was ich in iOS verwenden, um ein Bild der gesamten Ansicht zu nehmen (screencapture),

UIView *wholeScreen = self.view; 

// define the size and grab a UIImage from it 
UIGraphicsBeginImageContextWithOptions(wholeScreen.bounds.size, wholeScreen.opaque, 0.0); 
[wholeScreen.layer renderInContext:UIGraphicsGetCurrentContext()]; 
UIImage *screengrab = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

Ich weiß nicht, ob dies auf OSX funktioniert.

Bearbeiten - Ok, ist die oben nicht funktioniert, vielleicht können Sie sehen, ob diese Ihnen helfen kann, ScreenShot Apple Docs

Hier ist eine Beschreibung über das, was das bedeutet - Verwendet Quartz Display Services ein Bild enthält, den Inhalt zu erhalten eines der angeschlossenen Displays. Außerdem kann der Benutzer das Bild in einer Datei auf der Festplatte speichern.

+0

Vielen Dank. Obwohl es nicht funktioniert –

+0

Welchen Fehler haben Sie erhalten oder was hat es bewirkt? – Ro4ch

+0

Ich habe nicht einmal die "UIGraphicsBeginImageContextWithOptions()" gefunden. Es ist nur in der iOS verwenden. –

Verwandte Themen