gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:05:00 27 4
gpt4 key购买 nike

感谢阅读我的问题。 :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 个月,仍在寻找解决方案。

更新:
是否可能由于使用 block ?我正在使用 block 句柄格式化 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这不是 block 的错,我试图只使用 alloc-init 然后设置我的声音模型的所有属性。同一行的相同问题。

最佳答案

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

无法插入资源进行跟踪

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

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

希望能有所帮助。

关于ios - 在将音频记录加载到 AVURLAsset 期间发出,然后插入 AVMutableCompositionTrack,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38196217/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com