trackWithMediaType иногда возвращает 0 треков

ios objective-c iphone avaudiorecorder

711 просмотра

1 ответ

781 Репутация автора

В моем приложении я объединяю несколько .m4aаудио файлов. Для объединения аудиофайлов я использую приведенный ниже код.

CMTime nextClipStartTime = kCMTimeZero;
AVMutableComposition *composition = [[AVMutableComposition alloc] init];
AVMutableCompositionTrack *compositionAudioTrack = [composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];


for(NSString * str in filesNamesArray)
{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *path = [documentsDirectory stringByAppendingPathComponent:str];
    NSURL *url = [[NSURL alloc] initFileURLWithPath:path];

    AVAsset *avAsset = [[AVURLAsset alloc] initWithURL:url options:nil];

    NSArray *tracks = [avAsset tracksWithMediaType:AVMediaTypeAudio];
    if ([tracks count] == 0)
    {
        NSLog(@"Tracks = %lu",(unsigned long)[tracks count]);
        return;
    }
    NSLog(@"%@",avAsset);
    CMTimeRange timeRangeInAsset = CMTimeRangeMake(kCMTimeZero, [avAsset duration]);
    AVAssetTrack *clipAudioTrack = [[avAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0];
    ok = [compositionAudioTrack insertTimeRange:timeRangeInAsset  ofTrack:clipAudioTrack atTime:nextClipStartTime error:&error];
    if (!ok) {
        NSLog(@"Current Video Track Error: %@",error);
    }
    nextClipStartTime = CMTimeAdd(nextClipStartTime, timeRangeInAsset.duration);
}

Иногда «trackWithMediaType» возвращает пустой массив. Почему это происходит, и любая помощь будет принята с благодарностью.

Автор: Jaffer Sheriff Источник Размещён: 18.07.2016 02:29

Ответы (1)


1 плюс

21 Репутация автора

Когда вы создаете AVAsset с:

AVAsset *avAsset = [[AVURLAsset alloc] initWithURL:url options:nil];

ресурс должен загрузить свои треки перед тем, как будет готов к использованию:

[avAsset loadValuesAsynchronouslyForKeys:@"tracks" completionHandler: ^{
 AVKeyValueStatus status = [avAsset statusOfValueForKey:@"tracks" error:nil];
 if (status == AVKeyValueStatusLoaded) { 
     // Asset is ready now

 }
}];
Автор: Ethan Doan Размещён: 15.04.2017 05:00
Вопросы из категории :
32x32