フレーム
まず、全体としてフレームワークの予備的な理解を行うために必要な。
関連するスタックフレームの位置AVFoundation:
ビデオをキャプチャするために、私たちはいくつかのクラス(および他のサブクラス)が必要です。
-
AVCaptureDeviceは、カメラやマイクなどの入力装置を表します。
-
これは、入力データのソースを表すAVCaptureInput
-
AVCaptureOutputは、データ・ソースの出力を表します
-
入力と出力との間のデータフローを調整するAVCaptureSession
そして、そこAVCaptureVideoPreviewLayerカメラはプレビュー機能を提供
このような絵を要約することができます。
例
ビデオストリームをキャプチャするAVFoundationの実用的なアプリケーションは複雑ではありません。
話は安いです、私のコードを表示します。
私たちは、簡単にAVFoundation、他のキャプチャオーディオとビデオをキャプチャするためのコードを使用するプロセスを説明し、プロセスの静止画はほとんど同じです。
1. AVCaputureSessionを作成します。
中央コーディネート入力と出力、最初のステップとして、我々は、セッションを作成する必要があります
AVCaptureSession *セッション= [[AVCaptureSession ALLOC] INIT]。
2. AVCaptureDeviceを作成します。
AVCaptureDevice代わっ入力デバイスを作成します。ここでは、撮像素子を開発しました。
AVCaptureDevice *デバイス= [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]。
3. AVCaptureDeviceInputを作成し、セッションに追加
我々は、デバイスポートの管理を担当AVCaptureDeviceInput利用AVCaptureDeviceInputデバイスがセッションに追加されていることを確認する必要があります。私たちは、デバイスの抽象化としてそれを理解することができます。デバイスは、同時にビデオとオーディオのキャプチャを提供することができます。私たちは、ビデオ入力と音声入力を表すために、それぞれAVCaptureDeviceInputを使用することができます。
NSError *エラー。 AVCaptureDeviceInput *入力= [AVCaptureDeviceInput deviceInputWithDevice:デバイス・エラー:&エラー]。 【セッションaddInput:入力]。
4. AVCaptureOutputを作成します。
セッションからデータを取得するために、我々はAVCaptureOutputを作成する必要があります
AVCaptureVideoDataOutput *出力= [[AVCaptureVideoDataOutput ALLOC] INIT]。
5. [出力デリゲートは、出力がセッションに追加され、プロキシビデオストリーム解析方法
ビデオストリームを分析するために、我々は、出力にデリゲートを設定し、デリゲートメソッドは、どのスレッドで呼び出される指定する必要があります。主な必要性はスレッドが連続でなければならないで、ビデオフレームのことを確実にするために到着しました。
videoDataOutputQueue = dispatch_queue_create( "VideoDataOutputQueue"、DISPATCH_QUEUE_SERIAL)。 [videoDataOutput setSampleBufferDelegate:自己キュー:videoDataOutputQueue]; 【セッションaddOutput:videoDataOutput]。
私たちは、ビデオストリームのデリゲートメソッドを分析することができます。
captureOutput:didOutputSampleBuffer:fromConnection :,
6.スタートキャプチャ
【セッションstartRunning]。
上記の単純な例では、私はAVFoundationは、ビデオストリームが非常に複雑ではありませんキャプチャするために使用するものを見ることができます。フォーカスは、構成の詳細、およびパフォーマンスの問題を知るために使用されるプロセスです。
リアル
基本を学んだ後、のは説明するために、具体的な例を使ってみましょう。
私たちはAVFoundation 2次元コード認識アプリケーションに基づいん:QRCatcher
アプリケーションは、私たちに追加された、AppStoreの 、完全なオープンソース
プロジェクトのアーキテクチャ:
| -モデル | - URLEntity | -ビュー | - QRURLTableViewCell | - QRTabBar | -コントローラ | - QRCatchViewController | - QRURLViewController | -ツール | - NSStringの+ツール | - NSObjectの+マクロ
プロジェクトは複雑ではありません。典型的なMVCアーキテクチャ。
-
のみURLEntity URL情報モデル層は、保存のために捕獲されています。プロジェクトはまた、CoreDataを学ぶための方法です。作業NSFetchedResultsControllerにはとても満足し、良い感じ。
-
ビュー層は、主に連続タブバーのタブバーの高さを変更するため、TableViewCellおよびTabBarのです。
-
二次元コード情報のキャプチャおよび記憶を担当するコントローラ層QRCatchViewController、収集、管理、表示URL情報を担うQRURLViewController。
-
ツールは、クラスの開発を容易にするために、援助の一部です。ツールライブラリから私は通常、このプロジェクトで書かれたメンテナンス(オープンリンク)を収集するために使用するように、URLが正当であるかどうかを確認する機器のタイプを決定し、主にあります。
基本的なインフラの導入後、我々は戻ってAVFoundationモジュールのアップに力を入れ。本プロジェクトでは、2次元コードのスキャンおよび分析を主に担当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を行いました。
概要
ここでは、わずか2次元コードのアプリケーションを介してAVFoundationハンドルビデオストリーミング機能を示すことです。実際には、AVFoundationは多くを行うことができます。編集機能は、処理トラックなどを行うことができます。私たちは、ビデオおよびオーディオ関連トランザクション処理に必要な場合は、サードパーティのソリューションの前に見て続行してください、Appleが私たちをもたらしたこの強力なモジュールを見てみましょう。