zoukankan      html  css  js  c++  java
  • iOS 使用 AVCaptureVideoDataOutputSampleBufferDelegate获取实时拍照的视频流

    iOS 使用 AVCaptureVideoDataOutputSampleBufferDelegate获取实时拍照的视频流

    • 可用于实时视频聊天
    • 实时视频远程监控
    #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];
    }
     
    // 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
    {
        // Get a CMSampleBuffer's Core Video image buffer for the media data
        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
        void *baseAddress = CVPixelBufferGetBaseAddress(imageBuffer);
     
        // 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();
     
        // Create a bitmap graphics context with the sample buffer data
        CGContextRef context = CGBitmapContextCreate(baseAddress, width, height, 8,
          bytesPerRow, colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst);
        // Create a Quartz image from the pixel data in the bitmap graphics context
        CGImageRef quartzImage = CGBitmapContextCreateImage(context);
        // Unlock the pixel buffer
        CVPixelBufferUnlockBaseAddress(imageBuffer,0);
     
        // Free up the context and color space
        CGContextRelease(context);
        CGColorSpaceRelease(colorSpace);
     
        // Create an image object from the Quartz image
        UIImage *image = [UIImage imageWithCGImage:quartzImage];
     
        // Release the Quartz image
        CGImageRelease(quartzImage);
     
        return (image);
    }

    参考:https://developer.apple.com/library/ios/qa/qa1702/_index.html

  • 相关阅读:
    K8S集群组件
    K8S概念
    yaml格式
    Linux下升级openssl
    cpu的核心数及线程关系
    bzoj4941: [Ynoi2016]镜子里的昆虫
    bzoj4940: [Ynoi2016]这是我自己的发明
    bzoj4939: [Ynoi2016]掉进兔子洞
    bzoj4867: [Ynoi2017]舌尖上的由乃
    bzoj 4866: [Ynoi2017]由乃的商场之旅
  • 原文地址:https://www.cnblogs.com/cocoajin/p/3494300.html
Copyright © 2011-2022 走看看