第一步:初始化AVCaptureSession,添加输入,输出源
#import <AVFoundation/AVFoundation.h>
// Create and configure a capture session and start it running
- (void)setupCaptureSession
{
NSError *error = nil;
// Create the session
AVCaptureSession *session = [[AVCaptureSession alloc] init];
// Configure the session to produce lower resolution video frames, if your
// processing algorithm can cope. We'll specify medium quality for the
// chosen device.
session.sessionPreset = AVCaptureSessionPresetMedium;
// Find a suitable AVCaptureDevice
AVCaptureDevice *device = [AVCaptureDevice
defaultDeviceWithMediaType:AVMediaTypeVideo];
// Create a device input with the device and add it to the session.
AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device
error:&error];
if (!input) {
// Handling the error appropriately.
}
[session addInput:input];
// Create a VideoDataOutput and add it to the session
AVCaptureVideoDataOutput *output = [[[AVCaptureVideoDataOutput alloc] init] autorelease];
[session addOutput:output];
// Configure your output.
dispatch_queue_t queue = dispatch_queue_create("myQueue", NULL);
[output setSampleBufferDelegate:self queue:queue];
dispatch_release(queue);
// Specify the pixel format
output.videoSettings =
[NSDictionary dictionaryWithObject:
[NSNumber numberWithInt:kCVPixelFormatType_32BGRA]
forKey:(id)kCVPixelBufferPixelFormatTypeKey];
// If you wish to cap the frame rate to a known value, such as 15 fps, set
// minFrameDuration.
output.minFrameDuration = CMTimeMake(1, 15);
// Start the session running to start the flow of data
[session startRunning];
// Assign session to an ivar.
[self setSession:session];
}
第二步:实现AVCaptureVideoDataOutputSampleBufferDelegate协议方法
// Delegate routine that is called when a sample buffer was written
- (void)captureOutput:(AVCaptureOutput *)captureOutput
didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
fromConnection:(AVCaptureConnection *)connection
{
// Create a UIImage from the sample buffer data
UIImage *image = [self imageFromSampleBuffer:sampleBuffer];
< Add your code here that uses the image >
}
// Create a UIImage from sample buffer data
- (UIImage *) imageFromSampleBuffer:(CMSampleBufferRef) sampleBuffer
{
CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
// Lock the base address of the pixel buffer
CVPixelBufferLockBaseAddress(imageBuffer,0);
// Get the number of bytes per row for the pixel buffer
size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer);
// Get the pixel buffer width and height
size_t width = CVPixelBufferGetWidth(imageBuffer);
size_t height = CVPixelBufferGetHeight(imageBuffer);
// Create a device-dependent RGB color space
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
if (!colorSpace)
{
NSLog(@"CGColorSpaceCreateDeviceRGB failure");
return nil;
}
// Get the base address of the pixel buffer
void *baseAddress = CVPixelBufferGetBaseAddress(imageBuffer);
// Get the data size for contiguous planes of the pixel buffer.
size_t bufferSize = CVPixelBufferGetDataSize(imageBuffer);
// Create a Quartz direct-access data provider that uses data we supply
CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, baseAddress, bufferSize,
NULL);
// Create a bitmap image from data supplied by our data provider
CGImageRef cgImage =
CGImageCreate(width,
height,
8,
32,
bytesPerRow,
colorSpace,
kCGImageAlphaNoneSkipFirst | kCGBitmapByteOrder32Little,
provider,
NULL,
true,
kCGRenderingIntentDefault);
CGDataProviderRelease(provider);
CGColorSpaceRelease(colorSpace);
// Create and return an image object representing the specified Quartz image
UIImage *image = [UIImage imageWithCGImage:cgImage];
CGImageRelease(cgImage);
CVPixelBufferUnlockBaseAddress(imageBuffer, 0);
return image;
}
好了,现在就可以自由的显示和分析获取的UIImage了,再也不用使用私有API了
分享到:
相关推荐
在iOS应用开发过程中,苹果公司对开发者有着严格的规则,其中一条就是禁止使用私有API。私有API指的是苹果未公开、未在官方SDK文档中列出的API,使用这些API可能导致应用被App Store拒绝,或者在未来的系统更新中...
使用私有API实现蓝牙功能 实现打开关闭,给出提示,如果需要搜索周边蓝牙等可以跟到程序里看相关API。 不过是私有API,请慎用噢,使用了私有API的IOS APP是不能通过APP store审核的。
在iOS开发领域,私有API(Private API)指的是苹果未公开、未在官方SDK文档中声明的接口。这些API通常是为Apple内部使用而设计的,它们可能会改变或消失于未来的系统更新中,因此使用私有API有可能导致应用程序被App...
在iOS开发中,私有API是指苹果未公开的接口,这些API不在官方的SDK文档中,因此使用它们可能会导致应用被App Store拒绝。然而,有时开发者出于特定需求可能需要研究和使用私有API。本篇文章将详细介绍如何在Mac OS ...
在iOS开发中,私有API是指苹果未公开、未授权在App Store中使用的一系列系统接口。这些API可能提供了一些核心系统功能的访问权限,或者是苹果为了内部使用而保留的。尽管私有API能带来额外的功能,但使用它们可能会...
在iOS应用开发中,获取本地视频库和捕获摄像头视频流是常见的功能需求,尤其对于媒体分享、社交应用以及各种多媒体应用来说至关重要。本篇将深入探讨如何在iOS平台上实现这些功能,主要涉及的知识点包括: 1. **...
开发者通常不被鼓励或允许使用私有API,因为这可能导致应用被App Store拒绝,同时也可能影响应用的兼容性和稳定性。然而,了解私有API可以帮助开发者深入理解iOS系统的工作原理,甚至在某些特定情况下解决特定问题。...
然而,有些特殊情况下,开发者可能需要利用私有API来实现跨应用的功能,比如打开特定的目标应用。本文将深入探讨两种利用Swift私有API实现打开目标应用的方法。 方法一:使用`openURL:options:completionHandler:` ...
在iOS应用开发中,私有API是指Apple未公开、未授权在App Store发布的应用中使用的API。这些API可能会提供一些超越常规功能的能力,但使用它们可能导致应用被App Store拒绝,或者在未来的系统更新中出现兼容性问题。...
4. **合规性**:根据Apple的App Store审核指南,使用私有API的应用是不允许上架的,因为这可能导致不稳定的用户体验,违反了苹果的封闭生态系统原则。 5. **代码稳定性**:由于私有API未公开且未经官方支持,它们...
标题"IOS-7-Headers-master ios7 私有API"指出这是一个关于iOS 7私有API的项目,包含了iOS 7版本下的一些私有框架头文件。"Headers-master"通常指的是头文件仓库,其中包含了各种类和方法的定义,供开发者参考和使用...
在iOS应用开发中,获取本地视频库和捕获摄像头视频流是常见的功能需求,尤其是在创建媒体分享、视频编辑或者直播类应用中。本项目“VideoUpload”提供的源码着重展示了如何实现这些功能。以下是关于这个主题的详细...
这个标题“iOS4直接获取摄像头数据(收藏)”指的是如何在iOS 4及更高版本的系统中,通过编程方式访问设备的摄像头并获取其原始数据。这通常涉及到使用Apple的AVFoundation框架,它提供了强大的多媒体处理能力。 描述...
在iOS开发中,访问本地视频库和获取摄像头视频流是两个关键功能,它们涉及到多媒体处理、用户隐私权限以及UI设计等多个方面。以下是关于这两个主题的详细讲解。 首先,**获取本地视频库** 是iOS应用中常见的一种...
开发者可以使用WebCamTexture对象来获取摄像头的实时视频流,然后将其渲染到游戏对象的纹理上。WebCamTexture类提供了如Start、Play、Stop等方法,以及Width、Height、isPlaying等属性,方便我们控制和获取摄像头的...
在iOS平台上,摄像头捕获视频流是一项核心功能,它允许开发者构建各种实时视频处理和录制应用。本篇文章将深入探讨如何在iOS中实现这一技术,包括视频帧的捕获、转化以及连续处理。 首先,我们需要引入`...
请注意,这种方法并不能获取到具体的WiFi SSID,如果你需要这样的信息,可能需要用户授权并使用私有API,但这违反了Apple的App Store审核指南,可能导致你的应用被拒绝。 总的来说,获取iOS设备的WiFi信息涉及到对...
通过H5 打开 android IOS 摄像头, 显示, 拍照,
4. **事件处理**:在编程过程中,我们需要监听摄像头的状态变化,比如打开、关闭、捕获完成等。Delphi的事件驱动编程模型使得我们能轻松地处理这些事件,通过定义回调函数,当事件发生时执行相应的代码。 5. **用户...
首先,让我们明确一点:私有API是苹果未公开的接口,它们未在Apple的官方SDK文档中声明,因此使用它们的风险在于,未来版本的iOS更新可能会改变或移除这些API,导致应用程序出现兼容性问题。但是,为了理论上的讨论...