2011-03-18 33 views
2

我試圖導入單個電影文件的兩倍(2個獨立QTMovie實例)由第二偏離二審音軌,然後將其與第一的音軌混合實例。它不混合。第一首曲目開始播放,然後停止播放,第二首曲目開始播放。當我使用2個不同內容的電影文件時,這種情況不會發生,但當我將該文件複製到不同的名稱時,它仍然會發生!我創建了一個說明該問題的簡單的示例項目:http://cl.ly/0s2U2s3S2F0Y052D2v0O/InsertTrack.zipQTKit沒有正確混合音軌

我也樂意支付解決這個問題!

回答

2

的解決方案是不是很簡單的,因爲有一些事情會在這裏:

  1. -[QTMovie insertSegmentOf(Movie|Track):timeRange:atTime:]曲目添加到一部電影,如果軌道的編碼(一個或多個)匹配那些已經存在的軌道。相反,它插入段放到現有的電影,如QuickTime播放器專業版中的「添加選擇」不(即,如果您的電影是AAAAA和插入BBB那麼你得到AAbbbAAA)。 (誠​​然,這裏的類參考文件不是很簡潔...)
  2. 不幸的是-[QTMovie insertSegmentOfTrack:fromRange:scaledToRange:]不會添加跟蹤。相反,它的行爲就像insertSegmentOfTrack:timeRange:atTime:與改變插入段的持續時間的附加的能力。

解決方法是使用-[QTMovie insertSegmentOfMovie:fromRange:scaledToRange:]

爲了您的例子,這會成爲

-(QTMovie *) composedMovie 
{ 
    NSDictionary *editableAttribute = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:QTMovieEditableAttribute]; 
    // load and prepare the base movie: 
    QTMovie *composition = [QTMovie movieWithFile:fileName error:nil]; 
    [composition setMovieAttributes:editableAttribute]; 
    // load and prepare the insertion 
    QTMovie *insertion = [QTMovie movieWithFile:insertionFileName error:nil]: 
    [insertion setMovieAttributes:editableAttribute]; 
    // as you'll probably want to avoid adding the video tracks... 
    NSArray *videoTracks = [insertion tracksOfType:QTMediaTypeVideo]; 
    for (QTTrack *track in videoTracks) { 
     [insertion removeTrack:track]; 
    } 
    // figure out the time-range 
    QTTimeRange sourceRange = QTMakeTimeRange(QTZeroTime, [insertion duration]); 
    QTTimeRange destinationRange = sourceRange; 
    destinationRange.time = QTMakeTime(1ll, 1l); // use an offset of 1 second 
    [composition insertSegmentOfMovie:insertion fromRange:sourceRange scaledToRange:destinationRange]; 
    return composition; 
} 

我知道,這是相當的東西,實際上是非常直截了當的代碼,引導加載......但這是它的工作原理:-(

+0

你的方式。一個救星下一次你在舊金山是給我發電子郵件,午餐和晚餐是我([email protected]) – richcollins 2011-03-20 22:47:34

+0

由於我住在德國,很可能將無法參加WWDC可能需要一段時間!; - ) – danyowdee 2011-03-21 08:22:27