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" 返回一个空数组的主要内容,如果未能解决你的问题,请参考以下文章
Swift 3 将数据转换为 AVAsset 或 PHAsset