OC之编码asset的AVAssetExportSession

AVAssetExportSession 继承自NSObject,该对象对asset编码,以创建指定exportPresets描述格式的output

在创建该类之前,使用allexportpreset属性获取可用预置的完整列表。调用+exportPresetsCompatibleWithAsset:获得与指定asset兼容的预置列表。

在使用包含源媒体、presetNameoutputFileTypeasset创建该类对象之后,通过调用-exportasynchronouswithcompletionhandler:来异步导出。可以监听progress检查进度。根据设备的功能,当尝试多个导出时,一些导出可能会排队等待AVAssetExportSessionStatusWaiting

无论导出成功、失败或取消,都会调用-exportAsynchronouslyWithCompletionHandler:方法;在该方法的block中:status属性指示导出是否已成功完成,如果失败,则error属性提供失败信息。

1、初始化会话

- (instancetype)initWithAsset:(AVAsset *)asset presetName:(NSString *)presetName;

+ (instancetype)exportSessionWithAsset:(AVAsset *)asset presetName:(NSString *)presetName;

使用指定的assetpresetName初始化会话:

  • 参数asset:要导出的asset
  • 参数presetName:字符串常量,指定导出的presetName

2、配置输出

配置属性 数据类型 描述
outputURL NSURL 配置输出地址URL。
supportedFileTypes NSArray 只读数组,可以写入的文件类型AVFileType:由exportPresets和初始化会话的asset确定。
outputFileType AVFileType 会话要写入的文件类型;该值是与写入asset时要使用的文件类型对应的UTI字符串,必须为该属性设置一个值。
fileLengthLimit longlong 文件长度限制;根据源asset的内容,输出可能略微超过文件长度限制。如果在使用输出之前需要遵守严格的限制,则应测试输出文件的长度。
timeRange CMTimeRange 从源asset导出的时间范围;默认时间范围是kCMTimeZerokCMTimePositiveInfinity,导出asset的整个持续时间。
metadata NSArray 要写入输出文件的元数据AVMetadataItem;如果该值为nil,则导出asset中的任何现有元数据将被尽可能准确地转换为输出文件的适当元数据字典,并写入输出。
metadataItemFilter AVMetadataItemFilter 指定导出期间使用的过滤器对象,以确定应该从源asset转移哪些元数据项;默认值为nil,不会应用任何过滤器。过滤器将不会应用于通过metadata属性设置的元数据集。要将筛选器应用于元数据,参阅AVMetadataItem
audioMix AVAudioMix 启用非默认音频混合以进行导出。
audioTimePitchAlgorithm AVAudioTimePitchAlgorithm 用于管理缩放音频的处理算法;默认值是AVAudioTimePitchAlgorithmSpectral。如果将此属性设置为时间间隔算法设置中定义的常量以外的值,则会引发异常。
shouldOptimizeForNetworkUse BOOL 指示是否为网络使用优化电影。
videoComposition AVVideoComposition 视频合成的说明,并指示是否允许导出视频合成。
customVideoCompositor id 如果有,使用的自定义视频合成器实例;如果没有AVVideoCompositing,或者内部视频合成程序正在使用,则此属性为nil。
2.1、导出高质量文件

指示会话是否可以在源媒体上执行多次传递以获得更好的结果;导出开始后无法设置该值;

@property(nonatomic) BOOL canPerformMultiplePassesOverSourceMediaData;

默认值为NO;并非所有导出会话配置都可以通过源媒体执行多次传递而受益。在这些情况下,将此属性设置为YES无效。
当为YES时,导出会话可以以更长的导出时间为代价生成更高质量的结果;还可能需要在导出期间将临时数据写入磁盘。要控制临时数据的位置,使用属性directoryForTemporaryFiles

2.2、导出高质量文件的临时文件

指定临时文件目录:当导出更高质量的文件时,可能需要写入临时文件,导出完成,取消或失败时,将删除所有临时文件。默认值为nil,此时导出会话将在写入临时文件时选择合适的位置。

@property(nonatomic, copy) NSURL *directoryForTemporaryFiles;

导出开始后无法设置此属性;如果URL指向的位置不是文件夹、该文件夹不存在、不在本地文件系统上,或者无法在此文件夹中创建文件,导出将失败。

3、配置导出预设

//创建会话的presetName。
@property(nonatomic, readonly) NSString *presetName;
3.1、获取所有可用的presetName

返回所有可用的presetName;并非所有presetName都与assets兼容。

+ (NSArray *)allExportPresets;
3.2、返回与指定asset兼容的presetName

返回与指定asset兼容的标识符

+ (NSArray *)exportPresetsCompatibleWithAsset:(AVAsset *)asset;

不是所有presetName都与asset兼容。例如,只支持视频的asset与只支持音频的presetName不兼容。

为了确保使用指定presetName的导出操作的设置和运行成功,不应在检索兼容标识符和执行导出操作之间对asset进行重大更改:例如添加或删除轨道。
如果当前没有加载asset的轨道,那么在执行任何检查之前,可以使用此方法加载它们。

3.3、检查兼容性
+ (void)determineCompatibilityOfExportPreset:(NSString *)presetName
withAsset:(AVAsset *)asset
outputFileType:(AVFileType)outputFileType
completionHandler:(void (^)(BOOL compatible))handler;

异步检查presetNameassetoutputFileType的兼容性:

  • 参数presetName:导出操作的预设模板的名称。
  • 参数asset:将导出的AVAsset对象。
  • 参数outputFileType:与文件类型对应的UTI字符串。例如,指定QuickTime影片文件格式AVFileTypeQuickTimeMovie
  • 参数handler:要执行结果的块不能为nil。这个块在分线程只接受一个布尔值:如果选项组合是兼容的,则为YES;如果不兼容,则为NO。

并非所有presetName都与所有资源和文件类型兼容,因此调用此方法在使用之前查询特定组合的兼容性。要确保导出操作成功,不应在调用此方法和执行导出操作之间对asset进行任何重大更改。

3.4、确定会话可以编写的文件类型
- (void)determineCompatibleFileTypesWithCompletionHandler:(void (^)(NSArray *compatibleFileTypes))handler;

确定会话的兼容文件类型:

  • 参数handler:要执行结果的块不能为nil;此块采用数组参数并且不返回任何结果。块中数组包含多个兼容文件类型UTI的NSString对象;文件类型没有特定的顺序。

该方法操作用于创建会话的asset对象和presetName信息;它使用这些信息来确定导出会话可以编写的文件类型。
该方法在分线程上异步执行其检查并立即返回。因为此方法实际上会检查asset的轨道,所以如果轨道尚未加载,则会加载轨道。

4、导出媒体

只读属性 数据类型 描述
error NSError 导出状态为AVAssetExportSessionStatusFailedAVAssetExportSessionStatusCancelled时发生的错误;如果没有错误,则为nil。
estimatedOutputFileLength longlong 预估导出文件的字节数
maxDuration CMTime 预估导出媒体的最大时长;presetNameAVAssetExportPresetPassthroughAVAssetExportPresetAppleProRes422LPCM时返回0。如果尚未设置timeRange属性值,则返回0。
progress float 导出的进度:0~1;0 尚未开始,1表示导出已完成。
status AVAssetExportSessionStatus 会话的状态。
4.1、异步执行导出
- (void)exportAsynchronouslyWithCompletionHandler:(void (^)(void))handler;

status属性指示导出是否已成功完成,如果失败,则error属性提供失败信息。

如果导出的内部准备失败,则同步调用handler。 在以下情况下,在方法返回后,也可以异步调用handler

  • 1、如果在导出期间出现问题,包括加载,重新编码或将媒体数据写入输出失败;
  • 2、如果调用-cancelExport;
  • 3、导出成功后,将其输出完全写入outputURL
4.2、取消导出
- (void)cancelExport;

可以在导出期间调用此方法。

4.3、导出状态枚举
枚举AVAssetExportSessionStatus 描述
AVAssetExportSessionStatusUnknown 未知状态
AVAssetExportSessionStatusWaiting 正在等待导出更多数据
AVAssetExportSessionStatusExporting 正在导出中
AVAssetExportSessionStatusCompleted 已成功导出
AVAssetExportSessionStatusFailed 导出失败
AVAssetExportSessionStatusCancelled 已取消

你可能感兴趣的:(OC之编码asset的AVAssetExportSession)