Ios insertTimeRange:ofTrack:atTime:error:(类AVMutableCompositionTrack)在iPhone上失败

Ios insertTimeRange:ofTrack:atTime:error:(类AVMutableCompositionTrack)在iPhone上失败,ios,objective-c,iphone,avasset,avmutablecomposition,Ios,Objective C,Iphone,Avasset,Avmutablecomposition,insertTimeRange:ofTrack:atTime:error:OfClass AVMutableCompositionTrack返回NO,错误提示操作无法在iPhone上完成,但无法在模拟器上完成。这个错误消息毫无帮助,我很难找到错误的原因,更不用说解决方法了。任何帮助都将不胜感激 在下面的示例代码中,我所做的只是尝试将音频剪辑添加到AVMutableCompositionTrack。下面是代码中发生的情况: AVMutableComposition和AVMutableComposi

insertTimeRange:ofTrack:atTime:error:OfClass AVMutableCompositionTrack返回NO,错误提示操作无法在iPhone上完成,但无法在模拟器上完成。这个错误消息毫无帮助,我很难找到错误的原因,更不用说解决方法了。任何帮助都将不胜感激

在下面的示例代码中,我所做的只是尝试将音频剪辑添加到AVMutableCompositionTrack。下面是代码中发生的情况:

AVMutableComposition和AVMutableCompositionTrack对象是在init中创建的

调用类方法addPhrase:atTime:将音频剪辑添加到合成曲目中

实际插入的函数是addAudioClip:atTime:

助手函数audioClipWithName:ofType将请求的音频文件加载到AVAssetTrack中

->NSLOG输出:

insertTimeRange atTime=0.0 range=0.0,2.1合成轨迹= -----错误!Error Domain=AVFoundationErrorDomain Code=-11800操作无法完成UserInfo={NSLocalizedDescription=操作无法完成,NSUnderlyingError=0x16fc1c90{Error Domain=nsossStatUserRorDomain Code=-12780 null},NSLocalizedFailureReason=发生未知错误-12780}

->示例代码:

@interface MyAudioPlayer()

@property (strong, nonatomic) AVMutableComposition *composition;
@property (strong, nonatomic) AVMutableCompositionTrack *compositionTrack;

@end


@implementation MyAudioPlayer

- (id) init
{
    self = [super init];
    if (self != nil) {
        self.composition = [AVMutableComposition composition];
        self.compositionTrack = [self.composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];
    }
    return self;
}

// Add the phrase into compositionAudioTrack at the given time.
- (void) addPhrase:(NSString *)phrase atTime:(CMTime)atTime
{
    // Add the phrase to the audio.
    AVAssetTrack *audioClip = [self audioClipWithName:phrase ofType:@"mp3"];
    // Add the phrase to the audio track.
    [self addAudioClip:audioClip atTime];
}

// Add the given audio clip to the composed audio at the given time.
- (void) addAudioClip:(AVAssetTrack *)audioClip atTime:(CMTime)atTime
{
    NSError *error = [[NSError alloc] init];
    CMTimeRange audioClipRange = CMTimeRangeMake(kCMTimeZero, audioClip.timeRange.duration);
    BOOL success = [self.compositionTrack insertTimeRange:audioClipRange ofTrack:audioClip atTime:atTime error:&error];
    NSLog(@"insertTimeRange atTime=%.1f range=(%.1f, %.1f) compositionTrack=%@\n", CMTimeGetSeconds(atTime), CMTimeGetSeconds(audioClipRange.start), CMTimeGetSeconds(audioClipRange.duration), self.compositionTrack);
    if (!success) {
        NSLog(@"----------ERROR! %@", error);
    }
}

// Return an audio clip with the given name and type.
- (AVAssetTrack *) audioClipWithName:(NSString *)name ofType:(NSString *)type
{
    NSString *soundFilePath = [[NSBundle mainBundle] pathForResource:name ofType:type];
    NSURL *fileURL = [[NSURL alloc] initFileURLWithPath:soundFilePath];
    AVAsset *avAsset = [AVURLAsset URLAssetWithURL:fileURL options:nil];
    AVAssetTrack *audioClip = [[avAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0];
    return audioClip;
}

@end
你的问题在于

- (AVAssetTrack *) audioClipWithName:(NSString *)name ofType:(NSString *)type;
它让曲目拥有的AVAsset超出范围并被解除分配,使曲目处于不良状态

在调用insertTimeRange之前,请确保至少引用了AVAsset。实际上,这意味着您应该将AVAsset及其AVAssetTrack一起传递。

您的问题在于

- (AVAssetTrack *) audioClipWithName:(NSString *)name ofType:(NSString *)type;
它让曲目拥有的AVAsset超出范围并被解除分配,使曲目处于不良状态


在调用insertTimeRange之前,请确保至少引用了AVAsset。实际上,这意味着您应该一起传递AVAsset及其AVAssetTrack。

很乐意帮助-这个错误很容易犯。@RhythmicFistman非常感谢您的帮助!这样的错误很难找到。你应该在你的答案上投更多的赞成票。不客气!这是一个有点灰色的区域,对于这种问题应该有更好的错误代码和文档,或者应该通过更好的api设计来避免。很乐意帮助-这个错误很容易犯。@hythricfistman非常感谢您的帮助!这样的错误很难找到。你应该在你的答案上投更多的赞成票。不客气!这是一个灰色地带,应该有更好的错误代码和此类问题的文档,或者应该通过更好的api设计来避免?。