iOS拍照和視訊錄製
在iOS中要拍照和錄製視訊最簡單的方法就是使用UIImagePickerController。UIImagePickerController繼承於UINavigationController。
首先看一下這個類常用的屬性和方法:
屬性 | 說明 |
@property(nonatomic) UIImagePickerControllerSourceType sourceType |
拾取源型別,sourceType是列舉型別: UIImagePickerControllerSourceTypePhotoLibrary:照片庫 ,預設值 UIImagePickerControllerSourceTypeCamera:攝像頭 UIImagePickerControllerSourceTypeSavedPhotosAlbum:相簿 |
@property(nonatomic,copy) NSArray *mediaTypes | 媒體型別,預設情況下此陣列包含kUTTypeImage,所以拍照時可以不用設定;但是當要錄影的時候必須設定,可以設定為kUTTypeVideo(視訊,但不帶聲音)或者kUTTypeMovie(視訊並帶有聲音) |
@property(nonatomic) NSTimeInterval videoMaximumDuration | 視訊最大錄製時長,預設為10 s |
@property(nonatomic) UIImagePickerControllerQualityType videoQuality |
視訊質量,列舉型別: UIImagePickerControllerQualityTypeHigh:高清質量 UIImagePickerControllerQualityTypeMedium:中等質量,適合WiFi傳輸 UIImagePickerControllerQualityTypeLow:低質量,適合蜂窩網傳輸 UIImagePickerControllerQualityType640x480:640*480 UIImagePickerControllerQualityTypeIFrame1280x720:1280*720 UIImagePickerControllerQualityTypeIFrame960x540:960*540 |
@property(nonatomic) BOOL showsCameraControls | 是否顯示攝像頭控制面板,預設為YES |
@property(nonatomic,retain) UIView *cameraOverlayView | 攝像頭上覆蓋的檢視,可用通過這個視訊來自定義拍照或錄影介面 |
@property(nonatomic) CGAffineTransform cameraViewTransform | 攝像頭形變 |
@property(nonatomic) UIImagePickerControllerCameraCaptureMode cameraCaptureMode |
攝像頭捕獲模式,捕獲模式是列舉型別: UIImagePickerControllerCameraCaptureModePhoto:拍照模式 UIImagePickerControllerCameraCaptureModeVideo:視訊錄製模式 |
@property(nonatomic) UIImagePickerControllerCameraDevice cameraDevice |
攝像頭裝置,cameraDevice是列舉型別: UIImagePickerControllerCameraDeviceRear:前置攝像頭 UIImagePickerControllerCameraDeviceFront:後置攝像頭 |
@property(nonatomic) UIImagePickerControllerCameraFlashMode cameraFlashMode |
閃光燈模式,列舉型別: UIImagePickerControllerCameraFlashModeOff:關閉閃光燈 UIImagePickerControllerCameraFlashModeAuto:閃光燈自動 UIImagePickerControllerCameraFlashModeOn:開啟閃光燈 |
類方法 | 說明 |
+ (BOOL)isSourceTypeAvailable:(UIImagePickerControllerSourceType)sourceType |
指定的源型別是否可用,sourceType是列舉型別: UIImagePickerControllerSourceTypePhotoLibrary:照片庫 UIImagePickerControllerSourceTypeCamera:攝像頭 UIImagePickerControllerSourceTypeSavedPhotosAlbum:相簿 |
+ (NSArray *)availableMediaTypesForSourceType:(UIImagePickerControllerSourceType)sourceType | 指定的源裝置上可用的媒體型別,一般就是圖片和視訊 |
+ (BOOL)isCameraDeviceAvailable:(UIImagePickerControllerCameraDevice)cameraDevice |
指定的攝像頭是否可用,cameraDevice是列舉型別: UIImagePickerControllerCameraDeviceRear:前置攝像頭 UIImagePickerControllerCameraDeviceFront:後置攝像頭 |
+ (BOOL)isFlashAvailableForCameraDevice:(UIImagePickerControllerCameraDevice)cameraDevice | 指定攝像頭的閃光燈是否可用 |
+ (NSArray *)availableCaptureModesForCameraDevice:(UIImagePickerControllerCameraDevice)cameraDevice |
獲得指定攝像頭上的可用捕獲模式,捕獲模式是列舉型別: UIImagePickerControllerCameraCaptureModePhoto:拍照模式 UIImagePickerControllerCameraCaptureModeVideo:視訊錄製模式 |
物件方法 | 說明 |
- (void)takePicture | 程式設計方式拍照 |
- (BOOL)startVideoCapture | 程式設計方式錄製視訊 |
- (void)stopVideoCapture | 程式設計方式停止錄製視訊 |
代理方法 | 說明 |
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info | 媒體拾取完成 |
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker | 取消拾取 |
擴充套件方法(主要用於儲存照片、視訊到相簿) | 說明 |
UIImageWriteToSavedPhotosAlbum(UIImage *image, id completionTarget, SEL completionSelector, void *contextInfo) | 儲存照片到相簿 |
UIVideoAtPathIsCompatibleWithSavedPhotosAlbum(NSString *videoPath) | 能否將視訊儲存到相簿 |
void UISaveVideoAtPathToSavedPhotosAlbum(NSString *videoPath, id completionTarget, SEL completionSelector, void *contextInfo) | 儲存視訊到相簿 |
要用UIImagePickerController來拍照或者錄製視訊通常可以分為如下步驟:
- 建立UIImagePickerController物件。
- 指定拾取源,平時選擇照片時使用的拾取源是照片庫或者相簿,此刻需要指定為攝像頭型別。
- 指定攝像頭,前置攝像頭或者後置攝像頭。
- 設定媒體型別mediaType,注意如果是錄影必須設定,如果是拍照此步驟可以省略,因為mediaType預設包含kUTTypeImage(注意媒體型別定義在MobileCoreServices.framework中)
- 指定捕獲模式,拍照或者錄製視訊。(視訊錄製時必須先設定媒體型別再設定捕獲模式
- )
- 展示UIImagePickerController(通常以模態視窗形式開啟)。
- 拍照和錄製視訊結束後在代理方法中展示/儲存照片或視訊。
當然這個過程中有很多細節可以設定,例如是否顯示拍照控制面板,拍照後是否允許編輯等等,通過上面的屬性/方法列表相信並不難理解。下面就以一個示例展示如何使用UIImagePickerController來拍照和錄製視訊,下面的程式中只要將_isVideo設定為YES就是視訊錄製模式,錄製完後在主檢視控制器中自動播放;如果將_isVideo設定為NO則為拍照模式,拍照完成之後在主檢視控制器中顯示拍攝的照片
// // ViewController.m // UIImagePickerController // // Created by Kenshin Cui on 14/04/05. // Copyright (c) 2014年 cmjstudio. All rights reserved. // #import "ViewController.h" #import <MobileCoreServices/MobileCoreServices.h> #import <AVFoundation/AVFoundation.h> @interface ViewController ()<UIImagePickerControllerDelegate,UINavigationControllerDelegate> @property (assign,nonatomic) int isVideo;//是否錄製視訊,如果為1表示錄製視訊,0代表拍照 @property (strong,nonatomic) UIImagePickerController *imagePicker; @property (weak, nonatomic) IBOutlet UIImageView *photo;//照片展示檢視 @property (strong ,nonatomic) AVPlayer *player;//播放器,用於錄製完視訊後播放視訊 @end @implementation ViewController #pragma mark - 控制器檢視事件 - (void)viewDidLoad { [super viewDidLoad]; //通過這裡設定當前程式是拍照還是錄製視訊 _isVideo=YES; } #pragma mark - UI事件 //點選拍照按鈕 - (IBAction)takeClick:(UIButton *)sender { [self presentViewController:self.imagePicker animated:YES completion:nil]; } #pragma mark - UIImagePickerController代理方法 //完成 -(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{ NSString *mediaType=[info objectForKey:UIImagePickerControllerMediaType]; if ([mediaType isEqualToString:(NSString *)kUTTypeImage]) {//如果是拍照 UIImage *image; //如果允許編輯則獲得編輯後的照片,否則獲取原始照片 if (self.imagePicker.allowsEditing) { image=[info objectForKey:UIImagePickerControllerEditedImage];//獲取編輯後的照片 }else{ image=[info objectForKey:UIImagePickerControllerOriginalImage];//獲取原始照片 } [self.photo setImage:image];//顯示照片 UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);//儲存到相簿 }else if([mediaType isEqualToString:(NSString *)kUTTypeMovie]){//如果是錄製視訊 NSLog(@"video..."); NSURL *url=[info objectForKey:UIImagePickerControllerMediaURL];//視訊路徑 NSString *urlStr=[url path]; if (UIVideoAtPathIsCompatibleWithSavedPhotosAlbum(urlStr)) { //儲存視訊到相簿,注意也可以使用ALAssetsLibrary來儲存 UISaveVideoAtPathToSavedPhotosAlbum(urlStr, self, @selector(video:didFinishSavingWithError:contextInfo:), nil);//儲存視訊到相簿 } } [self dismissViewControllerAnimated:YES completion:nil]; } -(void)imagePickerControllerDidCancel:(UIImagePickerController *)picker{ NSLog(@"取消"); } #pragma mark - 私有方法 -(UIImagePickerController *)imagePicker{ if (!_imagePicker) { _imagePicker=[[UIImagePickerController alloc]init]; _imagePicker.sourceType=UIImagePickerControllerSourceTypeCamera;//設定image picker的來源,這裡設定為攝像頭 _imagePicker.cameraDevice=UIImagePickerControllerCameraDeviceRear;//設定使用哪個攝像頭,這裡設定為後置攝像頭 if (self.isVideo) { [email protected][(NSString *)kUTTypeMovie]; _imagePicker.videoQuality=UIImagePickerControllerQualityTypeIFrame1280x720; _imagePicker.cameraCaptureMode=UIImagePickerControllerCameraCaptureModeVideo;//設定攝像頭模式(拍照,錄製視訊) }else{ _imagePicker.cameraCaptureMode=UIImagePickerControllerCameraCaptureModePhoto; } _imagePicker.allowsEditing=YES;//允許編輯 _imagePicker.delegate=self;//設定代理,檢測操作 } return _imagePicker; } //視訊儲存後的回撥 - (void)video:(NSString *)videoPath didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo{ if (error) { NSLog(@"儲存視訊過程中發生錯誤,錯誤資訊:%@",error.localizedDescription); }else{ NSLog(@"視訊儲存成功."); //錄製完之後自動播放 NSURL *url=[NSURL fileURLWithPath:videoPath]; _player=[AVPlayer playerWithURL:url]; AVPlayerLayer *playerLayer=[AVPlayerLayer playerLayerWithPlayer:_player]; playerLayer.frame=self.photo.frame; [self.photo.layer addSublayer:playerLayer]; [_player play]; } } @end
AVFoundation拍照和錄製視訊
不得不說UIImagePickerController確實強大,但是與MPMoviePlayerController類似,由於它的高度封裝性,要進行某些自定義工作就比較複雜了。例如要做出一款類似於美顏相機的拍照介面就比較難以實現了,此時就可以考慮使用AVFoundation來實現。AVFoundation中提供了很多現成的播放器和錄音機,但是事實上它還有更加底層的內容可以供開發者使用。因為AVFoundation中抽了很多和底層輸入、輸出裝置打交道的類,依靠這些類開發人員面對的不再是封裝好的音訊播放器AVAudioPlayer、錄音機(AVAudioRecorder)、視訊(包括音訊)播放器AVPlayer,而是輸入裝置(例如麥克風、攝像頭)、輸出裝置(圖片、視訊)等。首先了解一下使用AVFoundation做拍照和視訊錄製開發用到的相關類:
AVCaptureSession:媒體(音、視訊)捕獲會話,負責把捕獲的音視訊資料輸出到輸出裝置中。一個AVCaptureSession可以有多個輸入輸出:
AVCaptureDevice:輸入裝置,包括麥克風、攝像頭,通過該物件可以設定物理裝置的一些屬性(例如相機聚焦、白平衡等)。
AVCaptureDeviceInput:裝置輸入資料管理物件,可以根據AVCaptureDevice建立對應的AVCaptureDeviceInput物件,該物件將會被新增到AVCaptureSession中管理。
AVCaptureOutput:輸出資料管理物件,用於接收各類輸出資料,通常使用對應的子類AVCaptureAudioDataOutput、AVCaptureStillImageOutput、AVCaptureVideoDataOutput、AVCaptureFileOutput,該物件將會被新增到AVCaptureSession中管理。注意:前面幾個物件的輸出資料都是NSData型別,而AVCaptureFileOutput代表資料以檔案形式輸出,類似的,AVCcaptureFileOutput也不會直接建立使用,通常會使用其子類:AVCaptureAudioFileOutput、AVCaptureMovieFileOutput。當把一個輸入或者輸出新增到AVCaptureSession之後AVCaptureSession就會在所有相符的輸入、輸出裝置之間建立連線(AVCaptionConnection):
AVCaptureVideoPreviewLayer:相機拍攝預覽圖層,是CALayer的子類,使用該物件可以實時檢視拍照或視訊錄製效果,建立該物件需要指定對應的AVCaptureSession物件。
使用AVFoundation拍照和錄製視訊的一般步驟如下:
- 建立AVCaptureSession物件。
- 使用AVCaptureDevice的靜態方法獲得需要使用的裝置,例如拍照和錄影就需要獲得攝像頭裝置,錄音就要獲得麥克風裝置。
- 利用輸入裝置AVCaptureDevice初始化AVCaptureDeviceInput物件。
- 初始化輸出資料管理物件,如果要拍照就初始化AVCaptureStillImageOutput物件;如果拍攝視訊就初始化AVCaptureMovieFileOutput物件。
- 將資料輸入物件AVCaptureDeviceInput、資料輸出物件AVCaptureOutput新增到媒體會話管理物件AVCaptureSession中。
- 建立視訊預覽圖層AVCaptureVideoPreviewLayer並指定媒體會話,新增圖層到顯示容器中,呼叫AVCaptureSession的startRuning方法開始捕獲。
- 將捕獲的音訊或視訊資料輸出到指定檔案。
相關推薦
iOS拍照和視訊錄製
在iOS中要拍照和錄製視訊最簡單的方法就是使用UIImagePickerController。UIImagePickerController繼承於UINavigationController。 首先看一下這個類常用的屬性和方法: 屬性 說明 @property
Android 拍照和視訊錄製實現mediaRecorder
手機一般都有麥克風和攝像頭,而Android系統就可以利用這些硬體來錄製音視訊了。 為了增加對錄製音視訊的支援,Android系統提供了一個MediaRecorder的類。該類可以實現拍照,視訊,播放錄音,攝像等功能, 該類的使用也非常簡單,下面讓我們來了解
iOS開發-進階:音訊播放、錄音、視訊播放、拍照、視訊錄製
轉自: http://www.cnblogs.com/kenshincui/p/4186022.html#audioRecord 文章太長了, 如果我這裡寫的質量不好, 請參考原文; 概覽 隨著移動網際網路的發展,如今的手機早已不是打電話、發簡訊那麼
iOS開發-自定義相機(仿微信)拍照、視訊錄製
網上有很多自定義相機的例子,這裡只是我臨時寫的一個小demo,僅供參考: 用到了下面幾個庫: #import <AVFoundation/AVFoundation.h> #import <AssetsLibrary/AssetsLibra
OpenCV圖片拍照及視訊錄製方法
一、概述 在視覺中通常需要對圖片及視訊等素材進行採集,為此準備下面的兩個程式碼作為常用小程式碼工具。 二、OpenCV圖片拍照方法 #include <iostream> #include <string> #include <sstr
Android 前置攝像頭的預設是180度,導致應用拍照和錄製視訊是倒立的問題修改
出問題的平板使用的是mediatek平臺晶片,所以修改檔案路徑如下: vendor/mediatek/proprietary/custom/hq8735_6ttb_b2b_m/hal/imgsensor_metadata/common/config_static_metadata_common.
Android Camera 系列(一)拍照和錄製視訊
Camera系列文章首發於 我的慕課網,歡迎關注。 概述 Camera 可能是接下來個人想深入學習的課題,準備新起一個系列,從個人的角度總結闡述自己對於 Android Camera 的研究過程,希望也能夠對其他想學習 Camera 的同學一些幫助。 一、
原創教程:帶ppt課件和講師畫面的教學視訊錄製完整教程
/ 原創教程 - 2018-11-13 / 說明:本教程是教大家如何通過電腦,以最佳的形式來錄製帶ppt課件和講師畫面的教學視訊;適合老師線上教學課程錄製、培訓課程錄製。 優勢:相比較常見的錄屏工具,錄製整個螢幕,本工具可以只錄ppt課件本身,不錄製到桌面上其他雜七雜八的內容,很清晰,很
iOS之音視訊的理論和直播相關知識
視訊實質: 純粹的視訊(不包括音訊)實質上就是一組幀圖片,經過視訊編碼成為視訊(video)檔案再把音訊(audio)檔案有些還有字幕檔案組裝在一起成為我們看到的視訊(movie)檔案。1秒內出現的圖片數就是幀率,圖片間隔越小畫面就越流暢,所以幀率越高效果就越好
centos下動態gif圖和視訊的錄製
一、簡介 在centos下byzanz軟體包的byzanz-record命令的相關引數控制直接錄製動態的gif效果圖。通過recordmydesktop軟體包的recordmydesktop命令錄製視訊,視訊格式為ogv。(在windows下可以使用Fast
Android & IOS視訊錄製技術方案
轉載文章請註明出處:http://write.blog.csdn.net/postedit/48104617 移動端視訊錄製的技術方案,我所能想到並且嘗試過的,有如下幾種:方案一: 用系統開發sdk錄製的介面。 弊端: 1):不能更改視訊比例,一般都有該手機螢幕解析度所對應得視訊錄製解析度,另外手機系統提
iOS裝置的攝像頭進行拍照,視訊。並且從相簿中選取我們需要的圖片或者視訊。
#pragma mark - UIImagePickerControllerDelegate 代理方法 // 儲存圖片後到相簿後,呼叫的相關方法,檢視是否儲存成功 - (void) imageWasSavedSuccessfully:(UIImage *)paramImage didFinishSavi
iOS:FFmpeg視訊播放和直播框架
視訊直播和播放轉碼器框架 介紹: FFmpeg是一套可以用來記錄、轉換數字音訊、視訊,並能將其轉化為流的開源計算機程式。採用LGPL或GPL許可證。 它提供了錄製、轉換以及流化音視訊的完整解決方案。它包含了非常先進的音訊/視訊編解碼庫libavcodec,為了保證高可移植性和編解碼質量,l
iOS 音視訊學習-視訊錄製
前言 伴隨著大火的短視訊應用,正好自己也有點時間,就稍微學習了一下視訊相關的內容。 這種多媒體技術並沒有想象的那麼簡單,這算是一個技術方向了。我把這些視訊相關的技術分為了兩部分,暫且叫做應用層面和底層技術層面(自己取得名字並不準確)。 應用層面可以理解為呼
iOS 簡單的視訊直播功能開發(實時視音訊流錄製編碼+RTMP傳輸+實時拉流解碼播放)
原生開發基本流程:AVFoundation獲取視訊流,得到未編碼的CMSampleBuffer,需要編碼成Mpeg-4格式。編碼分軟編碼和硬編碼,考慮到iOS8之後VideoToolBox開放使用,選用VideoToolBox進行編碼。坑爹的是針對它連文件都沒有。github上有
iOS 關於視訊錄製實現 (仿微信)
專案demo tips:建議參照我的demo進行了解,如果有幫助到你的話請幫我點亮 star, 謝謝啦~ 類似於微信的 點選拍照 , 長按拍視訊的功能. 匯入框架 #import <AVFoundation/AVFoundation.h>
android 實現視訊選取功能,包括視訊錄製和從相簿選取
最近在做一個程式,需要實現視訊上傳的功能,其中有一個地方需要選取視訊,選取視訊的方法有兩種,一種是視訊錄製,一種是從相簿中選取,我現在要實現的功能就是選取這個視訊,其中有一個關鍵的要點就是使用調相簿的方式來選取素材的時候,原本uri返回的是file:///...,但是and
iOS視訊錄製
- (void)createrVideoRecodr { //建立視訊裝置(攝像頭前,後) NSArray*devices = [AVCaptureDevicedevicesWithMediaType:AVMediaTypeVideo]; //2.初始化一個攝像頭
iOS 呼叫相機拍照和選擇相簿圖片 設定頭像
不多說,直接上程式碼 #import "ViewController.h" @interface ViewController ()<UIImagePickerControllerDe
c# 呼叫攝像頭進行視訊錄製和壓縮等
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Drawing; using System.Runtim