zoukankan      html  css  js  c++  java
  • A very cool custom video camera with AVFoundation(译文)

    AVFoundation是一个非常酷的框架,允许您收集多媒体数据所产生的不同的输入源(摄像头、麦克风等)和将他们重定向到任何输出目的地(屏幕、扬声器等)。您可以创建自定义播放和捕获音频解决方案,视频和静态图像。使用这个框架的优势对于商用解决方案如MPMoviePlayerController或UIImagePickerController是你获得相机的原始数据。通过这种方式,您可以应用效果实时输入信号的不同的目的。

    我为你准备了一个小应用程序,向您展示如何使用这个框架,并创建一个很酷的摄像机。

    Session

    AVFoundation基于会话的概念。会话是用于控制流数据从输入到输出的设备。创建一个会话很简单:

    AVCaptureSession *session = [[AVCaptureSession alloc] init];

    会话允许您定义音频和视频记录的质量,使用sessionPreset AVCaptureSession类的属性。对于这个示例,它很好去低质量数据(所以我们节省一些电池循环):

    [session setSessionPreset:AVCaptureSessionPresetLow];

    Capture Device

    捕获会话创建后,您需要定义获取您想要使用的设备。它可以摄像头或麦克风。在本例中,我将使用AVMediaTypeVideo类型,支持视频和图片:

    AVCaptureDevice *inputDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];

    Capture Device Input

    下一步,您需要定义的输入捕捉装置,并将它添加到会话。给你:

    AVCaptureDeviceInput *deviceInput = [AVCaptureDeviceInput deviceInputWithDevice:inputDevice error:&error];
    if ( [session canAddInput:deviceInput] )
        [session addInput:deviceInput];

    你检查是否可以添加设备输入会话,如果可以,您添加它

    Preview

    定义设备的输出之前,我想向您展示如何预览摄像机缓冲区。这将是你的相机的取景器,即输入设备的是看到的预览。
    我们可以快速呈现原始数据收集的相机使用AVCaptureVideoPreviewLayer在屏幕上。我们可以使用上面定义的会话我们创建这个预览层,然后将它添加到我们的主要视图层:

    AVCaptureVideoPreviewLayer *previewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session]; 
    [previewLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill];
    
    CALayer *rootLayer = [[self view] layer];
    [rootLayer setMasksToBounds:YES];
    [previewLayer setFrame:CGRectMake(-70, 0, rootLayer.bounds.size.height, rootLayer.bounds.size.height)];
    [rootLayer insertSublayer:previewLayer atIndex:0];

    你不需要做任何额外的工作。你现在可以在你的屏幕上显示摄像机信号。
    如果你想做一些更酷的东西,例如,如果你想处理摄像头信号创建好的视频效果与核心形象或加速框架(给看看这篇文章),您需要收集原始数据生成的相机,处理它们,,如果你喜欢它,它们显示在屏幕上。

    Go baby, go!!!

    我们已经准备好去。您需要做的最后一件事是开始会话:

    [session startRunning];

    Cool stuffs

    由于AVCaptureVideoPreviewLayer是一层,显然可以添加动画。我在这里将一个非常简单的Xcode项目显示前面的概念。它创建一个定制的摄像机预览旋转的三维空间。

    Real-time processing

    如果你想做一些图像处理的原始数据被相机并将结果显示在屏幕上,您需要收集这些数据,处理他们,使他们在屏幕上不使用AVCaptureVideoPreviewLayer。根据你想实现什么,您有两个主要策略:

    1、要么你捕获静止画面就需要一个
    2、你捕捉连续视频缓冲区

    现在,第一种方法是最简单的一个:每当你需要知道相机正在看,你只拍一张照片。相反,如果你想视频缓冲过程,更棘手的,特别是当你的图像处理算法比相机帧速率慢输出。在这里,你需要评估的解决方案更适合你。考虑,这取决于设备你可以得到不同的图像分辨率。例如,iPhone 4 s可以提供8万像素的图像。现在,大量的实时数据处理。所以,如果你正在做实时图像处理,你需要接受一些低质量的图像。

    原文地址

  • 相关阅读:
    Sensor Fusion-based Exploration in Home Environments using Information, Driving and Localization Gains(基于传感器融合的使用信息、驾驶和定位增益在家庭环境中的探索)
    Git中从远程的分支获取最新的版本到本地
    git拉取远程分支到本地分支或者创建本地新分支
    win7下使用git
    ADAS

    struct对齐
    STL容器
    智能指针
    c++中的基本知识点
  • 原文地址:https://www.cnblogs.com/kw-ios/p/3553711.html
Copyright © 2011-2022 走看看