这段时间做了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、小视频录制最重要的其实是视频质量和大小的压缩和处理。这点我还在学习中...如果哪个朋友有相关的参考资料希望可以分享给我.谢谢。
网友评论