如何将代码 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 设置为自动/关闭
第1年5月19日 AVFoundation 文本转语音 Speech Kit实现语音识别
如何根据目标C中StoryBoards中的特定条件转到新视图