有人能指出我正确的方向来帮助我调试为什么ios 6.1中的AVPlayerItem的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是否有效等。
除了可以解释加载过程的Apple文档之外,还有其他任何好的资源吗?苹果文档稀少。我已经看过一些wwdc会话了。任何帮助将不胜感激。谢谢!
答案 0 :(得分:0)
看起来我的桌面应用中导出的视频格式不正确h.264视频。 AVComposition对象没有正确播放的容差,即使它在桌面上正确播放等也不足为奇。因为Ipad希望h.264视频遵守某些参数。
如果有人知道ios上的工具可以帮助调试那些很棒的视频问题!