有人点我在正确的方向,帮我调试为什么我的IOS 6.1 AVMutuableComposition一个AVPlayerItem无法正确加载的曲目列表。IOS AVMutuableComposition曲目和调试
什么我做的是创造一个AVMutableCompositionTrack并增加时间从播放同一MP4范围吧。这对我来说已经可以正常使用其他文件,但是我有一些文件以每秒30帧的720p编码,并且不会正确创建曲目列表。我想按顺序无缝地显示它们。
下面是我的一些代码:
- (AVPlayerItem *) loadVideoByAVComposition
{
AVComposition *composition = [ self loadCompositionTracks];
AVComposition *immutableSnapshotComposition = [composition copy];
AVPlayerItem *playerItemForComposition = [[AVPlayerItem alloc]initWithAsset:immutableSnapshotComposition];
return playerItemForComposition;
}
负载曲目:
创建这些文件的帧数和视频文件的时间信息导出了-(AVMutableComposition *) loadCompositionTracks
{
AVMutableComposition *composition = [[AVMutableComposition alloc]init];
NSDictionary *optionsDictionary = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:AVURLAssetPreferPreciseDurationAndTimingKey];
AVMutableCompositionTrack *compositionVideoTrack = [composition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];
// hard coded test mp4
NSString *videoFileName = @"avi.mp4";
AVAsset *asset = [self getAVAssetByFileName:videoFileName optsDict:optionsDictionary];
if (asset == nil) { return nil; }
// add some track items
[self addTrackList:compositionVideoTrack asset:asset];
return composition;
}
我们的桌面应用程序。所以我从这些开始,并转换为秒添加到曲目列表。
-(void)addTrackList:(AVMutableCompositionTrack *)track asset:(AVAsset *)asset
{
if (track == nil) { return; }
CMTime insertionPointTime = kCMTimeZero;
// add some test track insert points
insertionPointTime = [self addTrackItems:track asset:asset start:100 duration:800 insertTime:insertionPointTime];
insertionPointTime = [self addTrackItems:track asset:asset start:1500 duration:600 insertTime:insertionPointTime];
insertionPointTime = [self addTrackItems:track asset:asset start:2500 duration:500 insertTime:insertionPointTime];
}
这里是实际添加时间到AVMutuableComposition
-(CMTime)addTrackItems:(AVMutableCompositionTrack *)track asset:(AVAsset *)asset start:(NSUInteger)start duration:(NSUInteger)duration insertTime:(CMTime)insertTime
{
if (track == nil) { return insertTime; }
NSError *videoError = nil;
Float64 secondsCalc = (start/30);
CMTime startTime = CMTimeMakeWithSeconds(secondsCalc, 600);
secondsCalc = duration/30;
CMTime cmDuration = CMTimeMakeWithSeconds(secondsCalc, 600);
CMTimeRange timeRange = CMTimeRangeMake(startTime, cmDuration);
// add video track
AVAssetTrack *clipVideoTrack = [[asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];
[track insertTimeRange:timeRange ofTrack:clipVideoTrack atTime:insertTime error:&videoError];
if (videoError != nil)
{
NSLog(@"");
NSLog(@"Error while adding track to composition");
}
// calculate for next insert point
CMTime resultInsertionPointTime = CMTimeAdd(insertTime, timeRange.duration);
return resultInsertionPointTime;
}
因此该代码可以使用一些视频文件,但他们中的一些可能加载只是第一次的歌曲,然后不调用该方法的范围其他轨道等只是得到黑帧或视频停止。基本上它不是正确地建立曲目列表。所以,我怎么能调试从负载回来任何警告或错误代码告诉我,如果TimeRanges有效等
还有没有其他好的资源了,除了苹果的文档,可以解释的加载进程。苹果文档很少。我也已经看过一些wwdc会议。任何帮助将不胜感激。谢谢!
任何人有任何想法或建议?谢谢。 – vallete 2013-05-01 15:12:01