无法使用AVAssetExportSession导出AVMutableComposition

时间:2018-07-23 13:46:35

标签: objective-c avassetexportsession

这是创作创作的一部分:

  AVMutableComposition* mixComposition = [[AVMutableComposition alloc] init];

  for (NSDictionary *track in tracks) {
    NSURL *url = [[NSURL alloc] initWithString:track[@"url"]];
    AVURLAsset *urlAsset = [AVURLAsset URLAssetWithURL:url options:nil];
    AVMutableCompositionTrack *firstTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeAudio
                                                                        preferredTrackID:kCMPersistentTrackID_Invalid];

    [firstTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, urlAsset.duration)
                        ofTrack:[[urlAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0]
                         atTime:kCMTimeZero
                          error:nil];
  }
  [self persist:mixComposition for:songId];

然后我希望将收集保存在目录中,这样我就不必每次都下载它

合成的输出如下:

“ AVMutableCompositionTrack:0x1c4a276a0 trackID = 1,mediaType = soun,editCount = 1”,      “” AVMutableCompositionTrack:0x1c4a28560 trackID = 2,mediaType = soun,editCount = 1“ ...

- (void)persist:(AVMutableComposition *) composition
            for:(NSString *) songId {

  NSLog(@"%@", composition);


  AVAssetExportSession *exportSession = [[AVAssetExportSession alloc]
                                         initWithAsset:composition
                                         presetName:AVAssetExportPresetAppleM4A];
  NSString *path = [NSHomeDirectory() stringByAppendingPathComponent: songId];
  NSURL *url = [NSURL fileURLWithPath: path];
  exportSession.outputURL = url;
  exportSession.shouldOptimizeForNetworkUse = YES;
  exportSession.outputFileType = AVFileTypeAppleM4A;


  //   perform the export
  [exportSession exportAsynchronouslyWithCompletionHandler:^{

    if (AVAssetExportSessionStatusCompleted == exportSession.status) {
      NSLog(@"AVAssetExportSessionStatusCompleted");
      NSLog(@"Path : %@", url);
    } else if (AVAssetExportSessionStatusFailed == exportSession.status) {
      // a failure may happen because of an event out of your control
      // for example, an interruption like a phone call comming in
      // make sure and handle this case appropriately
      NSLog(@"%@", exportSession.error);

    } else {
      NSLog(@"Export Session Status: %ld", (long)exportSession.status);
    }
  }];

}

我得到的错误:

  

Error Domain = AVFoundationErrorDomain代码= -11800“该操作可能   未完成” UserInfo = {NSLocalizedFailureReason =未知错误   发生(-12780),NSLocalizedDescription =无法执行该操作   已完成,NSUnderlyingError = 0x1c0a409f0 {Error   Domain = NSOSStatusErrorDomain Code = -12780“(null)”}}

1 个答案:

答案 0 :(得分:0)

您使用的路径必须导出文件的内容类型,如下所示:

    let directory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first
    let audioTypeOutput = ".m4a"//type of your file, mp3, m4a for audio
    let exportPath = directory?.appendingPathComponent(name + audioTypeOutput)

希望获得帮助!