今天研究了一下使用app錄制視頻的功能,感覺還是挺簡單的。使用了AVFoundation框架,代碼比較死,按步驟調用就行。
分享一下今天做的Demo的步驟
一,初始化輸入設備,這里涉及到前,后攝像頭;麥克風(導入AVFoundation)
//1.創建視頻設備(攝像頭前,后) NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo]; //2.初始化一個攝像頭輸入設備(first是后置攝像頭,last是前置攝像頭) AVCaptureDeviceInput *inputVideo = [AVCaptureDeviceInput deviceInputWithDevice:[devices firstObject] error:NULL]; //3.創建麥克風設備 AVCaptureDevice *deviceAudio = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio]; //4.初始化麥克風輸入設備 AVCaptureDeviceInput *inputAudio = [AVCaptureDeviceInput deviceInputWithDevice:deviceAudio error:NULL];
二,初始化視頻文件輸出
//5.初始化一個movie的文件輸出 AVCaptureMovieFileOutput *output = [[AVCaptureMovieFileOutput alloc] init]; self.output = output; //保存output,方便下面操作
三,初始化會話,并將輸入輸出設備添加到會話中
1 //6.初始化一個會話 2 AVCapturesession *session = [[AVCaptureSession alloc] init]; 3 4 //7.將輸入輸出設備添加到會話中 5 if ([session canAddInput:inputVideo]) { 6 [session addInput:inputVideo]; 7 } 8 if ([session canAddInput:inputAudio]) { 9 [session addInput:inputAudio];10 }11 if ([session canAddOutput:output]) {12 [session addOutput:output];13 }
四,添加一個視頻預覽圖層,設置大小,添加到控制器view的圖層上
1 //8.創建一個預覽涂層2 AVCaptureVideoPReviewLayer *preLayer = [AVCaptureVideoPreviewLayer layerWithSession:session];3 //設置圖層的大小4 preLayer.frame = self.view.bounds;5 //添加到view上6 [self.view.layer addSublayer:preLayer];
五,開始會話
//9.開始會話 [session startRunning];
六,添加一個按鈕:點擊開始,停止錄制視頻,并設置錄制視頻的代理
1 - (IBAction)clickVideoBtn:(UIButton *)sender { 2 //判斷是否在錄制,如果在錄制,就停止,并設置按鈕title 3 if ([self.output isRecording]) { 4 [self.output stopRecording]; 5 [sender setTitle:@"錄制" forState:UIControlStateNormal]; 6 return; 7 } 8 9 //設置按鈕的title10 [sender setTitle:@"停止" forState:UIControlStateNormal];11 12 //10.開始錄制視頻13 //設置錄制視頻保存的路徑14 NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject stringByAppendingPathComponent:@"myVidio.mov"];15 16 //轉為視頻保存的url17 NSURL *url = [NSURL fileURLWithPath:path];18 19 //開始錄制,并設置控制器為錄制的代理20 [self.output startRecordingToOutputFileURL:url recordingDelegate:self];21 22 }
七,實現代理方法(這里只實現一個完成代理方法吧,其他根據自己的需求再設置)
1 #pragma mark - AVCaptureFileOutputRecordingDelegate2 //錄制完成代理3 - (void)captureOutput:(AVCaptureFileOutput *)captureOutput didFinishRecordingToOutputFileAtURL:(NSURL *)outputFileURL fromConnections:(NSArray *)connections error:(NSError *)error4 {5 NSLog(@"完成錄制,可以自己做進一步的處理");6 }
八,真機運行,嘿嘿
新聞熱點
疑難解答