【发布时间】:2022-01-14 23:51:16
【问题描述】:
我正在尝试为 macOS 制作一个简单的控制台程序,它应该使用内置相机拍摄一张图像并将其保存到照片库中。
这是该程序的完整代码:
#import <Foundation/Foundation.h>
#import <AVFoundation/AVFoundation.h>
#import <Photos/Photos.h>
volatile int a = 0;
@interface PhotoCaptureProcessor: NSObject <AVCapturePhotoCaptureDelegate>
@end
@implementation PhotoCaptureProcessor
- (void) captureOutput:(AVCapturePhotoOutput *)output
didFinishProcessingPhoto:(AVCapturePhoto *)photo
error:(NSError *)error {
NSLog(@"Called\n");
if(error) {
return;
}
[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
[[PHAssetCreationRequest creationRequestForAsset] addResourceWithType:PHAssetResourceTypePhoto
data:[photo fileDataRepresentation]
options:nil];
} completionHandler:^(BOOL success, NSError * _Nullable error) {
if(error) {
NSLog(@"Error saving photo\n");
}
a = 1;
}];
}
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
AVCaptureSession *captureSession = [[AVCaptureSession alloc] init];
AVCaptureDevice *videoDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
NSError *error = nil;
AVCaptureDeviceInput *inputVideoDevice = [AVCaptureDeviceInput deviceInputWithDevice:videoDevice error:&error];
[captureSession beginConfiguration];
if(inputVideoDevice) {
if([captureSession canAddInput:inputVideoDevice]) {
[captureSession addInput:inputVideoDevice];
}
}
else {
return 1;
}
AVCapturePhotoOutput *photoOutput = [[AVCapturePhotoOutput alloc] init];
if(photoOutput) {
if([captureSession canAddOutput:photoOutput]) {
[captureSession addOutput:photoOutput];
}
}
captureSession.sessionPreset = AVCaptureSessionPresetPhoto;
[captureSession commitConfiguration];
[captureSession startRunning];
while(![captureSession isRunning]){
NSLog(@"Still not running\n");
}
AVCapturePhotoSettings *photoSettings = [[AVCapturePhotoSettings alloc] init];
PhotoCaptureProcessor *photoProcessor = [[PhotoCaptureProcessor alloc] init];
[photoOutput capturePhotoWithSettings:photoSettings delegate:photoProcessor];
while(!a){
}
}
return 0;
}
在调用方法 startRunning 后,我的 Mac 相机上的小灯变为绿色(我相信这表明相机正在使用中)。不幸的是,我的委托 PhotoCaptureProcessor 中的 captureOutput 方法从未被调用过。如果我右键单击captureOutput,然后单击转到定义,它会将我带到AVCapturePhotoCaptureDelegate 中的captureOutput(所以我相信方法签名很好)。
谁能告诉我我做错了什么?
【问题讨论】:
标签: objective-c macos avfoundation