Получение времени экспозиции (EXIF) из CMSampleBuffer

Я пытаюсь получить время экспозиции из изображения, снятого с помощью AVFoundation. Когда я следовал инструкции WWDC 2010 года о получении полезных метаданных изображения из CMSampleBuffer следующим образом:

-(void)captureStillImageWithCompletion:(completion_exp)completionHandler
{
AVCaptureConnection *connection = [stillImage connectionWithMediaType:AVMediaTypeVideo];

typedef void(^MyBufBlock)(CMSampleBufferRef, NSError*);

MyBufBlock h = ^(CMSampleBufferRef buf, NSError *err){
    CFDictionaryRef exifAttachments = CMGetAttachment(buf, kCGImagePropertyExifDictionary, NULL);
    if(exifAttachments){
        NSLog(@"%@",exifAttachments);
    }

    if(completionHandler){
        completionHandler();
    }
};

[stillImage captureStillImageAsynchronouslyFromConnection:connection completionHandler:h];
}

У меня была ошибка в строке CFDictionaryRef:

Cannot initialize a variable of type'CFDictionaryRef (aka 'const __CFDictionary*') with an rvalue of type CFTypeRef..

Поэтому я последовал решению в Интернете, приведя его следующим образом:

CFDictionaryRef exifAttachments = (CFDictionaryRef)CMGetAttachment(buf, kCGImagePropertyExifDictionary, NULL);

И теперь выдает другую ошибку: Неопределенные символы для архитектуры armv7s

(Apple Mach-o Linker Error: "_kCGImagePropertyExifDictionary", referenced from:)
(Apple Mach-o Linker Error: "_CMGetAttachment", referenced from:)

Я не понимаю, что пошло не так с моей программой. У кого-нибудь есть идеи?


person yonasstephen    schedule 18.12.2013    source источник


Ответы (3)


Борясь с этим, я обнаружил, что вы можете просто использовать вложение Exif как NSDictionary. Я надеюсь, что это поможет кому-нибудь.

let metadata = CMGetAttachment(image, "{Exif}", nil ) as! NSDictionary
let buf = metadata.valueForKey("ExposureTime") as! NSNumber
let xposure:Double = buf.doubleValue
person Philli    schedule 22.02.2016

РЕДАКТИРОВАТЬ: вы должны включить библиотеку и заголовок ImageIO, чтобы этот ключ работал. Если вы не хотите этого делать, вы можете использовать это:

Думаю, что-то с ключом. Это сработало для меня:

CFDictionaryRef exifAttachments = CMGetAttachment(buf, (CFStringRef)@"{Exif}", NULL);
person Laz    schedule 30.12.2013

Модифицированная версия ответа Philli для Swift4:

var exifEd: Double?
if let metadata = CMGetAttachment(sampleBuffer, key: "{Exif}" as CFString, attachmentModeOut: nil) as? NSDictionary {
    if let exposureDurationNumber = metadata.value(forKey: "ExposureTime") as? NSNumber {
        exifEd = exposureDurationNumber.doubleValue
    }
}
person Volodymyr Kulyk    schedule 19.04.2019