2013-04-29 13 views
0

有人点我在正确的方向,帮我调试为什么我的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会议。任何帮助将不胜感激。谢谢!

+0

任何人有任何想法或建议?谢谢。 – vallete 2013-05-01 15:12:01

回答

0

貌似已经在我的桌面应用程序被导出的视频格式不正确的H.264视频。即使AVComposition对象在桌面上正确播放,AVComposition对象也没有能力正确播放它。毫不奇怪,因为Ipad希望h.264视频符合某些参数。

如果有人对IOS,可以帮助这将是巨大的调试视频问题的工具知道!