視頻錄制與掃描二維碼實(shí)現(xiàn)類似,區(qū)別在于:
錄制視頻需要捕獲: 音頻+視頻 --> 生成一個(gè)視頻文件
所以在聲明輸入設(shè)備時(shí),需要一個(gè)視頻輸入設(shè)備和一個(gè)音頻輸入設(shè)備
// 輸入設(shè)備 視頻
@property (nonatomic,strong) AVCaptureDeviceInput *videoInput;
// 輸入設(shè)備 音頻
@property (nonatomic,strong) AVCaptureDeviceInput *audioInput;
其他屬性
// 輸出設(shè)備
@property (nonatomic,strong) AVCaptureMovieFileOutput *movieOutput;
// 會(huì)話
@property (nonatomic,strong) AVCaptureSession *session;
// 預(yù)覽視圖
@property (nonatomic,strong) AVCaptureVideoPreviewLayer *previewLayer;
注意點(diǎn):
1.測試錄制視頻,需要使用真機(jī)進(jìn)行
2.為了模擬效果,在視圖控制器view上添加了開始錄制按鈕,當(dāng)添加預(yù)覽Layer時(shí),如果直接添加到view的layer上,就會(huì)遮擋視圖view上的按鈕,所以使用了插入的方式
實(shí)例化屬性,并將輸入輸出設(shè)備分別添加至?xí)捴?并設(shè)置預(yù)覽視圖,將預(yù)覽視圖添加到視圖上,最后開啟會(huì)話,這樣就可以調(diào)用攝像頭,并將攝像頭捕捉到的畫面呈現(xiàn)在視圖中
// 將錄制Layer預(yù)覽呈現(xiàn)在視圖上
- (void)viewDidLoad {
[super viewDidLoad];
// 2. 輸入設(shè)置
/* 設(shè)置設(shè)備類型
NSString *const AVMediaTypeVideo;
NSString *const AVMediaTypeAudio;
NSString *const AVMediaTypeText;
NSString *const AVMediaTypeClosedCaption;
NSString *const AVMediaTypeSubtitle;
NSString *const AVMediaTypeTimecode;
NSString *const AVMediaTypeTimedMetadata;
NSString *const AVMediaTypeMetadata;
NSString *const AVMediaTypeMuxed;
*/
// 視頻
AVCaptureDevice *videoDevice= [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
self.videoInput = [AVCaptureDeviceInput deviceInputWithDevice:videoDevice error:nil];
// 音頻
AVCaptureDevice *audioDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio];
self.audioInput = [AVCaptureDeviceInput deviceInputWithDevice:audioDevice error:nil];
// 3. 輸出設(shè)備
self.movieOutput = [[AVCaptureMovieFileOutput alloc] init];
// 4. 會(huì)話
self.session = [[AVCaptureSession alloc] init];
// 添加輸入輸出設(shè)備
if ([self.session canAddInput:self.audioInput]) {
[self.session addInput:self.audioInput];
}
if ([self.session canAddInput:self.videoInput]) {
[self.session addInput:self.videoInput];
}
if ([self.session canAddOutput:self.movieOutput]) {
[self.session addOutput:self.movieOutput];
}
// 5. 預(yù)覽視圖
self.previewLayer = [AVCaptureVideoPreviewLayer layerWithSession:self.session];
// 添加到視圖中并且設(shè)置位置
[self.view.layer insertSublayer:self.previewLayer atIndex:0]; // 如果直接添加到View上,Layer會(huì)遮擋View上的開始錄制按鈕,所以使用了插入
self.previewLayer.frame = self.view.bounds;
// 6. 開始會(huì)話
[self.session startRunning];
}
錄制視頻通過代理的方式實(shí)現(xiàn),需要遵循協(xié)議,設(shè)置代理并實(shí)現(xiàn)兩個(gè)代理方法:
接下來,在開始錄制按鈕點(diǎn)擊事件中
// 開始錄制 錄制視頻 : 捕獲 音頻+視頻 生成一個(gè)視頻文件
- (IBAction)clickRecordButton:(id)sender {
// 錄制的視頻文件存放路徑
NSString *filePath = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) lastObject];
NSURL *libraryUrl = [NSURL fileURLWithPath:filePath];
NSURL *fileUrl = [libraryUrl URLByAppendingPathComponent:@"movie.mp4"];
// 使用輸出設(shè)備進(jìn)行錄制 (通過代理的方式)
[self.movieOutput startRecordingToOutputFileURL:fileUrl recordingDelegate:self];
}
停止錄制按鈕點(diǎn)擊事件中
// 停止錄制
- (IBAction)clickStopRecordButton:(id)sender {
[self.movieOutput stopRecording];
// 停止后關(guān)閉攝像頭(將預(yù)覽layer從當(dāng)前視圖移除)
[self.previewLayer removeFromSuperlayer];
}
當(dāng)?shù)谝淮芜\(yùn)行時(shí),會(huì)提示需要授權(quán)使用攝像頭和麥克風(fēng):
camera.PNG
mic.PNG
雖然開始錄制和完成錄制的代理方法中還未做任何處理,實(shí)際當(dāng)我點(diǎn)擊開始錄制按鈕時(shí),就已經(jīng)開始了錄制,點(diǎn)擊完成錄制按鈕停止錄制后,獲取到手機(jī)真機(jī)沙盒可以看到文件已經(jīng)生成:
錄制視頻.png
下一篇文章會(huì)對存放于沙盒中的錄制視頻做提取操作.