AVAsset“tracksWithMediaType”返回一个空数组

2024-01-02

这是我用来将视频合并在一起的方法的开始

-(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];
    }

我遇到的问题是tracksWithMediaTypecurrentAsset 的属性是一个空数组。 这是控制台

任何帮助将不胜感激。 谢谢


你见过吗这个链接 https://stackoverflow.com/questions/6242131/using-avassetreader-to-read-stream-from-a-remote-asset?

现在我正在研究一个解决方案,KVO 是轨道的关键:

[item addObserver:self forKeyPath:kTracksKey options:opts context:nil];
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AVAsset“tracksWithMediaType”返回一个空数组 的相关文章

随机推荐