OC之编码asset的AVAssetExportSession
AVAssetExportSession 继承自NSObject
,该对象对asset
编码,以创建指定exportPresets
描述格式的output
。
在创建该类之前,使用allexportpreset
属性获取可用预置的完整列表。调用+exportPresetsCompatibleWithAsset:
获得与指定asset
兼容的预置列表。
在使用包含源媒体、presetName
和outputFileType
的asset
创建该类对象之后,通过调用-exportasynchronouswithcompletionhandler:
来异步导出。可以监听progress
检查进度。根据设备的功能,当尝试多个导出时,一些导出可能会排队等待AVAssetExportSessionStatusWaiting
。
无论导出成功、失败或取消,都会调用-exportAsynchronouslyWithCompletionHandler:
方法;在该方法的block中:status
属性指示导出是否已成功完成,如果失败,则error
属性提供失败信息。
1、初始化会话
- (instancetype)initWithAsset:(AVAsset *)asset presetName:(NSString *)presetName;
+ (instancetype)exportSessionWithAsset:(AVAsset *)asset presetName:(NSString *)presetName;
使用指定的asset
和presetName
初始化会话:
- 参数
asset
:要导出的asset
。 - 参数
presetName
:字符串常量,指定导出的presetName
。
2、配置输出
配置属性 | 数据类型 | 描述 |
---|---|---|
outputURL |
NSURL |
配置输出地址URL。 |
supportedFileTypes |
NSArray |
只读数组,可以写入的文件类型AVFileType :由exportPresets 和初始化会话的asset 确定。 |
outputFileType |
AVFileType |
会话要写入的文件类型;该值是与写入asset 时要使用的文件类型对应的UTI字符串,必须为该属性设置一个值。 |
fileLengthLimit |
longlong |
文件长度限制;根据源asset 的内容,输出可能略微超过文件长度限制。如果在使用输出之前需要遵守严格的限制,则应测试输出文件的长度。 |
timeRange |
CMTimeRange |
从源asset 导出的时间范围;默认时间范围是kCMTimeZero 到kCMTimePositiveInfinity ,导出asset 的整个持续时间。 |
metadata |
NSArray |
要写入输出文件的元数据AVMetadataItem ;如果该值为nil,则导出asset 中的任何现有元数据将被尽可能准确地转换为输出文件的适当元数据字典,并写入输出。 |
metadataItemFilter |
AVMetadataItemFilter |
指定导出期间使用的过滤器对象,以确定应该从源asset 转移哪些元数据项;默认值为nil,不会应用任何过滤器。过滤器将不会应用于通过metadata 属性设置的元数据集。要将筛选器应用于元数据,参阅AVMetadataItem 。 |
audioMix |
AVAudioMix |
启用非默认音频混合以进行导出。 |
audioTimePitchAlgorithm |
AVAudioTimePitchAlgorithm |
用于管理缩放音频的处理算法;默认值是AVAudioTimePitchAlgorithmSpectral 。如果将此属性设置为时间间隔算法设置中定义的常量以外的值,则会引发异常。 |
shouldOptimizeForNetworkUse |
BOOL |
指示是否为网络使用优化电影。 |
videoComposition |
AVVideoComposition |
视频合成的说明,并指示是否允许导出视频合成。 |
customVideoCompositor |
id<AVVideoCompositing> |
如果有,使用的自定义视频合成器实例;如果没有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<NSString *> *)allExportPresets;
3.2、返回与指定asset
兼容的presetName
返回与指定asset
兼容的标识符
+ (NSArray<NSString *> *)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;
异步检查presetName
、asset
与outputFileType
的兼容性:
- 参数
presetName
:导出操作的预设模板的名称。 - 参数
asset
:将导出的AVAsset
对象。 - 参数
outputFileType
:与文件类型对应的UTI字符串。例如,指定QuickTime影片文件格式AVFileTypeQuickTimeMovie
。 - 参数
handler
:要执行结果的块不能为nil。这个块在分线程只接受一个布尔值:如果选项组合是兼容的,则为YES;如果不兼容,则为NO。
并非所有presetName
都与所有资源和文件类型兼容,因此调用此方法在使用之前查询特定组合的兼容性。要确保导出操作成功,不应在调用此方法和执行导出操作之间对asset
进行任何重大更改。
3.4、确定会话可以编写的文件类型
- (void)determineCompatibleFileTypesWithCompletionHandler:(void (^)(NSArray<AVFileType> *compatibleFileTypes))handler;
确定会话的兼容文件类型:
- 参数
handler
:要执行结果的块不能为nil;此块采用数组参数并且不返回任何结果。块中数组包含多个兼容文件类型UTI的NSString
对象;文件类型没有特定的顺序。
该方法操作用于创建会话的asset
对象和presetName
信息;它使用这些信息来确定导出会话可以编写的文件类型。
该方法在分线程上异步执行其检查并立即返回。因为此方法实际上会检查asset
的轨道,所以如果轨道尚未加载,则会加载轨道。
4、导出媒体
只读属性 | 数据类型 | 描述 |
---|---|---|
error |
NSError |
导出状态为AVAssetExportSessionStatusFailed 或AVAssetExportSessionStatusCancelled 时发生的错误;如果没有错误,则为nil。 |
estimatedOutputFileLength |
longlong |
预估导出文件的字节数 |
maxDuration |
CMTime |
预估导出媒体的最大时长;presetName 为AVAssetExportPresetPassthrough 或AVAssetExportPresetAppleProRes422LPCM 时返回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 |
已取消 |