Tôi đang cố gắng xuất một số AVMutableComposition
bằng cách sử dụng AVAssetExportSession
.Xuất hiện AVAssetExportSession quá chậm
AVAssetExportSession *exporter = [[AVAssetExportSession alloc] initWithAsset:mutableComposition presetName:AVAssetExportPresetHighestQuality];
exporter.outputURL=url;
exporter.outputFileType = AVFileTypeQuickTimeMovie;
exporter.videoComposition = mainCompositionInst;
exporter.shouldOptimizeForNetworkUse = YES;
[exporter exportAsynchronouslyWithCompletionHandler:^
{
switch (exporter.status)
{
case AVAssetExportSessionStatusCompleted:
{
NSLog(@"Video Merge SuccessFullt");
}
break;
case AVAssetExportSessionStatusFailed:
NSLog(@"Failed:%@", exporter.error.description);
break;
case AVAssetExportSessionStatusCancelled:
NSLog(@"Canceled:%@", exporter.error);
break;
case AVAssetExportSessionStatusExporting:
NSLog(@"Exporting!");
break;
case AVAssetExportSessionStatusWaiting:
NSLog(@"Waiting");
break;
default:
break;
}
}];
Nhưng việc xuất video dài 1 phút mất khoảng 30 giây, quá nhiều xem xét ứng dụng máy ảnh tích hợp iPad mất chưa đến 2 giây.
Ngoài ra nếu tôi xóa videoComposition
khỏi nhà xuất khẩu, thời gian giảm xuống còn 7 giây, điều này vẫn không tốt khi xem xét độ dài video chỉ trong 1 phút. Vì vậy, tôi muốn biết làm cách nào để giảm thời gian xuất tối thiểu?
Ngoài ra, tôi muốn biết, không AVAssetExportSession
thường mất nhiều thời gian này hay chỉ là trường hợp của tôi?
Cập nhật: Merge Code:
AVMutableComposition * mutableComposition = [AVMutableComposition thành phần];
AVMutableCompositionTrack *videoCompositionTrack = [mutableComposition addMutableTrackWithMediaType:AVMediaTypeVideo
preferredTrackID:kCMPersistentTrackID_Invalid];
AVMutableCompositionTrack *audioCompositionTrack = [mutableComposition addMutableTrackWithMediaType:AVMediaTypeAudio
preferredTrackID:kCMPersistentTrackID_Invalid];
AVMutableVideoCompositionLayerInstruction *videoTrackLayerInstruction = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:videoCompositionTrack];
NSMutableArray *instructions = [NSMutableArray new];
CGSize size = CGSizeZero;
CMTime time = kCMTimeZero;
for (AVURLAsset *asset in assets)
{
AVAssetTrack *assetTrack = [[asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];
AVAssetTrack *audioAssetTrack = [asset tracksWithMediaType:AVMediaTypeAudio].firstObject;
NSError *error;
[videoCompositionTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, assetTrack.timeRange.duration)
ofTrack:assetTrack
atTime:time
error:&error];
[videoTrackLayerInstruction setTransform:assetTrack.preferredTransform atTime:time];
if (error) {
NSLog(@"asset url :: %@",assetTrack.asset);
NSLog(@"Error1 - %@", error.debugDescription);
}
[audioCompositionTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, audioAssetTrack.timeRange.duration)
ofTrack:audioAssetTrack
atTime:time
error:&error];
if (error) {
NSLog(@"Error2 - %@", error.debugDescription);
}
time = CMTimeAdd(time, assetTrack.timeRange.duration);
if (CGSizeEqualToSize(size, CGSizeZero)) {
size = assetTrack.naturalSize;
}
}
AVMutableVideoCompositionInstruction *mainInstruction = [AVMutableVideoCompositionInstruction videoCompositionInstruction];
mainInstruction.timeRange = CMTimeRangeMake(kCMTimeZero, time);
mainInstruction.layerInstructions = [NSArray arrayWithObject:videoTrackLayerInstruction];
AVMutableVideoComposition *mainCompositionInst = [AVMutableVideoComposition videoComposition];
mainCompositionInst.instructions = [NSArray arrayWithObject:mainInstruction];
mainCompositionInst.frameDuration = CMTimeMake(1, 30);
mainCompositionInst.renderSize = size;
Tôi đã thử tất cả những điều bạn đã đề cập nhưng không nhận thấy bất kỳ thay đổi nào về thời gian xuất (ít nhất là quan trọng). Tôi cũng đã đăng mã kết hợp của mình. Như tôi đã nói thời gian xuất rất cao nếu tôi thêm hướng dẫn thông qua AVVideoComposition. Vì vậy, chỉ muốn bạn kiểm tra một phần đặc biệt. – blancos
Nếu mã của bạn không chứa AVVideoComposition thì vui lòng bạn có thể thêm mã có hướng dẫn trống và kiểm tra xem điều đó có tạo ra sự khác biệt hay không. – blancos
xóa bất kỳ dấu vết nào của hướng dẫn trừ khi bạn sử dụng nó (AVMutableVideoCompositionInstruction) - bởi vì dường như bạn không có; nó sẽ giúp vô cùng, tôi nghĩ biến đổi và những thứ khác khiến nó hoạt động chậm. Ngoài ra, loại bỏ thời lượng khung hình và kích thước hiển thị, một trong số đó cũng sẽ tạo sự khác biệt. Chỉ cần kiểm tra :) Bởi vì thành phần không yêu cầu bất kỳ của những người, nó là tất cả tùy chọn. –