1. 程式人生 > >通過AVFoundation框架獲取攝像頭資料

通過AVFoundation框架獲取攝像頭資料

一、概述 從iOS4開始,AVFoundation框架增加了幾個類,AVCaptureDevice、AVCaptureSession等,可以獲取攝像頭的資料,而不會彈出類似於ImagePicker一樣的介面,我們可以將資料轉為一張張的圖片,然後我們可以即時顯示在檢視上,也可以使用FFMPEG或者其它的視訊編碼工具,來合成視訊。 二、步驟 第一步:建立AVCaptureSession,新增輸入,輸出源 #import <AVFoundation/AVFoundation.h> //建立並配置一個攝像會話,並啟動。 - (void)setupCaptureSession
{     NSError *error = nil;     //建立會話     AVCaptureSession *session = [[AVCaptureSession alloc] init];     //設定視訊質量     session.sessionPreset = AVCaptureSessionPresetMedium;     //獲取合適的AVCaptureDevice     AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
    //建立裝置輸入流,並增加到會話。     AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device                                                                     error:&error];     if (!input) {         //處理錯誤     }     [session addInput:input];     //建立一個視訊輸出流,並增加到會話。     AVCaptureVideoDataOutput *output = [[[AVCaptureVideoDataOutput alloc] init] autorelease];
    [session addOutput:output];     //配置輸出流     dispatch_queue_t queue = dispatch_queue_create("myQueue", NULL);     [output setSampleBufferDelegate:self queue:queue];     dispatch_release(queue);     //指定畫素格式。     output.videoSettings = [NSDictionary dictionaryWithObject:       [NSNumber numberWithInt:kCVPixelFormatType_32BGRA] forKey:(id)kCVPixelBufferPixelFormatTypeKey];     //設定FPS     output.minFrameDuration = CMTimeMake(1, 15);     //啟動會話     [session startRunning];     //將會話與當前控制器關聯     [self setSession:session]; } 第二步:實現AVCaptureVideoDataOutputSampleBufferDelegate協議方法 //當取樣資料被寫入緩衝區時呼叫 - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer          fromConnection:(AVCaptureConnection *)connection {     //抽取取樣資料,合成UIImage物件     UIImage *image = [self imageFromSampleBuffer:sampleBuffer];     //後續自定義處理     xxxxxxxx } //抽取取樣資料,合成UIImage物件 - (UIImage *)imageFromSampleBuffer:(CMSampleBufferRef) sampleBuffer {     CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);     //鎖定畫素緩衝區的起始地址     CVPixelBufferLockBaseAddress(imageBuffer,0);     //獲取每行畫素的位元組數     size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer);     //獲取畫素緩衝區的寬度和高度     size_t width = CVPixelBufferGetWidth(imageBuffer);     size_t height = CVPixelBufferGetHeight(imageBuffer);     //建立基於裝置的RGB顏色空間     CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();     if (!colorSpace)     {         NSLog(@"CGColorSpaceCreateDeviceRGB failure");         return nil;     }     //獲取畫素緩衝區的起始地址     void *baseAddress = CVPixelBufferGetBaseAddress(imageBuffer);     //獲取畫素緩衝區的資料大小     size_t bufferSize = CVPixelBufferGetDataSize(imageBuffer);     //使用提供的資料建立CGDataProviderRef     CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, baseAddress, bufferSize,NULL);     //通過CGDataProviderRef,建立CGImageRef     CGImageRef cgImage =         CGImageCreate(width,                         height,                         8,                         32,                         bytesPerRow,                         colorSpace,                         kCGImageAlphaNoneSkipFirst | kCGBitmapByteOrder32Little,                         provider,                         NULL,                         true,                         kCGRenderingIntentDefault);     CGDataProviderRelease(provider);     CGColorSpaceRelease(colorSpace);     //建立UIImage     UIImage *image = [UIImage imageWithCGImage:cgImage];     CGImageRelease(cgImage);     //解鎖畫素緩衝區起始地址     CVPixelBufferUnlockBaseAddress(imageBuffer, 0);     return image; }

相關推薦

通過AVFoundation框架獲取攝像頭資料

一、概述 從iOS4開始,AVFoundation框架增加了幾個類,AVCaptureDevice、AVCaptureSession等,可以獲取攝像頭的資料,而不會彈出類似於ImagePicker

jQuery-select2通過ajax請求獲取遠端資料

1. 預設傳送的查詢引數 term : The current search term in the search box. q : Contains the same contents as term. _type: A “request type”.

使用OkHttp3框架獲取伺服器資料

OkHttp3框架的使用 1.匯入okhttp的jar包 切換到project下,將okhttp-3.2.0.jar和okio-1.12.0放到app/libs下,為專案匯入該jar包,右鍵jar包Add As Library選擇需要匯入的專案即可成功匯入。 或在需要匯

IOS4直接獲取攝像頭資料

需要新增的framework:CoreMedia,CoreVideo,QuartzCore,AVFoundation MyAVController.h: 1 2 3 4 5 6 7 8 9

OpenCV獲取攝像頭資料並顯示在窗口裡 Python實現

import cv2 clicked = False def onMouse(event, x, y, flags, param): global clicked if event == cv2.EVENT_LBUTTONUP:

FFmpeg獲取攝像頭資料並編碼為H.264

       ffmpeg的視音訊編解碼功能非常強大,可以說包括了所有的視音訊編碼標準。在這裡我主要是呼叫ffmpeg工程裡的ffmpeg.exe檔案,呼叫之後,會自動完成編碼的操作。內部編碼的具體流程,以後再慢慢的看。1.介紹       先介紹下ffmpeg裡面的三個ex

通過圖片url獲取圖片資料

//此方法的作用是使下面的方法可以獲取https的圖片資料private static void trustAllHosts() { try { SSLContext sc = SSLContext.getInstance("TLS");

jquery如何通過ajax請求獲取後臺資料顯示在表格上

1.引入bootstrap和jquery的cdn <link rel="stylesheet" type="text/css" href="https://cdn.bootcss.com/bo

Linux 獲取攝像頭資料並實時顯示

聯想筆記本z475,Ubuntu16; 使用v4l2獲取攝像頭資料; 使用SDL來顯示YUV資料; #include<fcntl.h> #include<unistd.h> #include<stdio.h> #include<s

通過開源框架AsyncHttpClient獲取Json資料

json簡介 Json詳細解析可見 http://redarmychen.iteye.com/blog/980243 JSON是JavaScript Object Notation的縮寫,可見JSON來源於JavaScript。JSON資料是一系列鍵值對的集合。 下面

Vue.js 通過jQuery ajax獲取資料實現更新後重新渲染頁面

1. 引入jquery和vue.js <script type="text/javascript" src="http://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script> <script

VC++6.0下基於MFC框架利用CInternetSession和CHttpFile獲取網頁資料(附程式碼)

例:從網站http://qq.ip138.com/weather/guangdong/GuangZhou.htm獲取近三天的日期、天氣、溫度、風向,程式碼如下: //新增標頭檔案 #include <afxinet.h> //獲取網路資料 void CSensorSysDlg:

android獲取攝像頭視訊幀資料

1.思路 一.通過android的Camera.setPreviewCallback(PreviewCallback cb)監聽回撥. 二.此回撥函式public void onPreviewFrame(byte[] data, Camera camera)每回調一次就是

bootstrap table通過ajax獲取後臺資料展示在table

1. 背景 bootstrap table 預設向後臺傳送語法的dataType為 json,但是為了解決跨域問題我們需要將dataType改為jsonp,這時就需要修改bootstrap table獲取後臺資料的方式,採用$('#table').bootstrap

post提交的資料有哪幾種編碼格式?能否通過URL引數獲取使用者賬戶密碼

這裡是修真院前端小課堂,每篇分享文從 【背景介紹】【知識剖析】【常見問題】【解決方案】【編碼實戰】【擴充套件思考】【更多討論】【參考文獻】 八個方面深度解析前端知識/技能,本篇分享的是: 【post提交的資料有哪幾種編碼格式?能否通過URL引數獲取使用者賬戶密碼】 1.背景介紹 HTTP/1.1 協

java 資料視覺化(二)通過jdbc訪問資料庫,在servlet上獲取資料庫資料

想要通過servlet獲取資料庫資料,首先需要建立jdbc 因為資料是通過無線感測傳到資料庫的,因此jdbc裡只有查詢操作,增刪改的同學可以自行新增。 程式碼中被註釋掉的部分用於測試。 main函式部分用於檢測是否連線上資料庫,並檢測是否能讀到資料,若是讀得到

ROS下利用Python和OpenCVC分別實現筆記本攝像頭/USB攝像頭/監控IP攝像頭資料獲取

說明: 最近的一個小任務,記錄一下,希望對以後有幫助吧: -———————————————————————————————————————————————— 參考帖子 一、先利用python實現筆記本攝像頭/USB攝像頭的資料的獲取: 程式碼如下: i

通過後臺SQL獲取分頁資料,在使用VUE-Element-Table 表格選擇多行資料時,怎樣在

在專案中,分頁是由後臺SQL獲取。在table表格多選時,容易把選中的值傳給後臺,但是怎樣在返回上一頁時怎樣記住表格多選的資料?? 當返回第二頁時,應該把第一條資料再選中,保持選擇狀態。 具體思路:在頁面不重新重新整理載入時,使用二維陣列儲存el-table表格多選結果。其中一維

Python之通過API獲取資料庫資料

後臺給出一個API,需要通過API來獲取資料。需要藉助 import requests url = "http://XXXXXX" token = "XXXXXX" def get_username(token): headers = {"Authorizati

mtk 電池驅動的電壓,電流,溫度等資料通過adc通道獲取

mtk 電池驅動的電壓,電流,溫度等資料通過adc通道獲取 pmic BATSNS 引腳電壓 bat_vol = battery_meter_get_battery_voltage(KAL_TRUE);