2011-03-18 74 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