QTKit неправильно микширует звуковые дорожки - PullRequest
2 голосов
/ 18 марта 2011

Я пытаюсь импортировать один файл фильма дважды (2 отдельных экземпляра QTMovie), сместить звуковую дорожку второго экземпляра на секунду, а затем смешать ее со звуковой дорожкой первого экземпляра. Это не смешивается. Первый трек начинает воспроизводиться, а затем останавливается, а второй трек начинает воспроизводиться. Этого не происходит, когда я использую 2 файла фильма с разным содержимым, но все же это происходит, когда я копирую файл под другим именем! Я создал простой пример проекта, который иллюстрирует проблему: http://cl.ly/0s2U2s3S2F0Y052D2v0O/InsertTrack.zip

Я также рад заплатить за решение этой проблемы!

1 Ответ

2 голосов
/ 20 марта 2011

Решение не совсем простое, так как здесь происходит несколько вещей:

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

Я знаю, это довольно загруженный код для чего-то, что на самом деле довольно прямолинейно ... но так оно и работает: - (

...