Решение не совсем простое, так как здесь происходит несколько вещей:
-[QTMovie insertSegmentOf(Movie|Track):timeRange:atTime:]
не не добавляет дорожки к фильму, если кодировка дорожки (ей) совпадает с кодировкой дорожки, которая уже присутствует. Вместо этого он вставляет сегмент в существующий фильм, как это делает «Добавить выделение» в QuickTime Player Pro (т. Е. Если ваш фильм был AAAAA и вы вставили bbb, то вы получите AAbbbAAA). (Следует признать, что ссылка на класс здесь не очень краткая…)
- К сожалению
-[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;
}
Я знаю, это довольно загруженный код для чего-то, что на самом деле довольно прямолинейно ... но так оно и работает: - (