我正在尝试合并一些音频文件(通过MPMediaPickerController选取),但导出始终失败,错误代码为-12780。
当我尝试使用AVPlayer对象播放我的合成时,它会正常播放。 只是出口失败了。
我做错了什么?
这是我的代码:
AVAssetExportSession *exportSession;
AVPlayer *player;
- (void)mergeAudiofiles {
// self.mediaItems is an NSArray of MPMediaItems
if (self.mediaItems.count == 0) {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error"
message:@"No Tracks selected."
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alert show];
return;
}
// Configure audio session
NSError *sessionError;
AVAudioSession *session = [AVAudioSession sharedInstance];
[session setCategory:AVAudioSessionCategoryAudioProcessing error:nil];
[session setActive:YES error:&sessionError];
if (sessionError) NSLog(@"Session-Error: %@", sessionError.localizedDescription);
// Create composition
AVMutableComposition *composition = [AVMutableComposition composition];
AVMutableCompositionTrack *track = [composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];
CMTime position = kCMTimeZero;
for (MPMediaItem *item in self.mediaItems) {
NSURL *assetURL = [item valueForProperty:MPMediaItemPropertyAssetURL];
AVAsset *asset = [AVAsset assetWithURL:assetURL];
CMTimeRange duration = CMTimeRangeMake(kCMTimeZero, asset.duration);
// duration = CMTimeRangeMake(kCMTimeZero, CMTimeMake(5, 1)); // For player test
NSError *error;
[track insertTimeRange:duration ofTrack:[[asset tracksWithMediaType:AVMediaTypeAudio] lastObject] atTime:position error:&error];
if (error) NSLog(@"ERROR! :(");
position = CMTimeAdd(position, duration.duration);
}
// Path to output file
NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSURL *exportUrl = [NSURL URLWithString:[documentsDirectory stringByAppendingPathComponent:@"export.m4a"]];
NSLog(@"Export URL = %@", exportUrl.description);
// Playing works!
// """"""""""""""
// AVPlayerItem *pitem = [[AVPlayerItem alloc] initWithAsset:composition];
// player = [[AVPlayer alloc] initWithPlayerItem:pitem];
// [player play];
//
// return;
// Export
exportSession = [[AVAssetExportSession alloc] initWithAsset:composition presetName:AVAssetExportPresetAppleM4A];
exportSession.outputURL = exportUrl;
exportSession.outputFileType = AVFileTypeAppleM4A;
[exportSession exportAsynchronouslyWithCompletionHandler:^{
switch (exportSession.status) {
case AVAssetExportSessionStatusFailed:
NSLog(@"Export failed -> Reason: %@, User Info: %@",
exportSession.error.localizedDescription,
exportSession.error.userInfo.description);
break;
case AVAssetExportSessionStatusCancelled:
NSLog(@"Export cancelled");
break;
case AVAssetExportSessionStatusCompleted:
NSLog(@"Export finished");
break;
default:
break;
}
}];
}
答案 0 :(得分:18)
需要将导出网址更改为:
NSURL *exportUrl = [NSURL fileURLWithPath:[documentsDirectory stringByAppendingPathComponent:@"export.m4a"]];
引用文件路径时必须使用fileURLWithPath。我也被这个挂了,直到我读到这个:AVAssetExportSession outputfile