AVCaptureDevice
An AVCaptureDevice represents a physical device that provides realtime input media data, such as video and audio.
翻譯:一個AVCaptureDevice
代表一個物理設(shè)備,它提供一個實時的輸入媒體數(shù)據(jù),例如:視頻,音頻;
Each instance of AVCaptureDevice corresponds to a device, such as a camera or microphone. Instances of AVCaptureDevice cannot be created directly. An array of all currently available devices can also be obtained using the AVCaptureDeviceDiscoverySession. Devices can provide one or more streams of a given media type. Applications can search for devices matching desired criteria by using AVCaptureDeviceDiscoverySession, or may obtain a reference to the default device matching desired criteria by using +[AVCaptureDevice defaultDeviceWithDeviceType:mediaType:position:].
翻譯:每個AVCaptureDevice
實例對象都代表著一個設(shè)備,如:相機,麥克風(fēng);一個AVCaptureDevice
實例對象不能被直接創(chuàng)建,可以通過AVCaptureDeviceDiscoverySession
獲取當(dāng)前所有可使用的設(shè)備;設(shè)備可以提供一個或者多個給定的的媒體類型的流;應(yīng)用程序可以搜索獲取設(shè)備通過使用AVCaptureDeviceDiscoverySession
匹配所需的標(biāo)準(zhǔn),或可能獲得一個引用默認(rèn)設(shè)備通過使用匹配所需的標(biāo)準(zhǔn)通過+[AVCaptureDevice defaultDeviceWithDeviceType:mediaType:position:
AVCaptureSession
AVCaptureSession
是AVFoundation
的核心類,用于捕捉視頻和音頻,協(xié)調(diào)視頻和音頻的輸入和輸出流;
To perform a real-time capture, a client may instantiate AVCaptureSession and add appropriate AVCaptureInputs, such as AVCaptureDeviceInput, and outputs, such as AVCaptureMovieFileOutput. [AVCaptureSession startRunning] starts the flow of data from the inputs to the outputs, and [AVCaptureSession stopRunning] stops the flow. A client may set the sessionPreset property to customize the quality level or bitrate of the output.
翻譯:執(zhí)行實時捕獲,一個客戶可以實例化AVCaptureSession
并添加適當(dāng)AVCaptureInputs
,如AVCaptureDeviceInput
和輸出,如AVCaptureMovieFileOutput
。[AVCaptureSession startRunning]
啟動從輸入到輸出的數(shù)據(jù)流,[AVCaptureSession stopRunning]
停止流单寂⊙悸郑客戶端可以設(shè)置sessionPreset
屬性來定制輸出的質(zhì)量級別或比特率逮诲。
AVCaptureInput
AVCaptureInput
它是一個抽象類制恍,提供一個實例對象將捕獲到的輸入源鏈接到AVCaptureSession
上沪羔。既然是抽象類我們顯然是無法直接使用的赁酝,所以我們只能用其子類AVCaptureDeviceInput
、AVCaptureScreenInput
和AVCaptureMetadataInput
來創(chuàng)建;
-
AVCaptureDeviceInput
:使用該對象從AVCaptureDevice
設(shè)備獲取媒體數(shù)據(jù)紊浩,該對象將會被添加給AVCaptureSession
管理窖铡。 -
AVCaptureScreenInput
:使用該對象從屏幕獲取數(shù)據(jù)(用于錄制屏幕).該對象將會被添加給AVCaptureSeesion
管理。 -
AVCaptureMetaDataInput
:獲取元數(shù)據(jù)(很少使用).
AVCaptureOutput
AVCaptureOutput
:相對應(yīng)于AVCaptureInput
坊谁,它也是一個抽象類费彼,用來接收各種輸出數(shù)據(jù),為AVCaptureSession
提供一個輸出目標(biāo)接口口芍。所以我們還是只能使用其子類
AVCaptureStillImageOutput //使用AVCapturePhotoOutput替代了
AVCaptureVideoDataOutput //可以用來處理被捕獲的視頻中未壓縮或壓縮的幀箍铲。
AVCaptureAudioDataOutput //可以用來處理從音頻捕獲的未壓縮或壓縮的樣本
AVCaptureMetadataOutput //可以用來處理附加連接中的元數(shù)據(jù)對象
AVCaptureFileOutput //文件輸出可以開始記錄到一個新的文件使用startRecordingToOutputFileURL:recordingDelegate:方法
AVCapturePhotoOutput //它支持照片捕捉生活,preview-sized圖像傳遞,廣泛的顏色,原生,原生+JPG和 原生+ DNG格式
AVCaptureVideoPreviewLayer
AVCaptureVideoPreviewLayer
視頻預(yù)覽層,其實可以把它想象成一個畫布鬓椭,我們通過攝像頭拍攝到的畫面就顯示在這個畫布上颠猴。AVCaptureVideoPreviewLayer
所呈現(xiàn)的畫面是連續(xù)的,并非單張的靜態(tài)影像小染,當(dāng)然你也可以略過設(shè)定 AVCaptureVideoPreviewLayer
的步驟翘瓮,不顯示攝影機所拍攝到的畫面,這并不會有任何影響裤翩。它是CALayer
的子類资盅,它可以實時查看拍照或視頻錄制效果,需要指定對應(yīng)的 AVCaptureSession
對象;
基礎(chǔ)使用
//獲取攝像機
AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
//創(chuàng)建會話對象
self.session = [[AVCaptureSession alloc] init];
//設(shè)置會話采集率
self.session.sessionPreset = AVCaptureSessionPresetHigh;
//創(chuàng)建設(shè)備輸入流
AVCaptureDeviceInput *deviceInput = [AVCaptureDeviceInput deviceInputWithDevice:device error:nil];
// AVCaptureScreenInput
//創(chuàng)建數(shù)據(jù)輸出流
AVCaptureMetadataOutput *metadataOuput = [[AVCaptureMetadataOutput alloc] init];
// AVCaptureStillImageOutput
// AVCaptureVideoDataOutput
// AVCaptureAudioDataOutput
// AVCaptureMetadataOutput
// AVCaptureFileOutput
// AVCapturePhotoOutput
[metadataOuput setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
//創(chuàng)建設(shè)備輸出流
// AVCaptureVideoDataOutput *videoDataOutput = [[AVCaptureVideoDataOutput alloc] init];
// [videoDataOutput setSampleBufferDelegate:self queue:dispatch_get_main_queue()];
//設(shè)置掃描范圍(每一個取值0~1,以屏幕右上角為坐標(biāo)原點)
metadataOuput.rectOfInterest = CGRectMake(0.05, 0.2, 0.7, 0.6);
//添加設(shè)備輸入流到會話對象
if ([self.session canAddInput:deviceInput]) {
[self.session addInput:deviceInput];
}
//添加設(shè)備輸出流到會話對象
if ([self.session canAddOutput:metadataOuput]) {
[self.session addOutput:metadataOuput];
}
// [self.session addOutput:videoDataOutput];
//設(shè)置設(shè)備輸出類型;此處為只支持二維碼,需要支持條形碼的再添加AVMetadataObjectTypeCode128Code
metadataOuput.metadataObjectTypes = @[AVMetadataObjectTypeQRCode];
//實例化預(yù)覽圖層, 傳遞_session是為了告訴圖層將來顯示什么內(nèi)容
self.videoPreviewLayer = [AVCaptureVideoPreviewLayer layerWithSession:self.session];
// 保持縱橫比呵扛;填充層邊界
self.videoPreviewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
self.videoPreviewLayer.frame = CGRectMake(0, 0, K_Screen_Width, K_Screen_Height);
[self.view.layer insertSublayer:self.videoPreviewLayer atIndex:0];
// 啟動會話
[self.session startRunning];
//此代理方法為掃碼之后獲取的二維碼信息,在這里可以請求登錄
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection {
}