iOS大咖说AVPlayer和GPUImagede学习iOS Develop

AVFoundation框架学习之AVAssetExportSe

2017-06-21  本文已影响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

上一篇 下一篇

猜你喜欢

热点阅读