рамка
Во-первых, нам нужно было сделать предварительное понимание структуры в целом.
AVFoundation соответствующей позиции стеки кадра:
Для захвата видео, так что нам нужно несколько классов (и других подклассов).
-
AVCaptureDevice представляет собой входные устройства, такие как камеры и микрофоны.
-
Он представляет собой источник входных данных AVCaptureInput
-
AVCaptureOutput представляет собой выход источника данных
-
AVCaptureSession для координации потока данных между входом и выходом
И AVCaptureVideoPreviewLayer камера обеспечивает функцию предварительного просмотра
Такая картина может быть кратко:
пример
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
Заявка была добавлена в наш 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]; }
在这里我们可以看到和上面创建捕捉视频流的步骤基本是一致的。
也就是
-
创建session
-
创建device
-
创建input
-
创建output。
这里是与捕捉视频流所不一致的地方。我们捕捉视频流需要的是AVCaptureVideoDataOutput,而在这里我们需要捕捉的是二维码信息。因此我们需要AVCaptureMetadataOutput。并且我们需要指定捕捉的metadataObject类型。在这里我们指定的是AVMetadataObjectTypeQRCode,我们还可以指定其他类型,例如PDF417条码类型。
完整的可指定列表可以在这里找到。
然后我们还要指定处理这些信息的delegate与队列。
-
开始录制
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, привела нас.