- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我使用 AVCaptureSessionPhoto
允许用户拍摄高分辨率照片。拍照后,我使用 captureOutput:didOutputSampleBuffer:fromConnection:
方法在拍摄时检索缩略图。然而,虽然我尝试在委托(delegate)方法中做最少的工作,但该应用程序变得有点迟钝(我说有点迟钝是因为它仍然可用)。此外,iPhone 往往会发烫。
有什么方法可以减少 iPhone 必须完成的工作量吗?
我通过执行以下操作设置 AVCaptureVideoDataOutput
:
self.videoDataOutput = [[AVCaptureVideoDataOutput alloc] init];
self.videoDataOutput.alwaysDiscardsLateVideoFrames = YES;
// Specify the pixel format
dispatch_queue_t queue = dispatch_queue_create("com.myapp.videoDataOutput", NULL);
[self.videoDataOutput setSampleBufferDelegate:self queue:queue];
dispatch_release(queue);
self.videoDataOutput.videoSettings = [NSDictionary dictionaryWithObject: [NSNumber numberWithInt:kCVPixelFormatType_32BGRA]
forKey:(id)kCVPixelBufferPixelFormatTypeKey];
这是我的captureOutput:didOutputSampleBuffer:fromConnection
(以及辅助imageRefFromSampleBuffer
方法):
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
fromConnection:(AVCaptureConnection *)connection {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
if (videoDataOutputConnection == nil) {
videoDataOutputConnection = connection;
}
if (getThumbnail > 0) {
getThumbnail--;
CGImageRef tempThumbnail = [self imageRefFromSampleBuffer:sampleBuffer];
UIImage *image;
if (self.prevLayer.mirrored) {
image = [[UIImage alloc] initWithCGImage:tempThumbnail scale:1.0 orientation:UIImageOrientationLeftMirrored];
}
else {
image = [[UIImage alloc] initWithCGImage:tempThumbnail scale:1.0 orientation:UIImageOrientationRight];
}
[self.cameraThumbnailArray insertObject:image atIndex:0];
dispatch_async(dispatch_get_main_queue(), ^{
self.freezeCameraView.image = image;
});
CFRelease(tempThumbnail);
}
sampleBuffer = nil;
[pool release];
}
-(CGImageRef)imageRefFromSampleBuffer:(CMSampleBufferRef)sampleBuffer {
CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
CVPixelBufferLockBaseAddress(imageBuffer,0);
uint8_t *baseAddress = (uint8_t *)CVPixelBufferGetBaseAddress(imageBuffer);
size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer);
size_t width = CVPixelBufferGetWidth(imageBuffer);
size_t height = CVPixelBufferGetHeight(imageBuffer);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef context = CGBitmapContextCreate(baseAddress, width, height, 8, bytesPerRow, colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst);
CGImageRef newImage = CGBitmapContextCreateImage(context);
CVPixelBufferUnlockBaseAddress(imageBuffer,0);
CGContextRelease(context);
CGColorSpaceRelease(colorSpace);
return newImage;
}
最佳答案
minFrameDuration 已弃用,这可能有效:
AVCaptureConnection *stillImageConnection = [stillImageOutput connectionWithMediaType:AVMediaTypeVideo];
stillImageConnection.videoMinFrameDuration = CMTimeMake(1, 10);
关于iphone - 捕获输出 :didOutputSampleBuffer:fromConnection Performance Issues,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5925036/
iOS 4.3 测试版 1 我不知道发生了什么,但不知何故,新 Beta 中缺少 sampleBuffer 的 MetaDictionary。任何人都可以批准吗? 我总是得到这样的 MetaDicti
我想从 AVCaptureSession 的实时馈送中提取帧,我正在使用 Apple 的 AVCam 作为测试用例。这是 AVCam 的链接: https://developer.apple.com/
我正在为 iOS 4+ 编写一个视频捕捉应用程序。它在 ios 5+ 的设备上工作正常,但在 ios 4+ 中,在录制停止后不会调用委托(delegate) didFinishRecordingToO
我使用 AVCaptureSessionPhoto 允许用户拍摄高分辨率照片。拍照后,我使用 captureOutput:didOutputSampleBuffer:fromConnection: 方
我需要在我的 captureOutput:didOutputSampleBuffer:fromConnection: 方法中有选择地(可靠地)关闭 sampleBuffers 的处理。如您所知,它是从
我试图更好地理解 AVFoundation 框架以及各种 Core xxxx 框架,因此我决定尝试一个简单的视频捕获,看看是否可以将图像输出到 UI。我查看了 rosyWriter 代码和文档,但没有
我正在使用 AVCaptureVideoDataOutput 的 captureOutput:didOutputSampleBuffer:fromConnection: 委托(delegate)方法。
我是一名优秀的程序员,十分优秀!