AVFoundation框架学习之AVAssetExportSe
2017-06-21 本文已影响1903人
亭竹丶
AVAssetExportSession:对象转码以及输出,对一个AVAsset对象进行操作,用来做视频处理输出,我这里围绕视频压缩来进行一些了解。
注:
1.如果视频路径中文件以及存在,会转码失败。
2.压缩类的progress不支持kvo的方式。
一、视频压缩
说明:压缩格式为MP4,这里没有对视频做缓存处理,在项目中应该对压缩的视频做缓存处理判断。步骤如下:
1.初始化,传入asset,定义输出文件的质量presetName。
/*
初始化
presetName 说明:
AVAssetExportPresetLowQuality AVAssetExportPresetMediumQuality AVAssetExportPresetHighestQuality
AVAssetExportPreset640x480 AVAssetExportPreset960x540 AVAssetExportPreset1280x720 AVAssetExportPreset1920x1080 AVAssetExportPreset3840x2160
AVAssetExportSessionStatusCancelled
AVAssetExportPresetAppleM4A
AVAssetExportPresetPassthrough
*/
AVAssetExportSession *exportSession = [AVAssetExportSession exportSessionWithAsset:asset presetName:AVAssetExportPresetMediumQuality];
2.设置输出路径和输出文件类型。
// 输出地址
NSString *outputPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"av1.mp4"];
exportSession.outputURL = [NSURL fileURLWithPath:outputPath];
// 文件类型, 目前只支持 AVFileTypeMPEG4 AVFileTypeQuickTimeMovie
NSLog(@"supportedFileTypes:%@", exportSession.supportedFileTypes);
exportSession.outputFileType = AVFileTypeMPEG4;
// 网络优化?,默认为no
exportSession.shouldOptimizeForNetworkUse = YES;
3.启动转换
[exportSession exportAsynchronouslyWithCompletionHandler:^{
// 完成回调
NSLog(@"%ld", exportSession.status);
if (exportSession.status == AVAssetExportSessionStatusCompleted) {
NSLog(@"%@", exportSession.outputURL);
}
}];
// 取消
// [exportSession cancelExport];
// 进度
NSLog(@"%lf", exportSession.progress);
// 状态 AVAssetExportSessionStatus
NSLog(@"%ld", exportSession.status);
二、判断是否是否可以转换成功
// 所有的 presetName
NSLog(@"presetName:%@", [AVAssetExportSession allExportPresets]);
// 可以使用的 presetName
NSLog(@"presetName:%@", [AVAssetExportSession exportPresetsCompatibleWithAsset:asset]);
// 判断兼容性,用户判断AVAssetExportSession是否能够成功输出转换的视音频文件
[AVAssetExportSession determineCompatibilityOfExportPreset:AVAssetExportPresetMediumQuality withAsset:asset outputFileType:AVFileTypeMPEG4 completionHandler:^(BOOL compatible) {
NSLog(@"compatible:%d", compatible);
}];
// 确定可以使用的文件类型
[exportSession determineCompatibleFileTypesWithCompletionHandler:^(NSArray* _Nonnull compatibleFileTypes) {
NSLog(@"compatible:%@", compatibleFileTypes);
}];
三、其他参数补充说明,对于对视频进行一些处理,如合并剪切,添加水印,在这里我没有对其进行详细的研究。
// 文件大小限制
exportSession.fileLengthLimit = 1024 * 1024 * 1024;
// 时间限制
exportSession.timeRange = CMTimeRangeMake(CMTimeMake(0, 0), CMTimeMake(1, 1));
// AVMetadataItem 元数据
exportSession.metadata = nil;
// AVMetadataItemFilter 过滤器
exportSession.metadataItemFilter = nil;
// AVAudioMix 音频处理
exportSession.audioMix = nil;
// 时间距算法
exportSession.audioTimePitchAlgorithm = AVAudioTimePitchAlgorithmSpectral;
// 视频处理 AVVideoComposition AVMutableVideoComposition
exportSession.videoComposition = nil;
// AVVideoCompositing 协议和相关类,让你可以自定义视频的合成排版
NSLog(@"%@", exportSession.customVideoCompositor);
// 默认为no , 设置为yes 的时候,质量更高,
exportSession.canPerformMultiplePassesOverSourceMediaData = NO;
// 缓存地址, canPerformMultiplePassesOverSourceMediaData为yes需要用到
exportSession.directoryForTemporaryFiles = nil;
// 最大时间
CMTimeShow(exportSession.maxDuration);
最后附上demo