AVFoundation обработки видео потока

рамка

Во-первых, нам нужно было сделать предварительное понимание структуры в целом.

AVFoundation соответствующей позиции стеки кадра:

1.jpg

Для захвата видео, так что нам нужно несколько классов (и других подклассов).

  • AVCaptureDevice представляет собой входные устройства, такие как камеры и микрофоны.

  • Он представляет собой источник входных данных AVCaptureInput

  • AVCaptureOutput представляет собой выход источника данных

  • AVCaptureSession для координации потока данных между входом и выходом

И AVCaptureVideoPreviewLayer камера обеспечивает функцию предварительного просмотра

Такая картина может быть кратко: 

2.jpg

пример

AVFoundation практическое применение для захвата видеопотока не сложно.

Обсуждение дешево, Покажите мне код.

Мы кратко опишем процесс использования кода для захвата видео с AVFoundation, другой захват аудио, неподвижные изображения процесса является то же самое.

1. Создать AVCaputureSession.

В качестве центрального входа координирующего и выхода, первого шага мы должны создать сеанс

AVCaptureSession * сессия = [[AVCaptureSession Alloc] инициализации];

2. Создать AVCaptureDevice

Создание устройства AVCaptureDevice ввода имени. Здесь мы разработали устройство формирования изображения.

    AVCaptureDevice * Устройство = [AVCaptureDevice defaultDeviceWithMediaType: AVMediaTypeVideo];

3. Создать AVCaptureDeviceInput, и добавил к сессии

Мы должны использовать AVCaptureDeviceInput устройство добавляется к сеансу, AVCaptureDeviceInput отвечает за управление портом устройства. Мы можем понять это как абстракция устройства. Устройство может быть в состоянии предоставить видео и аудио захвата одновременно. Мы можем использовать AVCaptureDeviceInput соответственно представлять видеовход и аудио вход.

NSError * ошибка; 
AVCaptureDeviceInput * вход = [AVCaptureDeviceInput deviceInputWithDevice: ошибка устройства: & ошибка]; 
[сессии addInput: ввод];

4. Создать AVCaptureOutput

Для того, чтобы получить данные из сессии, нам нужно создать AVCaptureOutput

    AVCaptureVideoDataOutput * Выход = [[AVCaptureVideoDataOutput Alloc] инициализации];

5. Установить выходной делегат, выходной сигнал добавляется к сессии, метод анализа потока прокси-видео

Для анализа видеопотока, нам нужно установить делегат для вывода, и указать метод делегата вызывается в каком потоке. Основная потребность Нить должна быть последовательной, видео кадры поступают для того, чтобы гарантировать, что.

videoDataOutputQueue = dispatch_queue_create ( "VideoDataOutputQueue", DISPATCH_QUEUE_SERIAL); 
[videoDataOutput setSampleBufferDelegate: сама очередь: videoDataOutputQueue]; 
[сессии addOutput: videoDataOutput];

Мы можем проанализировать метод видеопоток делегата.

captureOutput: didOutputSampleBuffer: fromConnection :,

6. Запустите Capture

[Сессии startRunning];

На простом примере выше, я могу увидеть, что использовать AVFoundation для захвата видеопотока не очень сложна. Акцент делается на процесс, используемый, чтобы узнать подробности конфигурации, а также проблемы с производительностью.

реальный

После изучения основ, давайте использовать конкретный пример для иллюстрации.

Мы AVFoundation на основе двумерного приложений распознавания кода: QRCatcher

3.jpg

Заявка была добавлена в наш AppStore  и полный открытый исходный код

Архитектура проекта:

| - Модель 
    | - URLEntity 
| - Посмотреть 
    | - QRURLTableViewCell 
    | - QRTabBar 
| - Контроллер 
    | - QRCatchViewController 
    | - QRURLViewController 
| - Инструменты 
    | - NSString + Tools 
    | - NSObject + Macro

Проект не является сложным. Типичная архитектура MVC.

  • Модель слой только информация URLEntity URL захватывается для хранения. Проект также способ узнать о CoreData. Чувствовать себя хорошо, очень доволен работой NSFetchedResultsController.

  • Посмотреть слой представляет собой TableViewCell и TabBar, главным образом, для изменения преемственности TabBar высоты TabBar.

  • слой QRCatchViewController контроллера отвечает за улавливание и хранение двухмерной кодовой информации, QRURLViewController ответственности за информацию управления и отображение URL собранной.

  • Инструменты некоторые из помощи в целях содействия развитию класса. Из библиотеки инструментов я обычно использую для сбора письменного обслуживания (открыть ссылку) в этом проекте, в основном, чтобы проверить, является ли законна URL, определить тип оборудования и так далее.

После введения базовой инфраструктуры, мы помещаем энергию обратно в модуль до AVFoundation. В этом проекте, AVFoundation в первую очередь отвечает за сканирование и анализ двумерного кода.

我们直接来看QRCatchViewController中涉及的代码。

对于我们这个应用来说,只需两步核心步骤即可。

1.设置AVFoundation

- (void)setupAVFoundation
{
    //session
    self.session = [[AVCaptureSession alloc] init];
    //device
    AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
    NSError *error = nil;
    //input
    AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:&error];
    if(input) {
        [self.session addInput:input];
    } else {
        NSLog(@"%@", error);
        return;
    }
    //output
    AVCaptureMetadataOutput *output = [[AVCaptureMetadataOutput alloc] init];
    [self.session addOutput:output];
    [output setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]];
    [output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
    //add preview layer
    self.previewLayer = [AVCaptureVideoPreviewLayer layerWithSession:self.session];
    [self.preview.layer addSublayer:self.previewLayer];
    //start
    [self.session startRunning];
}

在这里我们可以看到和上面创建捕捉视频流的步骤基本是一致的。

也就是

  1. 创建session

  2. 创建device

  3. 创建input

  4. 创建output。

    这里是与捕捉视频流所不一致的地方。我们捕捉视频流需要的是AVCaptureVideoDataOutput,而在这里我们需要捕捉的是二维码信息。因此我们需要AVCaptureMetadataOutput。并且我们需要指定捕捉的metadataObject类型。在这里我们指定的是AVMetadataObjectTypeQRCode,我们还可以指定其他类型,例如PDF417条码类型。

    完整的可指定列表可以在这里找到。

    然后我们还要指定处理这些信息的delegate与队列。

  5. 开始录制

2.实现代理方法:

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection
{
    for (AVMetadataMachineReadableCodeObject *metadata in metadataObjects) {
        if ([metadata.type isEqualToString:AVMetadataObjectTypeQRCode]) {
            self.borderView.hidden = NO;
            if ([metadata.stringValue isURL])
            {
                [[UIApplication sharedApplication] openURL:[NSString HTTPURLFromString:metadata.stringValue]];
                [self insertURLEntityWithURL:metadata.stringValue];
                self.stringLabel.text = metadata.stringValue;
            }
            else
            {
                self.stringLabel.text = metadata.stringValue; 
            } 
        } 
    } 
}

Нам необходимо получить данные, в которых метода прокси, и обрабатываются в соответствии с их потребностями. Здесь я просто выполнил тест URL, если да, то открыт браузер сафари.

резюме

Здесь просто показать AVFoundation ручки возможности потокового видео посредством применения двумерного кода. На самом деле, AVFoundation быть в состоянии сделать больше. Функции редактирования могут быть выполнены, трек обработки и тому подобное. Если нам нужно видео и аудио обработке транзакций, связанные, вы можете продолжить глядя перед тем сторонними решениями, взгляните на этом мощном модуле Apple, привела нас.

рекомендация

отwww.cnblogs.com/pioneerMax/p/11419646.html
рекомендация