前言:本系列文章旨在為剛接觸短視頻的新人開發(fā)提供方便楞遏,寫的不好的地方,還請各路大神指教寡喝。眾所周知,開發(fā)音視頻相關(guān)的項目是有很大難度的巧骚,基于OpenCV格二、OpenGL、ffmpeg等眾多框架顶猜,iOS下又涉及到GPUImage、AVFoundation等框架滔吠,語言層面上涉及C抄淑、C++語言驰后,可謂非一個人能完成的工作。
正文:
核心思路:使用AVFoundation下的拍攝比較繁瑣灶芝,而GPUImage封裝了這一層,因此我們可以直接使用GPUImage完成拍攝功能犯犁。
具體步驟
1.新建工程 在 infoplist文件設(shè)置麥克風(fēng) 相機 相冊 圖片等權(quán)限
<!-- 相冊 -->
<key>NSPhotoLibraryUsageDescription</key>
<string>App需要您的同意,才能訪問相冊</string>
<!-- 相機 -->
<key>NSCameraUsageDescription</key>
<string>App需要您的同意,才能訪問相機</string>
<!-- 麥克風(fēng) -->
<key>NSMicrophoneUsageDescription</key>
<string>App需要您的同意,才能訪問麥克風(fēng)</string>
<!-- 圖片 -->
<key>NSPhotoLibraryAddUsageDescription</key>
<string>App需要您的同意,才能保存圖片到您的相冊</string>
2.基于GPUImage 建議用cocoapods導(dǎo)GPUImage酸役,GPUImage引入后驾胆,修改以下部分:
1. GPUImageMovieWriter.h文件中添加isNeedBreakAudioWhiter屬性
@property (nonatomic, assign) BOOL isNeedBreakAudioWhiter;
2. GPUImageMovieWriter.m文件中第377行代碼修改如下:
if (CMTIME_IS_INVALID(startTime))
{
if (_isNeedBreakAudioWhiter) {
}else{
runSynchronouslyOnContextQueue(_movieWriterContext, ^{
if ((audioInputReadyCallback == NULL) && (assetWriter.status != AVAssetWriterStatusWriting))
{
[assetWriter startWriting];
}
[assetWriter startSessionAtSourceTime:currentSampleTime];
startTime = currentSampleTime;
});
}
}
3. GPUImageMovieWriter初始化時設(shè)置 isNeedBreakAudioWhiter =YES;
3.初始化相機及filterView,filterView是處理美顏的,大家可以處理成不同的美顏效果
//錄制相關(guān) AVCaptureSessionPreset1280x720視頻分辨率 AVCaptureDevicePositionBack后置攝像頭
videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset1280x720
cameraPosition:AVCaptureDevicePositionBack];
if ([videoCamera.inputCamera lockForConfiguration:nil]) {
//自動對焦
if ([videoCamera.inputCamera isFocusModeSupported:AVCaptureFocusModeContinuousAutoFocus]) {
[videoCamera.inputCamera setFocusMode:AVCaptureFocusModeContinuousAutoFocus];
}
//自動曝光
if ([videoCamera.inputCamera isExposureModeSupported:AVCaptureExposureModeContinuousAutoExposure]) {
[videoCamera.inputCamera setExposureMode:AVCaptureExposureModeContinuousAutoExposure];
}
//自動白平衡
if ([videoCamera.inputCamera isWhiteBalanceModeSupported:AVCaptureWhiteBalanceModeContinuousAutoWhiteBalance]) {
[videoCamera.inputCamera setWhiteBalanceMode:AVCaptureWhiteBalanceModeContinuousAutoWhiteBalance];
}
[videoCamera.inputCamera unlockForConfiguration];
}
//輸出方向為豎屏
videoCamera.outputImageOrientation = UIInterfaceOrientationPortrait;
//防止允許聲音通過的情況下入桂,避免錄制第一幀黑屏閃屏
[videoCamera addAudioInputsAndOutputs];
videoCamera.horizontallyMirrorFrontFacingCamera = YES;
videoCamera.horizontallyMirrorRearFacingCamera = NO;
//顯示view
filterView =[[GPUImageView alloc]initWithFrame:[UIScreen mainScreen].bounds];
[self.view addSubview:filterView];
//組合
// filter = [[GPUImageBilateralFilter alloc] init];
// [videoCamera addTarget:filter];
// [filter addTarget:filterView];
[videoCamera addTarget:filterView];
//相機開始運行
[videoCamera startCameraCapture];
4.初始化moviewriter
videoURL即視頻文件的存儲URL
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *videoPath = [[paths objectAtIndex:0] stringByAppendingPathComponent@"tets.MOV"];
unlink([path UTF8String]);
videoURL =[NSURL fileURLWithPath:path];
需要注意的是要調(diào)用unlink方法抗愁,否則寫入可能會失敗。
//寫入
movieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:videoURL size:CGSizeMake(720.0, 1280.0)];
//設(shè)置為liveVideo
movieWriter.isNeedBreakAudioWhiter =YES;
movieWriter.encodingLiveVideo = YES;
movieWriter.shouldPassthroughAudio =YES;
// [filter addTarget:movieWriter];
[videoCamera addTarget:movieWriter];
//設(shè)置聲音
videoCamera.audioEncodingTarget = movieWriter;
5.開始錄制與暫停
開始錄制
[movieWriter startRecording];
停止錄制
[movieWriter finishRecording];
[filter removeTarget:movieWriter];
videoCamera.audioEncodingTarget = nil;
自此沫屡,我們就可以完成一個簡單的視頻錄制功能了撮珠,下幾篇文章我會講到其中注意事項以及切換前后攝像頭、閃光燈倘潜、斷點拍攝、視頻合成等相關(guān)功能涮因。