這段時間做了OA管理類項目—IOS
該項目主要模塊分為:
1、新聞、讀報
2、即時通訊、通訊錄
3、oa操作流程
其中錄制視頻中遇到一些問題、接下來就簡單總結一下。如果有代碼問題希望大家及時提出,本人愿意虛心接受修改。希望能進步!
@property(nonatomic,strong)AVCaptureMovieFileOutput *output;
@property (nonatomic,strong) AVPlayer *player;//播放器對象;
@property (nonatomic,strong) AVPlayerLayer * layer;
@property(nonatomic,strong)NSString * uploadPath;//上傳路徑
1、初始化
//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
//6.初始化一個會話
AVCaptureSession *session = [[AVCaptureSession alloc] init];
session.sessionPreset = AVCaptureSessionPreset640x480;
//7.將輸入輸出設備添加到會話中
if ([session canAddInput:inputVideo]) {
[session addInput:inputVideo];
}
if ([session canAddInput:inputAudio]) {
[session addInput:inputAudio];
}
if ([session canAddOutput:output]) {
[session addOutput:output];
}
//8.創建一個預覽涂層
AVCaptureVideoPreviewLayer *preLayer = [AVCaptureVideoPreviewLayer layerWithSession:session];
preLayer.frame = self.view.frame;
preLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
[self.view.layer addSublayer:preLayer];
[session startRunning];
2、錄制完成轉換為mp4
- (void)captureOutput:(AVCaptureFileOutput *)captureOutput didFinishRecordingToOutputFileAtURL:(NSURL *)outputFileURL fromConnections:(NSArray *)connections error:(NSError *)error
{
NSLog(@"url === %@",outputFileURL);
// 通過文件的 url 獲取到這個文件的資源
[self showHud];
AVURLAsset *avAsset = [[AVURLAsset alloc] initWithURL:outputFileURL options:nil];
// 用 AVAssetExportSession 這個類來導出資源中的屬性
NSArray *compatiblePresets = [AVAssetExportSession exportPresetsCompatibleWithAsset:avAsset];
// 壓縮視頻
if ([compatiblePresets containsObject:AVAssetExportPresetLowQuality]) { // 導出屬性是否包含低分辨率
// 通過資源(AVURLAsset)來定義 AVAssetExportSession,得到資源屬性來重新打包資源 (AVURLAsset, 將某一些屬性重新定義
AVAssetExportSession *exportSession = [[AVAssetExportSession alloc] initWithAsset:avAsset presetName:AVAssetExportPresetMediumQuality];
// 設置導出文件的存放路徑
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy-MM-dd-HH:mm:ss"];
NSDate? ? *date = [[NSDate alloc] init];
//存在臨時temp
NSString *outPutPath=[NSTemporaryDirectory() stringByAppendingString:[NSString stringWithFormat:@"myVideo%@.mp4",[formatter stringFromDate:date]]];
NSURL * outUrl =[NSURL fileURLWithPath:outPutPath];
exportSession.outputURL = outUrl;
// 是否對網絡進行優化
exportSession.shouldOptimizeForNetworkUse = true;
// 轉換成MP4格式
exportSession.outputFileType = AVFileTypeMPEG4;
// 開始導出,導出后執行完成的block
[exportSession exportAsynchronouslyWithCompletionHandler:^{
[self hiddenHud];
// 如果導出的狀態為完成
if ([exportSession status] == AVAssetExportSessionStatusCompleted) {
dispatch_async(dispatch_get_main_queue(), ^{
self.uploadPath = outPutPath;
//完成錄制、開始播放
[self initPlayer:outPutPath];
});
}else if ([exportSession status]==AVAssetExportSessionStatusFailed){
NSLog(@"mp4 export Fail!");
}else if ([exportSession status] == AVAssetExportSessionStatusWaiting){
NSLog(@"wait");
}
}];
}
3、播放視頻
#pragma mark -播放視頻
- (void)initPlayer:(NSString *)path
{
NSURL *? url= [NSURL fileURLWithPath:path];
AVPlayerItem *item = [AVPlayerItem playerItemWithURL:url];
_player = [AVPlayer playerWithPlayerItem:item];
_layer = [AVPlayerLayer playerLayerWithPlayer:_player];
_layer.frame = CGRectMake(0, 64, self.view.layer.bounds.size.width, 300*SCREEN_WIDTHSCALE);
_layer.videoGravity = AVLayerVideoGravityResizeAspectFill;
// 顯示播放視頻的視圖層要添加到self.view的視圖層上面
[self.view.layer addSublayer:_layer];
[_player play];
[self addNotification];
}
4、 循環播放-添加通知監聽
-(void)addNotification{
//給AVPlayerItem添加播放完成通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playbackFinished:) name:AVPlayerItemDidPlayToEndTimeNotification object:self.player.currentItem];
}
- (void)playbackFinished:(NSNotification *)notification
{
// 播放完成后重復播放
// 跳到最新的時間點開始播放
[_player seekToTime:CMTimeMake(0, 1)];
[_player play];
}
-(void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
5、縮略圖
#pragma mark - 縮略圖
- (UIImage *)getImage:(NSString *)videoURL
{
AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:[NSURL fileURLWithPath:videoURL] options:nil];
AVAssetImageGenerator *gen = [[AVAssetImageGenerator alloc] initWithAsset:asset];
gen.appliesPreferredTrackTransform = YES;
CMTime time = CMTimeMakeWithSeconds(0.0, 600);
NSError *error = nil;
CMTime actualTime;
CGImageRef image = [gen copyCGImageAtTime:time actualTime:&actualTime error:&error];
UIImage *thumb = [[UIImage alloc] initWithCGImage:image];
CGImageRelease(image);
return thumb;
}
6、注釋
? 1、如果項目還有android端,在android端錄制的時候 把編碼格式設置為AAC,否則android錄制出來之后在ios端播放不了。
2、在ios9可以使用 AVPlayerViewController進行播放、同時MPMoviePlayerController即將被棄用。
3、小視頻錄制最重要的其實是視頻質量和大小的壓縮和處理。這點我還在學習中...如果哪個朋友有相關的參考資料希望可以分享給我.謝謝。