-[__NSArrayM objectAtIndex:]: индекс 0 за пределами для пустого массива 'при использовании insertTimeRange в AVMutableComposition
Ниже мой код
firstAsset = [[AVURLAsset alloc] initWithURL:[NSURL fileURLWithPath:_strThumbForegroundVideo] options:nil];
AVMutableComposition* mixComposition = [[AVMutableComposition alloc] init];
AVMutableCompositionTrack *firstTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];
[firstTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, firstAsset.duration) ofTrack:[[firstAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] atTime:kCMTimeZero error:nil];
В логах:
Значение для _strThumbForegroundVideo:
/private/var/mobile/Containers/Data/Application/80C71B40-87DA-449F-832C-1D27722727D8/tmp/90219F63-073E-4586-A1F6-DD68B627C3D1.mov
Значение для firstAsset:
AVURLAsset: 0x1702362c0, URL = file:///private/var/mobile/Containers/Data/Application/80C71B40-87DA-449F-832C-1D27722727D8/tmp/90219F63-073E-4586-A1F6-DD68B627C3D1.mov
Значение firstTrack:
AVMutableCompositionTrack: 0x174033b20 trackID = 1, mediaType = vide, editCount = 0
При выполнении "insertTimeRange" я получаю эту ошибку,
-[__NSArrayM objectAtIndex:]; // index 0 beyond bounds for empty array' while using insertTimeRange in AVMutableComposition
Я пытаюсь объединить 2 видео с помощью учебника по этой ссылке. Единственное отличие состоит в том, что в этом уроке они импортировали видео из Фото, и я конвертировал путь недавно записанного видео в AVAsset, а затем выполнял те же функции. Видео, которое я записываю, можно найти в галерее и по тому же пути, что и у меня.
Здесь мне все равно нужны видео ресурсы, так как это не обязательно. Следовательно, не может использовать что-то вроде
NSArray *dataSourceArray = [NSArray arrayWithArray: [firstAsset tracksWithMediaType:AVMediaTypeVideo]];
[firstTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, firstAsset.duration)
ofTrack:([dataSourceArray count]>0)?[dataSourceArray objectAtIndex:0]:nil
atTime:kCMTimeZero
error:nil];
Реализация сделана в Xcode 8.1
1 ответ
Используйте код ниже, это может работать для вас
NSURL *videoURL = [NSURL fileURLWithPath:path] // Don't use URLWithString if any one using .
AVAsset *firstAsset=[AVAsset assetWithURL:videoURL]; // get your asset
AVMutableCompositionTrack *firstTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo
preferredTrackID:kCMPersistentTrackID_Invalid];
[firstTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, firstAsset.duration)
ofTrack:[[firstAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] atTime:kCMTimeZero error:nil];
Пожалуйста, проверьте перед вами insertTrack
если ваш ресурс содержит медиа-треки такого типа, здесь я предполагаю, что мои ресурсы содержат по крайней мере один медиа-трек видео AVMediaTypeVideo
,
если вы не уверены чем, проверьте, сколько треков содержит ваши активы. используйте код ниже
NSArray *videoTracks = [NSArray arrayWithArray: [secondAsset tracksWithMediaType:AVMediaTypeVideo]];
NSLog(@"videoTracks count => %ld",[videoTracks count]);
[firstTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, firstAsset.duration)
ofTrack:([videoTracks count]>0)?[videoTracks objectAtIndex:0]:nil
atTime:kCMTimeZero
error:nil];