使用问题
AVAssetExportSession可以对视频进行编辑导出。具体代码如下
AVURLAsset *urlAsset = [AVURLAsset URLAssetWithURL:[NSURL fileURLWithPath:videoPath] options:nil];
NSArray *exportArray = [AVAssetExportSession exportPresetsCompatibleWithAsset:urlAsset];
NSLog(@"exportArray = %@",exportArray);
// if ([exportArray containsObject:AVAssetExportPresetLowQuality]) {
AVAssetExportSession *session = [[AVAssetExportSession alloc] initWithAsset:urlAsset presetName:AVAssetExportPresetHighestQuality];
//素材文件夹
NSString *filePath = [NSHomeDirectory() stringByAppendingPathComponent:@"/Documents"];
//先判断有没有DownloadEditFile文件夹
if (![[NSFileManager defaultManager] fileExistsAtPath:filePath isDirectory:nil]) {
[[NSFileManager defaultManager] createDirectoryAtPath:filePath withIntermediateDirectories:YES attributes:nil error:nil];
}
NSString * savePath = [filePath stringByAppendingFormat:@"/test.mp4"];
[session setOutputURL:[NSURL fileURLWithPath:savePath]];
[session setOutputFileType:AVFileTypeQuickTimeMovie];
[session exportAsynchronouslyWithCompletionHandler:^{
switch ([session status]) {
case AVAssetExportSessionStatusCompleted:
NSLog(@"转吗完成");
break;
case AVAssetExportSessionStatusFailed:
NSLog(@"转吗失败 %@,,,,%@",[[session error] localizedDescription],[session error]);
default:
break;
}
}];
容易出错的问题点
1.在创建AVURLAsset时
我们在使用NSURL时,要使用fileURLWithPath创建,不能使用URLWithString进行创建。
2.在设置OutputURL导出录制时
问题同上,也是使用fileURLWithPath
3.很容易忽略的点
就是我们在设置到处文件路径时,要确保路径文件不存在,如果使用已经存在的路径,会照成到处视频失败。
我们可以使用时间戳作为名字这样更安全。
NSString * savePath = [filePath stringByAppendingFormat:@"/%f.mp4",[NSDate date].timeIntervalSince1970*1000];
4.使用AVAssetExportSession可以吧h265编码的视频转化为h264
因为现在有些播放器在播放h265编码格式的视频时,会出现画面或者音频不同步或者卡顿等问题,那我们就可以先通过AVAssetExportSession吧视频素材先转为h264编码格式的,再进行播放等操作就可以了。