1. 程式人生 > >iOS拍照和視訊錄製

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來拍照或者錄製視訊通常可以分為如下步驟:

  1. 建立UIImagePickerController物件。 
  2. 指定拾取源,平時選擇照片時使用的拾取源是照片庫或者相簿,此刻需要指定為攝像頭型別。 
  3. 指定攝像頭,前置攝像頭或者後置攝像頭。 
  4. 設定媒體型別mediaType,注意如果是錄影必須設定,如果是拍照此步驟可以省略,因為mediaType預設包含kUTTypeImage(注意媒體型別定義在MobileCoreServices.framework中) 
  5. 指定捕獲模式,拍照或者錄製視訊。(視訊錄製時必須先設定媒體型別再設定捕獲模式 
  6. ) 
  7. 展示UIImagePickerController(通常以模態視窗形式開啟)。 
  8. 拍照和錄製視訊結束後在代理方法中展示/儲存照片或視訊。

當然這個過程中有很多細節可以設定,例如是否顯示拍照控制面板,拍照後是否允許編輯等等,通過上面的屬性/方法列表相信並不難理解。下面就以一個示例展示如何使用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可以有多個輸入輸出:

AVCaptureSession_InputAndOutput

AVCaptureDevice:輸入裝置,包括麥克風、攝像頭,通過該物件可以設定物理裝置的一些屬性(例如相機聚焦、白平衡等)。

AVCaptureDeviceInput:裝置輸入資料管理物件,可以根據AVCaptureDevice建立對應的AVCaptureDeviceInput物件,該物件將會被新增到AVCaptureSession中管理。

AVCaptureOutput:輸出資料管理物件,用於接收各類輸出資料,通常使用對應的子類AVCaptureAudioDataOutput、AVCaptureStillImageOutput、AVCaptureVideoDataOutput、AVCaptureFileOutput,該物件將會被新增到AVCaptureSession中管理。注意:前面幾個物件的輸出資料都是NSData型別,而AVCaptureFileOutput代表資料以檔案形式輸出,類似的,AVCcaptureFileOutput也不會直接建立使用,通常會使用其子類:AVCaptureAudioFileOutput、AVCaptureMovieFileOutput。當把一個輸入或者輸出新增到AVCaptureSession之後AVCaptureSession就會在所有相符的輸入、輸出裝置之間建立連線(AVCaptionConnection):

AVCaptureSession_Relation

AVCaptureVideoPreviewLayer:相機拍攝預覽圖層,是CALayer的子類,使用該物件可以實時檢視拍照或視訊錄製效果,建立該物件需要指定對應的AVCaptureSession物件。

使用AVFoundation拍照和錄製視訊的一般步驟如下:

  1. 建立AVCaptureSession物件。 
  2. 使用AVCaptureDevice的靜態方法獲得需要使用的裝置,例如拍照和錄影就需要獲得攝像頭裝置,錄音就要獲得麥克風裝置。 
  3. 利用輸入裝置AVCaptureDevice初始化AVCaptureDeviceInput物件。 
  4. 初始化輸出資料管理物件,如果要拍照就初始化AVCaptureStillImageOutput物件;如果拍攝視訊就初始化AVCaptureMovieFileOutput物件。 
  5. 將資料輸入物件AVCaptureDeviceInput、資料輸出物件AVCaptureOutput新增到媒體會話管理物件AVCaptureSession中。 
  6. 建立視訊預覽圖層AVCaptureVideoPreviewLayer並指定媒體會話,新增圖層到顯示容器中,呼叫AVCaptureSession的startRuning方法開始捕獲。 
  7. 將捕獲的音訊或視訊資料輸出到指定檔案。

相關推薦

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