2016-07-05 67 views
2

感谢您阅读我的问题。 :d将加载记录音频发送到AVURLAsset然后插入AVMutableCompositionTrack

这里是我的问题

我用AVAudioRecorder录制音频文件声乐资源,针对不同的时间插入声音我的视频。 但是有当我插入的声音我的声音轨道(AVMutableCompositionTrack),以及错误味精只是告诉我的错误这个

Error Domain=AVFoundationErrorDomain 
Code=-11800 
"The operation could not be completed" 
UserInfo={NSUnderlyingError=0x137104220 
{Error Domain=NSOSStatusErrorDomain Code=-12780 "(null)"}, 
NSLocalizedFailureReason=An unknown error occurred (-12780), 
NSLocalizedDescription=The operation could not be completed} 

当我将歌唱到我的声音轨道,我用一样的方式喜欢插入音乐曲目。这里是我插入的音乐曲目

/*this is my testing code of inserting music track to my video project*/ 
self.musicTrack = [self.projectComposition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:3]; 

NSString *file = [[NSBundle mainBundle] pathForResource:@"Lost!" ofType:@"mp3"]; 

NSURL *musicURL = [NSURL fileURLWithPath:file]; 

AVURLAsset *music = [AVURLAsset assetWithURL:musicURL]; 

AVAssetTrack *musicTrack = [music tracksWithMediaType:AVMediaTypeAudio].firstObject; 

NSError *err; 

[self.musicTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, CMTimeMakeWithSeconds(10, kCMTimeMaxTimescale)) ofTrack:musicTrack atTime:CMTimeMakeWithSeconds(0, kCMTimeMaxTimescale) error:&err]; 

[self.musicTrack insertTimeRange:CMTimeRangeMake(CMTimeMakeWithSeconds(15, kCMTimeMaxTimescale), 
               CMTimeMakeWithSeconds(5, kCMTimeMaxTimescale)) 
         ofTrack:musicTrack 
          atTime:CMTimeMakeWithSeconds(20, kCMTimeMaxTimescale) 
          error:&err]; 


[self.musicTrack insertTimeRange:CMTimeRangeMake(CMTimeMakeWithSeconds(24, kCMTimeMaxTimescale), 
               CMTimeMakeWithSeconds(10, kCMTimeMaxTimescale)) 
         ofTrack:musicTrack 
          atTime:CMTimeMakeWithSeconds(30, kCMTimeMaxTimescale) 
          error:&err]; 

[self.musicTrack insertTimeRange:CMTimeRangeMake(CMTimeMakeWithSeconds(0, kCMTimeMaxTimescale), 
               CMTimeMakeWithSeconds(10, kCMTimeMaxTimescale)) 
         ofTrack:musicTrack 
          atTime:CMTimeMakeWithSeconds(45, kCMTimeMaxTimescale) 
          error:&err]; 

self.musicParameters = [AVMutableAudioMixInputParameters audioMixInputParametersWithTrack:self.musicTrack]; 

[self.musicParameters setVolume:.8f atTime:kCMTimeZero]; 

代码是效果很好的代码

,这里是我的将人声

self.vocalTrack = [self.projectComposition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:4]; 

self.vocalParameters = [AVMutableAudioMixInputParameters audioMixInputParametersWithTrack:self.vocalTrack]; 

NSError *err; 
for (NSInteger i = 0; i < self.vocalResourceArray.count; i++) { 
    RAGE_VocalModel * vm = self.vocalResourceArray[i]; 
    [self.vocalTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, vm.vocal_Duration) ofTrack:vm.vocal_AssetTrack atTime:vm.vocal_StartTime error:&err]; 
    /*error caught from here*/ 
    if (err) { 
     [self.vocalTrack removeTimeRange:CMTimeRangeMake(kCMTimeZero, vm.vocal_Duration)]; 
     NSLog(@"Error during insert vocal track\nerr:%@",err); 
    } 
} 

[self.vocalParameters setVolume:1.f atTime:kCMTimeZero]; 

而且我使用相同的代码插入我的影片的代码声音目标音轨,工作正常。

所以我想这可能是一个问题,当我录制我的音频文件也许?我的音频格式设置的错误可能是什么?

这里是我的录音设置

NSString * rec_id = [NSString stringWithFormat:@"%zd",arc4random()]; 

NSURL *recordingFile = [NSURL fileURLWithPath:[[TARGET_DIR stringByAppendingPathComponent:@"Records"] stringByAppendingPathComponent:[NSString stringWithFormat:@"R%@.aac",rec_id]]]; 

NSDictionary *setting = @{ 
          AVFormatIDKey : @(kAudioFormatMPEG4AAC), 
          AVSampleRateKey : @44100, 
          AVNumberOfChannelsKey : @1, 
          AVEncoderAudioQualityKey : @(AVAudioQualityHigh), 
          }; 

,我通过采用该

self.recorder = [[AVAudioRecorder alloc]initWithURL:recordingFile settings:setting error:&err]; 

和......呃....工作正常录制音频,没有错误捕获。

无论如何,我试图检查沙盒中的音频文件,它可以在[MAC OS/Windows]上播放。

关于发生了什么事情的任何想法?这个问题已经引起我近2个月的时间,仍然找到解决办法。

更新
是可能的,因为使用块?我使用块处理

[RAGE_VocalModel vocalModelWithURL:recorder.url withCompleteHandle:^(RAGE_VocalModel *model) { 
     model.vocal_StartTime = Recording_Temp_Start_Time; 
     Recording_Temp_Start_Time = kCMTimeZero;; 
     [self.vocalResourceArray addObject:model]; 
     NSLog(@"thread = %zd",[NSThread currentThread]); 
    }]; 

这让我想起了什么,当我试图插入音乐曲目格式vocalModel,我使用enumerateByBlock插入每个源的轨道之前项目的轨道,并抓住了同样的错误(很好。 。插入音乐曲目期间,可能不完全相同,但仍然发现未知错误)。

顺便说一句,现在我的应用程序包中包含音乐,而声音文件位于沙盒中。

我会尽快更新我的问题,只要我找到更多信息。

更新#2 这不是块的错,我当时想只用alloc-init然后在同一线路设置我的声乐model.same问题的所有属性。

回答

1

在这里,我发现我的问题提出一些解决方案来临时解决我的问题

不能插入的这部分资源来跟踪

什么我发现是,它可能是由于音频文件没有完成格式化,所以我只是保存在我的人声模型中的文件URL,当我插入资源到我的音频/声音/音乐曲目,我只是加载一个临时AVURLAsset和泵出音轨,然后插入到我AVMutableCompositionTrack,这是工作很好。

但我仍然认为这可能不是这个问题的最佳解决方案。

希望可以帮助。