有人點我在正確的方向,幫我調試爲什麼我的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