с проблемой создания видео AVMutableComposition

я пытаюсь объединить файлы .mp4 и .caf, поэтому я использую следующий код:

AVMutableCompositionTrack *compositionVideoTrack = 
[mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo
                            preferredTrackID:kCMPersistentTrackID_Invalid];
[compositionVideoTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, videoAsset.duration) 
                               ofTrack:[[videoAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0]
                                                                 atTime:kCMTimeZero
                                                                  error:nil]; 

но я получаю ошибку

*** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 0 beyond bounds for empty array' *** First throw call stack: (0x32c4d2a3 0x3aae397f 0x32b98b75 0x748e7 0x74e61 0x34b400c5 0x34b40077 0x34b40055 0x34b3f90b 0x34b3fe01 0x34a685f1 0x34a55801 0x34a5511b 0x367495a3 0x32c22683 0x32c21ee9 0x32c20cb7 0x32b93ebd 0x32b93d49 0x367482eb 0x34aa9301 0x6f767 0x6f708) libc++abi.dylib: terminate called throwing an exception


все требуют рамки и файл .dylib включены.


person utkal patel    schedule 12.06.2013    source источник
comment
может быть проблема из-за того, что [[videoAsset trackWithMediaType:AVMediaTypeVideo] objectAtIndex:0]... [videoAsset trackWithMediaType:AVMediaTypeVideo] может возвращать ноль. Проверить   -  person iCoder    schedule 12.06.2013


Ответы (1)


Распечатайте количество массивов. Это должен быть пустой массив, поэтому ваше приложение падает. Проверь это. NSlog(@"array count => %d",[videoAsset tracksWithMediaType:AVMediaTypeVideo]);

и замените свой код кодом ниже, чтобы предотвратить сбои.

 AVMutableCompositionTrack *compositionVideoTrack = 
    [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo
                                preferredTrackID:kCMPersistentTrackID_Invalid];
    NSArray *dataSourceArray = [NSArray arrayWithArray: [videoAsset tracksWithMediaType:AVMediaTypeVideo];
   NSlog(@"array count => %d",[dataSourceArray count]);
    [compositionVideoTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, videoAsset.duration) 
                                   ofTrack:([dataSourceArray count]>0)?[dataSourceArray objectAtIndex:0]:nil
                                                                     atTime:kCMTimeZero
                                                                      error:nil]; 
person Divyu    schedule 12.06.2013
comment
как я могу создать видео, если dataSourceArray было пустым? - person Muruganandham K; 26.12.2013
comment
@ iTroyd23 Пожалуйста, проверьте ваш видеофайл, действителен ли он? Его размер равен нулю? - person Hugo; 24.10.2014
comment
@Divyu, вы правы в том, что это должен быть пустой массив, НО в моем случае у меня есть VIDEOASSET, содержащий аудио, но я не знаю, почему я получаю пустой массив? ЕСЛИ я делаю ВИДЕО в течение 3-5 секунд, тогда я не получаю никакой ошибки, потому что массив не пуст, НО если я создаю видео, которое длится более 5, 6 секунд, и это видео также содержит АУДИО, тогда в этом случае я получаю ПУСТОЙ МАССИВ(ИНДЕКС ЗА ПРЕДЕЛАМИ) - person Ahtazaz; 09.04.2019