从CMSampleBuffer获取曝光时间(EXIF)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从CMSampleBuffer获取曝光时间(EXIF)相关的知识,希望对你有一定的参考价值。

我试图从使用AVFoundation捕获的图像中获取曝光时间。当我按照2010年的WWDC指令关于从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:)

我不明白我的程序出了什么问题。有人有什么想法吗?

答案

我也苦苦思索,我发现你可以简单地将Exif附件作为NSDictionary。我希望这会对任何人有所帮助。

let metadata = CMGetAttachment(image, "{Exif}", nil ) as! NSDictionary
let buf = metadata.valueForKey("ExposureTime") as! NSNumber
let xposure:Double = buf.doubleValue
另一答案

编辑:您必须包含ImageIO库和标题才能使此键正常工作。如果您不想这样做,可以使用:

关于我认为的关键是什么。这对我有用:

CFDictionaryRef exifAttachments = CMGetAttachment(buf, (CFStringRef)@"{Exif}", NULL);
另一答案

修改版的Philli's回答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
    }
}

以上是关于从CMSampleBuffer获取曝光时间(EXIF)的主要内容,如果未能解决你的问题,请参考以下文章

从 CMSampleBuffer 转换为 UIImage 对象

从 CMSampleBuffer 中提取数据以创建深层副本

CIDetector 在处理 CMSampleBuffer 时崩溃

来自 OpenGL 的 CMSampleBuffer,用于使用 AVAssestWritter 进行视频输出

将 AudioBufferList 转换为 CMSampleBuffer 会产生意外结果

使用 CMSampleBuffer 生成 Float32 数组(Float32 PCM 数据)