如何将代码 AVFoundation 目标 c 转换为 Swift?

Posted

技术标签:

【中文标题】如何将代码 AVFoundation 目标 c 转换为 Swift?【英文标题】:How to convert code AVFoundation objective c to Swift? 【发布时间】:2014-06-18 14:19:58 【问题描述】:

我在 swift 中使用 AVFoundation 来拍照,但我无法将任何 func 代码行从目标 c 转换为 Swift。我的 func 代码是:

 - (void) capImage  //method to capture image from AVCaptureSession video feed
AVCaptureConnection *videoConnection = nil;
for (AVCaptureConnection *connection in 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: %@", stillImageOutput);
[stillImageOutput captureStillImageAsynchronouslyFromConnection:videoConnection completionHandler: ^(CMSampleBufferRef imageSampleBuffer, NSError *error) 

    if (imageSampleBuffer != NULL) 
        NSData *imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageSampleBuffer];
        [self processImage:[UIImage imageWithData:imageData]];
    
];

此行向我发送错误 AnyObject[] 不符合协议 sequencfe..:

 for (AVCaptureInputPort *port in [connection inputPorts]) 

迅速:

  for port:AnyObject in connection.inputPorts 

我不知道如何转换这一行:

 [stillImageOutput captureStillImageAsynchronouslyFromConnection:videoConnection completionHandler: ^(CMSampleBufferRef imageSampleBuffer, NSError *error) 

你能帮我转换成 swift 吗? 谢谢!!

【问题讨论】:

要了解有关完成处理程序并将它们转换为 swift 的更多信息,请查看此问题***.com/questions/24190277/… 【参考方案1】:
for (AVCaptureInputPort *port in [connection inputPorts])  )

AnyObject 的数组应在交互之前转换为您的实际类型的数组,如下所示:

for (port in connection.inputPorts as AVCaptureInputPort[])  

就闭包的块而言,您只需确保语法正确。

stillImageOutput.captureStillImageAsynchronouslyFromConnection(videoConnection) 
    (imageSampleBuffer, error) in // This line defines names the inputs
    //...

请注意,这也使用Trailing Closure Syntax。请继续阅读文档!

编辑:就初始化器而言,它们现在看起来像这样:

let imageData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(imageSampleBuffer)
self.processImage(UIImage(data:imageData))

【讨论】:

还有这个??NSData *imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageSampleBuffer]; [self processImage:[UIImage imageWithData:imageData]];如何快速转换,我不知道如何翻译,谢谢! 太棒了!但在此方法中与我在目标 c 中的强制转换类型有相同类型的其他错误:CGImageRef imageRef = CGImageCreateWithImageInRect([smallImage CGImage],cropRect); [captureImage setImage:[UIImage imageWithCGImage:imageRef]];快速:imageRef = CGImageCreateWithImageInRect(smallImage as?CGImage!,cropRect) 并获取错误类型.. imageView2.image.imageWithAlignmentRectInsets(imageRef) 谢谢! @user3745888 我认为您应该编辑您的问题以包含这些内容,或者创建一个包含您所拥有的内容和遇到的错误的新问题。尽量说清楚! 对于 connection.inputPorts 中的端口为 [AVCaptureInputPort] 【参考方案2】:

试试这个

    var videoConnection :AVCaptureConnection?
   if let videoConnection = self.stillImageOutput.connectionWithMediaType(AVMediaTypeVideo)
     self.stillImageOutput.captureStillImageAsynchronouslyFromConnection(videoConnection, completionHandler:  (buffer:CMSampleBuffer!, error: NSError!) -> Void in
     if let exifAttachments = CMGetAttachment(buffer, kCGImagePropertyExifDictionary, nil) 
         let imageData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(buffer)
         self.previewImage.image = UIImage(data: imageData)
         UIImageWriteToSavedPhotosAlbum(self.previewImage.image, nil, nil, nil)
      
     )
   

【讨论】:

【参考方案3】:

这应该可以解决端口问题:

if let videoConnection = stillImageOuput.connectionWithMediaType(AVMediaTypeVideo)//take a photo here

【讨论】:

以上是关于如何将代码 AVFoundation 目标 c 转换为 Swift?的主要内容,如果未能解决你的问题,请参考以下文章

AVFoundation - 如何在捕获图像之前将 Flash 设置为自动/关闭

如何在 Avfoundation 中正确更改采样率

第1年5月19日 AVFoundation 文本转语音 Speech Kit实现语音识别

如何根据目标C中StoryBoards中的特定条件转到新视图

Swift 3:如何在使用 AVFoundation 录制视频期间将麦克风静音/取消静音

将 AVFoundation 与高分辨率视频一起使用时出现 -11855 错误代码。我应该使用啥分辨率?