加载记录音频到AVURLAsset时出现问题然后插入AVMutableCompositionTrack

时间:2016-07-05 06:05:31

标签: ios audio avfoundation avaudiosession

感谢您阅读我的问题。 :d

这是我的问题

我正在使用AVAudioRecorder将音频文件录制为Vocal资源,旨在在不同时间将声音插入我的视频。 但是当我将声音插入我的声乐轨道(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个月了,仍然找到了解决方案。

更新 的:
是否可以使用块?我正在使用块句柄格式化vocalModel

[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]);
    }];
当我试图插入音乐曲目时,我会提醒我一些东西,我之前使用enumerateByBlock将每个源曲目插入到项目曲目中,并捕获了相同的错误(嗯......可能不完全相同,但仍然未知错误)在插入音乐曲目期间。

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

我会在找到更多信息后立即更新我的问题。

更新#2 这不是块的错,我试图只使用alloc-init然后在同一行设置我的vocal model.same问题的所有属性。

1 个答案:

答案 0 :(得分:1)

在这里,我找到了一些关于我的问题的解决方案,以暂时解决我的问题的这一部分

无法插入要跟踪的资源

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

但我仍然相信它可能不是解决这个问题的最佳方法。

希望可以提供帮助。