AVAsset "tracksWithMediaType" 返回一个空数组

Posted

技术标签:

【中文标题】AVAsset "tracksWithMediaType" 返回一个空数组【英文标题】:AVAsset "tracksWithMediaType" returns an empty array 【发布时间】:2014-10-22 13:39:13 【问题描述】:

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

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

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

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

【问题讨论】:

您是否验证过 currentAsset 实际上指向文件系统上的真实文件? @jlw 据我了解,currentAsset 获取存储在资产数组中的文件,可以在控制台中看到。对吧? 是的,但我的问题是所有 currentAsset 是否都可以通过 AVPlayer 或 MPMoviePlayer 播放。可以创建一个带有 NSURL 的 AVAsset,指向一个实际上并不保存文件的位置。 如果可以玩,请注意这个问题的答案:***.com/questions/19326728/… 你有什么解决办法吗?在我的代码中遇到同样的问题。 【参考方案1】:

你见过this link吗?

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

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

【讨论】:

以上是关于AVAsset "tracksWithMediaType" 返回一个空数组的主要内容,如果未能解决你的问题,请参考以下文章

MPMediaItem 到 AVAsset 到 .MP3

Swift 3 将数据转换为 AVAsset 或 PHAsset

为啥 AVAsset 轨道对于同一个视频文件有不同的 timeRange?

UIActivity 和 AVAsset 数据类型使用

将AVAsset视频文件拆分为块

AVAsset 的 NaturalSize 与视频文件不同