在将音频记录加载到 AVURLAsset 期间发出,然后插入 AVMutableCompositionTrack

Issue during load record audio to AVURLAsset then insert AVMutableCompositionTrack

感谢阅读我的问题。 :D

这是我的问题

我正在使用 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 个月,仍在寻找解决方案。

更新:
是否可能由于使用块?我正在使用块句柄格式化 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 然后在同一行设置我的声音 model.same 问题的所有属性。

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

无法将资源插入曲目

我发现的是,这可能是由于音频文件未完成格式化,所以当我将资源插入 audio/sound/music 时,我只是将文件 URL 保存在我的声乐模型中轨道,我只是加载一个临时 AVURLAsset 并抽出音轨,然后插入到我的 AVMutableCompositionTrack 中,效果很好。

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

希望能有所帮助。