试图将视频与AVMutableComposition合并的异常错误:“对象不能为零”......但它们似乎不是零?

时间:2013-02-18 18:27:23

标签: ios objective-c nsmutablearray avfoundation avmutablecomposition

我的大脑感觉就像炒鸡蛋......我正在尝试将视频剪辑合并在一起。我将每个剪辑URL存储在NSMutableArray(arrayClipURL)&这一切都很好。当我打印timeRanges&在调试控制台中跟踪(两个NSMutableArrays),一切都检出,这意味着for循环正在完成它的工作。我不断收到异常错误:' * - [__ NSArrayM insertObject:atIndex:]:object不能为nil'。

我扔了一个异常断点,它在下面的最后一行打破了。我无法弄明白,因为timeRanges和track都不是nil ...我可以在调试控制台中打印它们,并在断开的行之前直接看到它们。

composition = [[AVMutableComposition composition] init];

composedTrack = [[AVMutableCompositionTrack alloc] init];
composedTrack = [composition addMutableTrackWithMediaType:AVMediaTypeVideo
                                         preferredTrackID:kCMPersistentTrackID_Invalid];

NSMutableArray * timeRanges = [[NSMutableArray alloc] initWithCapacity:arrayClipURL.count];
NSMutableArray * tracks = [[NSMutableArray alloc] initWithCapacity:arrayClipURL.count];

for (int i=0; i<[arrayClipURL count]; i++){
    AVURLAsset *assetClip = [[AVURLAsset alloc] initWithURL:[arrayClipURL objectAtIndex:i] options:nil];
    AVAssetTrack *clipTrack = [[AVAssetTrack alloc] init];
    clipTrack = [[assetClip tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];
    [timeRanges addObject:[NSValue valueWithCMTimeRange:CMTimeRangeMake(kCMTimeZero, assetClip.duration)]];
    [tracks addObject:clipTrack];
}
debug(@"timeranges:  %@",timeRanges);
debug(@"tracks:  %@",tracks);

[composedTrack insertTimeRanges:timeRanges ofTracks:tracks atTime:kCMTimeZero error:nil]; 

我需要一些老手帮助:(知道可能导致问题的原因吗?

编辑: 以下是在控制台中打印2个阵列的方式。我唯一能想到的可能是CMTimeRange或AVAssetTrack都没有在数组中正确格式化?我不知道。只是认为在抛出异常时看看它实际上试图插入的内容可能会有所帮助。

    2013-02-18 13:18:20.811 app[5242:907] [AVCaptureManager.m:401] timeranges array:  (
    "CMTimeRange: {{0/1 = 0.000}, {498/600 = 0.830}}",
    "CMTimeRange: {{0/1 = 0.000}, {556/600 = 0.927}}"
)
2013-02-18 13:18:20.812 app[5242:907] [AVCaptureManager.m:402] tracks array:  (
    "<AVAssetTrack: 0x220c21a0, trackID = 1, mediaType = vide>",
    "<AVAssetTrack: 0x1cdec820, trackID = 1, mediaType = vide>"
)

1 个答案:

答案 0 :(得分:1)

您的问题是由AVURLAsset实例的范围引起的

由于你在for循环中AVURLAsset * assetClip,它在它之外是无效的,你提取的曲目也不是。

如果您将assetClip保存在一个不在for循环范围内的数组中,它应该可以解决您的问题