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万像素的图像。现在,大量的实时数据处理。所以,如果你正在做实时图像处理,你需要接受一些低质量的图像。

    原文地址

  • 相关阅读:
    LeetCode(287)Find the Duplicate Number
    LeetCode(290) Word Pattern
    LeetCode(205)Isomorphic Strings
    LeetCode(201) Bitwise AND of Numbers Range
    LeetCode(200) Number of Islands
    LeetCode(220) Contains Duplicate III
    LeetCode(219) Contains Duplicate II
    命令行执行Qt程序
    LeetCode(228) Summary Ranges
    redis 的安装和使用记录
  • 原文地址:https://www.cnblogs.com/kw-ios/p/3553711.html
Copyright © 2011-2022 走看看