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> 如果有,使用的自定义视频合成器实例;如果没有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;

异步检查presetNameassetoutputFileType的兼容性:

  • 参数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 导出状态为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 已取消
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354

推荐阅读更多精彩内容