`
cwh643
  • 浏览: 127548 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
文章分类
社区版块
存档分类
最新评论

ios4下不使用私有API,轻松打开摄像头,获取摄像流

阅读更多
第一步:初始化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了
4
0
分享到:
评论
3 楼 cwh643 2011-02-15  
lanter206 写道
朋友,你的这段代码和官网上的AVCaptureSession类的介绍中是一样的,但是我在调试的时候没有通过,你有调试过吗?手上项目涉及到这方面

我这里试了没有问题的,可以使用的
2 楼 lanter206 2011-01-13  
朋友,你的这段代码和官网上的AVCaptureSession类的介绍中是一样的,但是我在调试的时候没有通过,你有调试过吗?手上项目涉及到这方面
1 楼 handy.wang 2010-08-12  
Hi dude. Can you share with me how to catch the stream from camera with private API in iOS3. THX.

相关推荐

    iOS私有API检查工具

    在iOS应用开发过程中,苹果公司对开发者有着严格的规则,其中一条就是禁止使用私有API。私有API指的是苹果未公开、未在官方SDK文档中列出的API,使用这些API可能导致应用被App Store拒绝,或者在未来的系统更新中...

    IOS_使用私有API实现蓝牙功能

    使用私有API实现蓝牙功能 实现打开关闭,给出提示,如果需要搜索周边蓝牙等可以跟到程序里看相关API。 不过是私有API,请慎用噢,使用了私有API的IOS APP是不能通过APP store审核的。

    IOS7最新私有API

    在iOS开发领域,私有API(Private API)指的是苹果未公开、未在官方SDK文档中声明的接口。这些API通常是为Apple内部使用而设计的,它们可能会改变或消失于未来的系统更新中,因此使用私有API有可能导致应用程序被App...

    IOS私有API头文件导出

    在iOS开发中,私有API是指苹果未公开的接口,这些API不在官方的SDK文档中,因此使用它们可能会导致应用被App Store拒绝。然而,有时开发者出于特定需求可能需要研究和使用私有API。本篇文章将详细介绍如何在Mac OS ...

    ios的私有的api

    在iOS开发中,私有API是指苹果未公开、未授权在App Store中使用的一系列系统接口。这些API可能提供了一些核心系统功能的访问权限,或者是苹果为了内部使用而保留的。尽管私有API能带来额外的功能,但使用它们可能会...

    ios应用源码之获取本地视频库和获取摄像头视频流 videoupload 20181210

    在iOS应用开发中,获取本地视频库和捕获摄像头视频流是常见的功能需求,尤其对于媒体分享、社交应用以及各种多媒体应用来说至关重要。本篇将深入探讨如何在iOS平台上实现这些功能,主要涉及的知识点包括: 1. **...

    ios 6私有api头文件

    开发者通常不被鼓励或允许使用私有API,因为这可能导致应用被App Store拒绝,同时也可能影响应用的兼容性和稳定性。然而,了解私有API可以帮助开发者深入理解iOS系统的工作原理,甚至在某些特定情况下解决特定问题。...

    swift-两种利用私有api实现打开目标应用的方法

    然而,有些特殊情况下,开发者可能需要利用私有API来实现跨应用的功能,比如打开特定的目标应用。本文将深入探讨两种利用Swift私有API实现打开目标应用的方法。 方法一:使用`openURL:options:completionHandler:` ...

    AppScanner私有API扫描器

    在iOS应用开发中,私有API是指Apple未公开、未授权在App Store发布的应用中使用的API。这些API可能会提供一些超越常规功能的能力,但使用它们可能导致应用被App Store拒绝,或者在未来的系统更新中出现兼容性问题。...

    IOS 私有API

    4. **合规性**:根据Apple的App Store审核指南,使用私有API的应用是不允许上架的,因为这可能导致不稳定的用户体验,违反了苹果的封闭生态系统原则。 5. **代码稳定性**:由于私有API未公开且未经官方支持,它们...

    IOS-7-Headers-master ios7 私有API

    标题"IOS-7-Headers-master ios7 私有API"指出这是一个关于iOS 7私有API的项目,包含了iOS 7版本下的一些私有框架头文件。"Headers-master"通常指的是头文件仓库,其中包含了各种类和方法的定义,供开发者参考和使用...

    IOS应用源码之获取本地视频库和获取摄像头视频流 VideoUpload .zip

    在iOS应用开发中,获取本地视频库和捕获摄像头视频流是常见的功能需求,尤其是在创建媒体分享、视频编辑或者直播类应用中。本项目“VideoUpload”提供的源码着重展示了如何实现这些功能。以下是关于这个主题的详细...

    IOS4直接获取摄像头数据(收藏)

    这个标题“iOS4直接获取摄像头数据(收藏)”指的是如何在iOS 4及更高版本的系统中,通过编程方式访问设备的摄像头并获取其原始数据。这通常涉及到使用Apple的AVFoundation框架,它提供了强大的多媒体处理能力。 描述...

    IOS获取本地视频库和获取摄像头视频流

    在iOS开发中,访问本地视频库和获取摄像头视频流是两个关键功能,它们涉及到多媒体处理、用户隐私权限以及UI设计等多个方面。以下是关于这两个主题的详细讲解。 首先,**获取本地视频库** 是iOS应用中常见的一种...

    unity使用webcam调用移动端摄像头适配安卓和ios 源码和安卓apk

    开发者可以使用WebCamTexture对象来获取摄像头的实时视频流,然后将其渲染到游戏对象的纹理上。WebCamTexture类提供了如Start、Play、Stop等方法,以及Width、Height、isPlaying等属性,方便我们控制和获取摄像头的...

    iOS 摄像头捕获视频流

    在iOS平台上,摄像头捕获视频流是一项核心功能,它允许开发者构建各种实时视频处理和录制应用。本篇文章将深入探讨如何在iOS中实现这一技术,包括视频帧的捕获、转化以及连续处理。 首先,我们需要引入`...

    iOS-OC-获取WiFi信息

    请注意,这种方法并不能获取到具体的WiFi SSID,如果你需要这样的信息,可能需要用户授权并使用私有API,但这违反了Apple的App Store审核指南,可能导致你的应用被拒绝。 总的来说,获取iOS设备的WiFi信息涉及到对...

    H5打开摄像头.html

    通过H5 打开 android IOS 摄像头, 显示, 拍照,

    delphi 编写的调用摄像头程序

    4. **事件处理**:在编程过程中,我们需要监听摄像头的状态变化,比如打开、关闭、捕获完成等。Delphi的事件驱动编程模型使得我们能轻松地处理这些事件,通过定义回调函数,当事件发生时执行相应的代码。 5. **用户...

    swift-使用私有API将触摸栏按钮添加到控制条

    首先,让我们明确一点:私有API是苹果未公开的接口,它们未在Apple的官方SDK文档中声明,因此使用它们的风险在于,未来版本的iOS更新可能会改变或移除这些API,导致应用程序出现兼容性问题。但是,为了理论上的讨论...

Global site tag (gtag.js) - Google Analytics