概述
AVAssetExportSession
用于将 AVAsset
内容根据导出预设条件进行转码,并将导出资源写到磁盘中。其提供了多个功能来实现将一种格式转换为另一种格式、修订资源的内容、修改资源的音频和视频行为,以及写入新的元数据。
创建 AVAssetExportSession
创建一个 AVAssetExportSession
实例需要提供资源和导出预设。导出预设用于确定导出内容的质量、大小等属性。在创建之前需要通过 exportPresetsCompatibleWithAsset
确认资源可用的预设,如下所示:
AVAsset *anAsset = <#获取资产#>;
NSArray *compatiblePresets = [AVAssetExportSession exportPresetsCompatibleWithAsset:anAsset];
if ([compatiblePresets containsObject:AVAssetExportPresetLowQuality]) {
AVAssetExportSession *exportSession = [[AVAssetExportSession alloc]
initWithAsset:anAsset presetName:AVAssetExportPresetLowQuality];
// 执行继续。
}
了解导出预设
AVAssetExportSession
提供了一个方法 allExportPresets
,可以查看当前系统设备所有可用的导出预设名称,在 iOS 系统中大致分为 5 类:
-
质量预设
AVAssetExportPresetHighestQuality, AVAssetExportPresetLowQuality, AVAssetExportPresetMediumQuality
-
尺寸预设
AVAssetExportPreset640x480, AVAssetExportPreset960x540, AVAssetExportPreset1280x720, AVAssetExportPreset1920x1080, AVAssetExportPreset3840x2160
-
HEVC 尺寸预设
AVAssetExportPresetHEVC1920x1080, AVAssetExportPresetHEVC1920x1080WithAlpha, AVAssetExportPresetHEVC3840x2160, AVAssetExportPresetHEVC3840x2160WithAlpha, AVAssetExportPresetHEVCHighestQuality, AVAssetExportPresetHEVCHighestQualityWithAlpha
-
纯音频预设
AVAssetExportPresetAppleM4A
-
直通预设
AVAssetExportPresetPassthrouge
配置输出 URL
创建一个导出会话后,需要指定一个 outputURL
用于声明导出内容将要写入的地址,AVAssetExportSession
可以从 URL 路径的扩展名设置输出文件类型,但是通常直接使用 outputFileType
值来表示将要写入的导出格式。开发者还可以指定其他属性,例如时间范围、输出文件长度的限制、导出的文件是否应针对网络使用进行优化以及视频合成。以下示例说明了如何使用 timeRange
属性修剪影片:
exportSession.outputURL = <#A file URL#>;
exportSession.outputFileType = AVFileTypeQuickTimeMovie;
CMTime start = CMTimeMakeWithSeconds(1.0, 600);
CMTime duration = CMTimeMakeWithSeconds(3.0, 600);
CMTimeRange range = CMTimeRangeMake(start, duration);
exportSession.timeRange = range;
创建新文件
要创建新文件,需要调用 exportAsynchronouslyWithCompletionHandler:
导出。操作完成时调用完成处理程序块,在处理程序的实现中,应该检查会话的 status
值以确定导出是成功、失败还是被取消。
[exportSession exportAsynchronouslyWithCompletionHandler:^{
switch ([exportSession status]) {
case AVAssetExportSessionStatusFailed:
NSLog(@"Export failed: %@", [[exportSession error] localizedDescription]);
break;
case AVAssetExportSessionStatusCancelled:
NSLog(@"Export canceled");
break;
default:
break;
}
}];
如果尝试覆盖现有文件或在应用程序的沙箱之外写入文件,则导出将失败。如果出现以下情况,它也可能会失败:有来电或者应用程序在后台
取消导出
可以通过调用cancelExport
取消导出。
[exportSession cancelExport];