2015-07-24 15 views
5

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; 

Trả lời

1

Tôi đã tạo ứng dụng hợp nhất các đoạn video khác nhau và tôi có thể nói đó là trường hợp của bạn một cách an toàn. Các tệp video của tôi có ~ 10 mb nên có thể chúng nhỏ hơn một chút nhưng phải mất ít hơn hai giây để hợp nhất chúng lại với nhau, ngay cả khi có 10, 20 phân đoạn.

Bây giờ như đối với nó thực sự xảy ra, tôi đã kiểm tra cấu hình của tôi chống lại bạn và sự khác biệt là sau đây:

  • tôi sử dụng export.outputFileType = AVFileTypeMPEG4
  • tôi đã tối ưu hóa mạng vô hiệu hóa, và nếu bạn không có kế hoạch dòng video từ thiết bị của bạn, bạn nên vô hiệu hóa nó quá

Ngoài ra, tôi cũng không thể so sánh nó vì bạn sẽ phải cung cấp mã về cách bạn thực sự tạo bố cục. Có một số điều để kiểm tra mặc dù:

  • nếu bạn đang sử dụng AVURLAssetPreferPreciseDurationAndTimingKey khi tạo AVURLAsset và bạn không có đủ các khung hình chính, nó thực sự có thể mất một thời gian khá lâu để tìm kiếm qua để tìm các phím và vì vậy nó làm chậm nó xuống
  • Hãy xem xét nếu bạn thực sự cần chất lượng cao nhất cho video
  • Hãy xem xét độ phân giải của video và có thể hạ thấp nó xuống

tôi sẽ có thể giúp bạn nhiều hơn nếu bạn cung cấp thêm thông tin, nhưng có lẽ một số của stuf này f sẽ hoạt động. Hãy thử và sau đó báo cáo lại.

Hy vọng nó sẽ giúp ích một chút!

Chỉnh sửa 1: Tôi quên đề cập rằng nếu bạn không có lựa chọn, bạn nên cố gắng sử dụng thư viện FFmpeg vì hiệu suất rất cao, mặc dù do cấp phép có thể không phù hợp với bạn.

+0

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

+0

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

+0

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. –

Các vấn đề liên quan