即时通讯_视频录制、播放

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335

推荐阅读更多精彩内容