2013-04-29 12 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,可以幫助這將是巨大的調試視頻問題的工具知道!