最近一直都是在做即时通讯APP相关的东西,一般在即时通讯中都会有发送视频的功能。发送视频的基本流程都是先上传视频文件,然后把视频文件的URL放在消息体中发送出去,通过传输层协议TCP或UDP。其中免不了要对视频文件进行转码压缩,因为对于那种几分钟左右的高清视频,动不动几百M的大小,实在是影响APP的性能和用户体验。我在下面代码中封装了一个同步的视频转码压缩接口:
- (BOOL)compressVideoWithAsset:(AVURLAsset *)asset outputPath:(NSString *)outputPath {
dispatch_group_t group = dispatch_group_create();
dispatch_group_enter(group);
// 转码配置,建议选择AVAssetExportPresetMediumQuality
AVAssetExportSession *exportSession = [[AVAssetExportSession alloc] initWithAsset:asset presetName:AVAssetExportPresetMediumQuality];
exportSession.shouldOptimizeForNetworkUse = YES;
// 设置视频转码输出路径
exportSession.outputURL = [NSURL fileURLWithPath:outputPath];
// 文件输出类型,更改该值也可以改变视频的压缩比例
exportSession.outputFileType = AVFileTypeMPEG4;
[exportSession exportAsynchronouslyWithCompletionHandler:^{
dispatch_group_leave(group);
}];
// 等待转码结果
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
AVAssetExportSessionStatus exportStatus = exportSession.status;
// 转码成功
if (exportStatus == AVAssetExportSessionStatusCompleted) {
return YES;
} else {
return NO;
}
}
可以采取如下的调用方式:
NSString *videoPath = [NSString stringWithFormat:@"%@/%lld.mp4", NSTemporaryDirectory(), (long long)([[NSDate date] timeIntervalSince1970] * 1000)];
BOOL compressResult = [self compressVideoWithAsset:urlAsset outputPath:videoPath];
// 压缩成功
if (compressResult) {
NSData *fileData = [NSData dataWithContentsOfURL:[NSURL fileURLWithPath:videoPath] options:(NSDataReadingMappedIfSafe) error:NULL];
}
上面的视频转码方案采用是系统提供的API,有条件的可以自己研发一套转码方案。希望本文可以帮助大家。
网友评论