2016-07-18 5 views
2

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

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); 
} 

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

ответ

1

При создании 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 

} 
}]; 

 Смежные вопросы

  • Нет связанных вопросов^_^