ビデオの静止フレームをオンザフライで処理する iOS アプリケーション (私の最初のアプリケーション) を構築しています。これを掘り下げるために、Appleの AV* ドキュメントの例に従いました。
このプロセスには、入力 (カメラ) と出力の設定が含まれます。出力はデリゲート (この場合はコントローラー自体) で機能します (必要なメソッドに準拠し、実装します)。
私が抱えている問題は、デリゲート メソッドが呼び出されないことです。以下のコードはコントローラーの実装で、いくつかの NSLog があります。「開始」メッセージは表示されますが、「呼び出されたデリゲート メソッド」は表示されません。
このコードはすべて、「AVCaptureVideoDataOutputSampleBufferDelegate」プロトコルを実装するコントローラー内にあります。
- (void)viewDidLoad {
[super viewDidLoad];
// Initialize AV session
AVCaptureSession *session = [AVCaptureSession new];
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone)
[session setSessionPreset:AVCaptureSessionPreset640x480];
else
[session setSessionPreset:AVCaptureSessionPresetPhoto];
// Initialize back camera input
AVCaptureDevice *camera = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
NSError *error = nil;
AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:camera error:&error];
if( [session canAddInput:input] ){
[session addInput:input];
}
// Initialize image output
AVCaptureVideoDataOutput *output = [AVCaptureVideoDataOutput new];
NSDictionary *rgbOutputSettings = [NSDictionary dictionaryWithObject:
[NSNumber numberWithInt:kCMPixelFormat_32BGRA] forKey:(id)kCVPixelBufferPixelFormatTypeKey];
[output setVideoSettings:rgbOutputSettings];
[output setAlwaysDiscardsLateVideoFrames:YES]; // discard if the data output queue is blocked (as we process the still image)
//[output addObserver:self forKeyPath:@"capturingStillImage" options:NSKeyValueObservingOptionNew context:@"AVCaptureStillImageIsCapturingStillImageContext"];
videoDataOutputQueue = dispatch_queue_create("VideoDataOutputQueue", DISPATCH_QUEUE_SERIAL);
[output setSampleBufferDelegate:self queue:videoDataOutputQueue];
if( [session canAddOutput:output] ){
[session addOutput:output];
}
[[output connectionWithMediaType:AVMediaTypeVideo] setEnabled:YES];
[session startRunning];
NSLog(@"started");
}
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection {
NSLog(@"delegate method called");
CGImageRef cgImage = [self imageFromSampleBuffer:sampleBuffer];
self.theImage.image = [UIImage imageWithCGImage: cgImage ];
CGImageRelease( cgImage );
}
注: iOS 5.0 をターゲットとしてビルドしています。
編集:
別の問題の解決策を求めているにもかかわらず、私のコードが本来すべきことを正確に実行しているという質問を見つけました。その質問のコードをそのまま空のxcodeアプリにコピーし、NSLogsをcaptureOutput関数に追加しましたが、呼び出されません。これは構成の問題ですか? 足りないものはありますか?