AVAsset “tracksWithMediaType” returns an empty array

余生颓废 提交于 2019-12-07 01:09:18

问题


These is the beginning o a method I am using to merge videos together

-(void) mergeVideosAndAudio:(AVAsset *)audioAsset{

    //Load Video Assets

    NSError *error;
    NSArray *dirFiles;
    if ((dirFiles = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:[self documentsDirectory] error:&error]) == nil) {
        // handle the error
    };
    // find all the temp files
    NSArray *movFiles = [dirFiles filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"self BEGINSWITH 'temp'"]];
    NSLog(@"The are %i temp files",movFiles.count);

    //Create assets array
    NSMutableArray *assets = [[NSMutableArray alloc]init];

    for (int i = 0; i < movFiles.count; i++) {
        NSString *videoURL = [[self documentsDirectory] stringByAppendingPathComponent:
                              [NSString stringWithFormat:@"temp%i.mov", i]];

        NSURL *url = [NSURL fileURLWithPath:videoURL];

        AVURLAsset *videoAsset = [AVURLAsset URLAssetWithURL:url options:nil];
        [assets addObject:videoAsset];

    }
        NSLog(@"assets:%i ", assets.count);
    // a second way
    for (id obj in assets)
        NSLog(@"obj: %@", obj);

    //Create the composition
    AVMutableComposition *mixComposition = [[AVMutableComposition alloc] init];

    // 1 - Video track
    AVMutableCompositionTrack *firstTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo
                                                                        preferredTrackID:kCMPersistentTrackID_Invalid];
    CMTime videoTrackDuration;
    for (int j = 0; j < assets.count; j++) {
        AVURLAsset *currentAsset = assets[j];
        videoTrackDuration = CMTimeAdd(videoTrackDuration, currentAsset.duration);
        CMTime time;
        if (j == 0) {
            time = kCMTimeZero;

        }else{
            AVURLAsset *previousAsset = assets[j-1];
            time = previousAsset.duration;
        }

        AVAssetTrack *assetTrack = [[currentAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];

        [firstTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, currentAsset.duration) ofTrack:assetTrack atTime:time error:nil];
    }

The problem I am having is that the tracksWithMediaType property of currentAsset is an empty array. Here is the console

Any help will be greatly appreciated. Thanks


回答1:


Have you seen this link?

I'm working on a solution now that KVO's the tracks key:

[item addObserver:self forKeyPath:kTracksKey options:opts context:nil];


来源:https://stackoverflow.com/questions/26508823/avasset-trackswithmediatype-returns-an-empty-array

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!