设置 `AVAssetExportSession` 的 `fileLengthLimit` 会导致:“导出失败:无法打开”

Setting `fileLengthLimit` of `AVAssetExportSession` causes: " Export failed: Cannot Open"

我正在尝试将 AVAssetExportSession 的大小限制为 10mb。不设置fileLengthLimit,则"Export is completed"。设置fileLengthLimit = 10*1024*1024后,"Export failed: Cannot Open".

 - (void) splitVideo{
     AVURLAsset *videoAsset = [AVURLAsset URLAssetWithURL:output options:nil];
     CMTime videoDuration = videoAsset.duration;

     CMTime start = CMTimeMakeWithSeconds(0, 1);
     CMTimeRange range = CMTimeRangeMake(start, videoDuration);

     NSString *outputPath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"output1.mp4"];
     [self cutVideo:output withRange:range withOutput:outputPath];
}

 - (void) cutVideo:(NSURL *)url  withRange:(CMTimeRange)range withOutput:(NSString*)path{

    AVAsset *asset = [[AVURLAsset alloc] initWithURL:url options:nil];
    NSArray *compatiblePresets = [AVAssetExportSession exportPresetsCompatibleWithAsset:asset];
    if ([compatiblePresets containsObject:AVAssetExportPresetHighestQuality]) {
         AVAssetExportSession *exportSession = [[AVAssetExportSession alloc]
                                           initWithAsset:asset presetName:AVAssetExportPresetPassthrough];

         NSURL *finalUrl = [NSURL fileURLWithPath:path];
         exportSession.outputURL = finalUrl;
         exportSession.outputFileType = AVFileTypeMPEG4;
         exportSession.fileLengthLimit = 10*1024*1024;
         exportSession.timeRange = range;

         [exportSession exportAsynchronouslyWithCompletionHandler:^{
             dispatch_async(dispatch_get_main_queue(), ^{

             });
             if ([exportSession status] == AVAssetExportSessionStatusCompleted){
                 NSLog(@"Export completed");
             }else if ([exportSession status] == AVAssetExportSessionStatusFailed){
                 NSLog(@"Export failed: %@", [[exportSession error] localizedDescription]);
             }else if ([exportSession status] == AVAssetExportSessionStatusCancelled){
                 NSLog(@"Export canceled");
             }
          }];
     }
 }

正在导出的视频大约为 25mb。

我替换了

AVAssetExportSession *exportSession = [[AVAssetExportSession alloc] initWithAsset:asset presetName:AVAssetExportPresetPassthrough]

与:

 AVAssetExportSession *exportSession = [[AVAssetExportSession alloc] initWithAsset:asset presetName:AVAssetExportPresetHighestQuality];

AVAssetExportPresetPassthrough - "This export option will cause the media of all tracks to be passed through to the output exactly as stored in the source asset"

我在使用 AVAssetExportSessionPresetHighestQuality 或除 PassThrough 之外的任何预设时看到了这个错误(并且通过 passthrough 会话对我的视频没有影响,所以它没用)。原来我的输入视频是问题所在 - 我认为分辨率太高(几乎是 4k 宽度),切换到 1920x1080 视频为我修复了它。