AVFoundation框架学习之AVAssetExportSe

作者: 亭竹丶 | 来源:发表于2017-06-21 17:50 被阅读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

相关文章

网友评论

  • 阿杰的人生路:麻烦问一下,你是怎么忍受你的主题颜色的。眼没事么
  • biny_ios:麻烦问一下,分离的音频能设置特定的采样速率吗
  • 牛巴粉带走:你好,我这里有个问题,视频是用网络URL,exportAsynchronouslyWithCompletionHandler失败。Operation Stopped,
    牛巴粉带走:@亭竹丶 我可以使用URLWithString 来获取到 asset,做的是视频剪辑,还是失败,原因是什么?
    亭竹丶:这个是本地路径的视频转码,网络的不行
  • 二营长意大利炮呢:这个顶不住压力测试怎么搞?
    亭竹丶:@享尒 原因你找到没?我这用的都是官方的api,我也没做过多次循环调用压缩
    二营长意大利炮呢:@亭竹丶 就是多次循环调用压缩,会导致内存泄漏
    亭竹丶:@享尒 可以说具体点不?
  • smile夕颜:在坐的各位都是垃圾
    亭竹丶:@黯然_10ce 你是不是用的kvo的方式去打印的?这个进度不支持kvo的方式。我使用其他方式测试打印进度是在走的,没有问题。
    be30ef312e75:你的进度好像没有用,一直都是0
    41737f6cf9b7:你厉害,你也贡献一点啊
  • Jey欧巴:恩,这样看起来正规多了

本文标题:AVFoundation框架学习之AVAssetExportSe

本文链接:https://www.haomeiwen.com/subject/vnytcxtx.html